[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