[U-Boot] [PATCH v2 5/8] fs/fat: implement opendir/readdir/closedir
Łukasz Majewski
lukma at denx.de
Sun Sep 3 15:17:25 UTC 2017
On 09/02/2017 06:38 PM, Rob Clark wrote:
> Implement the readdir interface using the directory iterators.
>
Reviewed-by: Łukasz Majewski <lukma at denx.de>
> Signed-off-by: Rob Clark <robdclark at gmail.com>
> ---
> 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 <config.h>
> #include <exports.h>
> #include <fat.h>
> +#include <fs.h>
> #include <asm/byteorder.h>
> #include <part.h>
> #include <malloc.h>
> @@ -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(&dir->itr, &dir->fsdata);
> + if (ret)
> + goto fail;
> +
> + ret = fat_itr_resolve(&dir->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 = &dirp->dirent;
> +
> + if (!fat_itr_next(&dir->itr))
> + return -ENOENT;
> +
> + strcpy(dent->name, dir->itr.name);
> + if (fat_itr_isdir(&dir->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: wd at denx.de
More information about the U-Boot
mailing list