Re: [U-Boot] [PATCH v2 5/8] fs/fat: implement opendir/readdir/closedir
On 3 September 2017 at 00:38, Rob Clarkwrote: > Implement the readdir interface using the directory iterators. > > Signed-off-by: Rob Clark > --- > fs/fat/fat.c | 56 > 1 file changed, 56 insertions(+) > > diff --git a/fs/fat/fat.c b/fs/fat/fat.c > index 3193290434..d30ef3903b 100644 > --- a/fs/fat/fat.c > +++ b/fs/fat/fat.c > @@ -14,6 +14,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -1119,6 +1120,61 @@ int fat_read_file(const char *filename, void *buf, > loff_t offset, loff_t len, > return ret; > } > > +typedef struct { > + FS_DIR parent; > + fsdata fsdata; > + fat_itr itr; > +} fat_dir; > + Please drop the typedef. This is a really nice implementation now. ___ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot
Re: [U-Boot] [PATCH v2 5/8] fs/fat: implement opendir/readdir/closedir
On 09/02/2017 06:38 PM, Rob Clark wrote: Implement the readdir interface using the directory iterators. Reviewed-by: Łukasz MajewskiSigned-off-by: Rob Clark --- fs/fat/fat.c | 56 1 file changed, 56 insertions(+) diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 3193290434..d30ef3903b 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -1119,6 +1120,61 @@ int fat_read_file(const char *filename, void *buf, loff_t offset, loff_t len, return ret; } +typedef struct { + FS_DIR parent; + fsdata fsdata; + fat_itr itr; +} fat_dir; + +int fat_opendir(const char *filename, FS_DIR **dirp) +{ + fat_dir *dir = malloc(sizeof(*dir)); + int ret; + + if (!dir) + return -ENOMEM; + + ret = fat_itr_root(>itr, >fsdata); + if (ret) + goto fail; + + ret = fat_itr_resolve(>itr, filename, TYPE_DIR); + if (ret) + goto fail; + + *dirp = (FS_DIR *)dir; + return 0; + +fail: + free(dir); + return ret; +} + +int fat_readdir(FS_DIR *dirp) +{ + fat_dir *dir = (fat_dir *)dirp; + struct fs_dirent *dent = >dirent; + + if (!fat_itr_next(>itr)) + return -ENOENT; + + strcpy(dent->name, dir->itr.name); + if (fat_itr_isdir(>itr)) { + dent->type = FS_DT_DIR; + } else { + dent->type = FS_DT_REG; + dent->size = FAT2CPU32(dir->itr.dent->size); + } + + return 0; +} + +void fat_closedir(FS_DIR *dirp) +{ + fat_dir *dir = (fat_dir *)dirp; + free(dir); +} + void fat_close(void) { } -- Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de ___ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot
[U-Boot] [PATCH v2 5/8] fs/fat: implement opendir/readdir/closedir
Implement the readdir interface using the directory iterators. Signed-off-by: Rob Clark--- fs/fat/fat.c | 56 1 file changed, 56 insertions(+) diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 3193290434..d30ef3903b 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -1119,6 +1120,61 @@ int fat_read_file(const char *filename, void *buf, loff_t offset, loff_t len, return ret; } +typedef struct { + FS_DIR parent; + fsdata fsdata; + fat_itr itr; +} fat_dir; + +int fat_opendir(const char *filename, FS_DIR **dirp) +{ + fat_dir *dir = malloc(sizeof(*dir)); + int ret; + + if (!dir) + return -ENOMEM; + + ret = fat_itr_root(>itr, >fsdata); + if (ret) + goto fail; + + ret = fat_itr_resolve(>itr, filename, TYPE_DIR); + if (ret) + goto fail; + + *dirp = (FS_DIR *)dir; + return 0; + +fail: + free(dir); + return ret; +} + +int fat_readdir(FS_DIR *dirp) +{ + fat_dir *dir = (fat_dir *)dirp; + struct fs_dirent *dent = >dirent; + + if (!fat_itr_next(>itr)) + return -ENOENT; + + strcpy(dent->name, dir->itr.name); + if (fat_itr_isdir(>itr)) { + dent->type = FS_DT_DIR; + } else { + dent->type = FS_DT_REG; + dent->size = FAT2CPU32(dir->itr.dent->size); + } + + return 0; +} + +void fat_closedir(FS_DIR *dirp) +{ + fat_dir *dir = (fat_dir *)dirp; + free(dir); +} + void fat_close(void) { } -- 2.13.5 ___ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot
[U-Boot] [PATCH v2 5/8] fs/fat: implement opendir/readdir/closedir
Implement the readdir interface using the directory iterators. Signed-off-by: Rob Clark--- fs/fat/fat.c | 56 1 file changed, 56 insertions(+) diff --git a/fs/fat/fat.c b/fs/fat/fat.c index a50a10ba47..fe5819315b 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -1119,6 +1120,61 @@ int fat_read_file(const char *filename, void *buf, loff_t offset, loff_t len, return ret; } +typedef struct { + FS_DIR parent; + fsdata fsdata; + fat_itr itr; +} fat_dir; + +int fat_opendir(const char *filename, FS_DIR **dirp) +{ + fat_dir *dir = malloc(sizeof(*dir)); + int ret; + + if (!dir) + return -ENOMEM; + + ret = fat_itr_root(>itr, >fsdata); + if (ret) + goto fail; + + ret = fat_itr_resolve(>itr, filename, TYPE_DIR); + if (ret) + goto fail; + + *dirp = (FS_DIR *)dir; + return 0; + +fail: + free(dir); + return ret; +} + +int fat_readdir(FS_DIR *dirp) +{ + fat_dir *dir = (fat_dir *)dirp; + struct fs_dirent *dent = >dirent; + + if (!fat_itr_next(>itr)) + return -ENOENT; + + strcpy(dent->name, dir->itr.name); + if (fat_itr_isdir(>itr)) { + dent->type = FS_DT_DIR; + } else { + dent->type = FS_DT_REG; + dent->size = FAT2CPU32(dir->itr.dent->size); + } + + return 0; +} + +void fat_closedir(FS_DIR *dirp) +{ + fat_dir *dir = (fat_dir *)dirp; + free(dir); +} + void fat_close(void) { } -- 2.13.0 ___ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot