mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-17 12:41:32 +00:00
fat/fs: move ls to generic implementation
Add a generic implementation of 'ls' using opendir/readdir/closedir, and replace fat's custom implementation. Other filesystems should move to the generic implementation after they add opendir/readdir/closedir support. Signed-off-by: Rob Clark <robdclark@gmail.com> Reviewed-by: Łukasz Majewski <lukma@denx.de> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
41fa83d1a6
commit
89191d6267
3 changed files with 37 additions and 35 deletions
32
fs/fat/fat.c
32
fs/fat/fat.c
|
@ -1029,38 +1029,6 @@ int file_fat_detectfs(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int file_fat_ls(const char *dir)
|
||||
{
|
||||
fsdata fsdata;
|
||||
fat_itr itrblock, *itr = &itrblock;
|
||||
int files = 0, dirs = 0;
|
||||
int ret;
|
||||
|
||||
ret = fat_itr_root(itr, &fsdata);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = fat_itr_resolve(itr, dir, TYPE_DIR);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
while (fat_itr_next(itr)) {
|
||||
if (fat_itr_isdir(itr)) {
|
||||
printf(" %s/\n", itr->name);
|
||||
dirs++;
|
||||
} else {
|
||||
printf(" %8u %s\n",
|
||||
FAT2CPU32(itr->dent->size),
|
||||
itr->name);
|
||||
files++;
|
||||
}
|
||||
}
|
||||
|
||||
printf("\n%d file(s), %d dir(s)\n\n", files, dirs);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fat_exists(const char *filename)
|
||||
{
|
||||
fsdata fsdata;
|
||||
|
|
35
fs/fs.c
35
fs/fs.c
|
@ -37,6 +37,35 @@ static inline int fs_ls_unsupported(const char *dirname)
|
|||
return -1;
|
||||
}
|
||||
|
||||
/* generic implementation of ls in terms of opendir/readdir/closedir */
|
||||
__maybe_unused
|
||||
static int fs_ls_generic(const char *dirname)
|
||||
{
|
||||
struct fs_dir_stream *dirs;
|
||||
struct fs_dirent *dent;
|
||||
int nfiles = 0, ndirs = 0;
|
||||
|
||||
dirs = fs_opendir(dirname);
|
||||
if (!dirs)
|
||||
return -errno;
|
||||
|
||||
while ((dent = fs_readdir(dirs))) {
|
||||
if (dent->type == FS_DT_DIR) {
|
||||
printf(" %s/\n", dent->name);
|
||||
ndirs++;
|
||||
} else {
|
||||
printf(" %8lld %s\n", dent->size, dent->name);
|
||||
nfiles++;
|
||||
}
|
||||
}
|
||||
|
||||
fs_closedir(dirs);
|
||||
|
||||
printf("\n%d file(s), %d dir(s)\n\n", nfiles, ndirs);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int fs_exists_unsupported(const char *filename)
|
||||
{
|
||||
return 0;
|
||||
|
@ -123,7 +152,7 @@ static struct fstype_info fstypes[] = {
|
|||
.null_dev_desc_ok = false,
|
||||
.probe = fat_set_blk_dev,
|
||||
.close = fat_close,
|
||||
.ls = file_fat_ls,
|
||||
.ls = fs_ls_generic,
|
||||
.exists = fat_exists,
|
||||
.size = fat_size,
|
||||
.read = fat_read_file,
|
||||
|
@ -133,7 +162,9 @@ static struct fstype_info fstypes[] = {
|
|||
.write = fs_write_unsupported,
|
||||
#endif
|
||||
.uuid = fs_uuid_unsupported,
|
||||
.opendir = fs_opendir_unsupported,
|
||||
.opendir = fat_opendir,
|
||||
.readdir = fat_readdir,
|
||||
.closedir = fat_closedir,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_FS_EXT4
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#define _FAT_H_
|
||||
|
||||
#include <asm/byteorder.h>
|
||||
#include <fs.h>
|
||||
|
||||
#define CONFIG_SUPPORT_VFAT
|
||||
/* Maximum Long File Name length supported here is 128 UTF-16 code units */
|
||||
|
@ -179,7 +180,6 @@ static inline u32 clust_to_sect(fsdata *fsdata, u32 clust)
|
|||
}
|
||||
|
||||
int file_fat_detectfs(void);
|
||||
int file_fat_ls(const char *dir);
|
||||
int fat_exists(const char *filename);
|
||||
int fat_size(const char *filename, loff_t *size);
|
||||
int file_fat_read_at(const char *filename, loff_t pos, void *buffer,
|
||||
|
@ -192,5 +192,8 @@ int file_fat_write(const char *filename, void *buf, loff_t offset, loff_t len,
|
|||
loff_t *actwrite);
|
||||
int fat_read_file(const char *filename, void *buf, loff_t offset, loff_t len,
|
||||
loff_t *actread);
|
||||
int fat_opendir(const char *filename, struct fs_dir_stream **dirsp);
|
||||
int fat_readdir(struct fs_dir_stream *dirs, struct fs_dirent **dentp);
|
||||
void fat_closedir(struct fs_dir_stream *dirs);
|
||||
void fat_close(void);
|
||||
#endif /* _FAT_H_ */
|
||||
|
|
Loading…
Add table
Reference in a new issue