Skip to content
Snippets Groups Projects
Select Git revision
  • 1808b2e8d5c9fff8020628a7849a537ffa9790e3
  • wip-bootstrap default
  • dualcore
  • ch3/leds
  • ch3/time
  • master
6 results

vfs_fat_misc.c

Blame
  • vfs_fat_misc.c 3.90 KiB
    /*
     * This file is part of the MicroPython project, http://micropython.org/
     *
     * The MIT License (MIT)
     *
     * Copyright (c) 2014 Damien P. George
     *
     * Permission is hereby granted, free of charge, to any person obtaining a copy
     * of this software and associated documentation files (the "Software"), to deal
     * in the Software without restriction, including without limitation the rights
     * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     * copies of the Software, and to permit persons to whom the Software is
     * furnished to do so, subject to the following conditions:
     *
     * The above copyright notice and this permission notice shall be included in
     * all copies or substantial portions of the Software.
     *
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     * THE SOFTWARE.
     */
    
    #include "py/mpconfig.h"
    #if MICROPY_VFS_FAT
    
    #include <string.h>
    #include "py/nlr.h"
    #include "py/runtime.h"
    #if MICROPY_FATFS_OO
    #include "lib/oofatfs/ff.h"
    #else
    #include "lib/fatfs/ff.h"
    #endif
    #include "extmod/vfs_fat.h"
    #include "extmod/fsusermount.h"
    #include "py/lexer.h"
    
    #if !MICROPY_FATFS_OO && _USE_LFN
    STATIC char lfn[_MAX_LFN + 1];   /* Buffer to store the LFN */
    #endif
    
    // TODO: actually, the core function should be ilistdir()
    
    mp_obj_t fat_vfs_listdir(const char *path, bool is_str_type) {
        return fat_vfs_listdir2(NULL, path, is_str_type);
    }
    
    mp_obj_t fat_vfs_listdir2(fs_user_mount_t *vfs, const char *path, bool is_str_type) {
        FRESULT res;
        FILINFO fno;
        FF_DIR dir;
    #if !MICROPY_FATFS_OO && _USE_LFN
        fno.lfname = lfn;
        fno.lfsize = sizeof lfn;
    #endif
    
        #if MICROPY_FATFS_OO
        res = f_opendir(&vfs->fatfs, &dir, path);
        #else
        res = f_opendir(&dir, path);                       /* Open the directory */
        #endif
        if (res != FR_OK) {
            mp_raise_OSError(fresult_to_errno_table[res]);
        }
    
        mp_obj_t dir_list = mp_obj_new_list(0, NULL);
    
        for (;;) {
            res = f_readdir(&dir, &fno);                   /* Read a directory item */
            if (res != FR_OK || fno.fname[0] == 0) break;  /* Break on error or end of dir */
            if (fno.fname[0] == '.' && fno.fname[1] == 0) continue;             /* Ignore . entry */
            if (fno.fname[0] == '.' && fno.fname[1] == '.' && fno.fname[2] == 0) continue;             /* Ignore .. entry */
    
    #if !MICROPY_FATFS_OO && _USE_LFN
            char *fn = *fno.lfname ? fno.lfname : fno.fname;
    #else
            char *fn = fno.fname;
    #endif
    
            /*
            if (fno.fattrib & AM_DIR) {
                // dir
            } else {
                // file
            }
            */
    
            // make a string object for this entry
            mp_obj_t entry_o;
            if (is_str_type) {
                entry_o = mp_obj_new_str(fn, strlen(fn), false);
            } else {
                entry_o = mp_obj_new_bytes((const byte*)fn, strlen(fn));
            }
    
            // add the entry to the list
            mp_obj_list_append(dir_list, entry_o);
        }
    
        f_closedir(&dir);
    
        return dir_list;
    }
    
    mp_import_stat_t fat_vfs_import_stat(fs_user_mount_t *vfs, const char *path) {
        FILINFO fno;
    #if !MICROPY_FATFS_OO && _USE_LFN
        fno.lfname = NULL;
        fno.lfsize = 0;
    #endif
        #if MICROPY_FATFS_OO
        assert(vfs != NULL);
        FRESULT res = f_stat(&vfs->fatfs, path, &fno);
        #else
        (void)vfs;
        FRESULT res = f_stat(path, &fno);
        #endif
        if (res == FR_OK) {
            if ((fno.fattrib & AM_DIR) != 0) {
                return MP_IMPORT_STAT_DIR;
            } else {
                return MP_IMPORT_STAT_FILE;
            }
        }
        return MP_IMPORT_STAT_NO_EXIST;
    }
    
    #endif // MICROPY_VFS_FAT