mirror of
https://github.com/linux-sunxi/u-boot-sunxi.git
synced 2024-02-12 11:16:03 +08: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:
32
fs/fat/fat.c
32
fs/fat/fat.c
@ -1029,38 +1029,6 @@ int file_fat_detectfs(void)
|
|||||||
return 0;
|
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)
|
int fat_exists(const char *filename)
|
||||||
{
|
{
|
||||||
fsdata fsdata;
|
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;
|
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)
|
static inline int fs_exists_unsupported(const char *filename)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -123,7 +152,7 @@ static struct fstype_info fstypes[] = {
|
|||||||
.null_dev_desc_ok = false,
|
.null_dev_desc_ok = false,
|
||||||
.probe = fat_set_blk_dev,
|
.probe = fat_set_blk_dev,
|
||||||
.close = fat_close,
|
.close = fat_close,
|
||||||
.ls = file_fat_ls,
|
.ls = fs_ls_generic,
|
||||||
.exists = fat_exists,
|
.exists = fat_exists,
|
||||||
.size = fat_size,
|
.size = fat_size,
|
||||||
.read = fat_read_file,
|
.read = fat_read_file,
|
||||||
@ -133,7 +162,9 @@ static struct fstype_info fstypes[] = {
|
|||||||
.write = fs_write_unsupported,
|
.write = fs_write_unsupported,
|
||||||
#endif
|
#endif
|
||||||
.uuid = fs_uuid_unsupported,
|
.uuid = fs_uuid_unsupported,
|
||||||
.opendir = fs_opendir_unsupported,
|
.opendir = fat_opendir,
|
||||||
|
.readdir = fat_readdir,
|
||||||
|
.closedir = fat_closedir,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_FS_EXT4
|
#ifdef CONFIG_FS_EXT4
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#define _FAT_H_
|
#define _FAT_H_
|
||||||
|
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
|
#include <fs.h>
|
||||||
|
|
||||||
#define CONFIG_SUPPORT_VFAT
|
#define CONFIG_SUPPORT_VFAT
|
||||||
/* Maximum Long File Name length supported here is 128 UTF-16 code units */
|
/* 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_detectfs(void);
|
||||||
int file_fat_ls(const char *dir);
|
|
||||||
int fat_exists(const char *filename);
|
int fat_exists(const char *filename);
|
||||||
int fat_size(const char *filename, loff_t *size);
|
int fat_size(const char *filename, loff_t *size);
|
||||||
int file_fat_read_at(const char *filename, loff_t pos, void *buffer,
|
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);
|
loff_t *actwrite);
|
||||||
int fat_read_file(const char *filename, void *buf, loff_t offset, loff_t len,
|
int fat_read_file(const char *filename, void *buf, loff_t offset, loff_t len,
|
||||||
loff_t *actread);
|
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);
|
void fat_close(void);
|
||||||
#endif /* _FAT_H_ */
|
#endif /* _FAT_H_ */
|
||||||
|
Reference in New Issue
Block a user