public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Rob Clark <robdclark@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 7/9] fat/fs: move ls to generic implementation
Date: Sat,  9 Sep 2017 13:15:58 -0400	[thread overview]
Message-ID: <20170909171606.20029-8-robdclark@gmail.com> (raw)
In-Reply-To: <20170909171606.20029-1-robdclark@gmail.com>

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="windows-1254", Size: 3888 bytes --]

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>
---
 fs/fat/fat.c  | 32 --------------------------------
 fs/fs.c       | 35 +++++++++++++++++++++++++++++++++--
 include/fat.h |  5 ++++-
 3 files changed, 37 insertions(+), 35 deletions(-)

diff --git a/fs/fat/fat.c b/fs/fat/fat.c
index 82ddb7eab1..c951d84f57 100644
--- a/fs/fat/fat.c
+++ b/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;
diff --git a/fs/fs.c b/fs/fs.c
index fc0c953fcb..3481229aa6 100644
--- a/fs/fs.c
+++ b/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
diff --git a/include/fat.h b/include/fat.h
index b255ce5337..83cd90017e 100644
--- a/include/fat.h
+++ b/include/fat.h
@@ -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_ */
-- 
2.13.5


  parent reply	other threads:[~2017-09-09 17:15 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-09 17:15 [U-Boot] [PATCH v3 0/9] fs/fat: cleanups + readdir implementation Rob Clark
2017-09-09 17:15 ` [U-Boot] [PATCH v3 1/9] fs/fat: split out helper to init fsdata Rob Clark
2017-09-16  2:31   ` [U-Boot] [U-Boot, v3, " Tom Rini
2017-09-09 17:15 ` [U-Boot] [PATCH v3 2/9] fs/fat: introduce new director iterators Rob Clark
2017-09-16  2:32   ` [U-Boot] [U-Boot, v3, " Tom Rini
2017-09-09 17:15 ` [U-Boot] [PATCH v3 3/9] fat/fs: convert to directory iterators Rob Clark
2017-09-12 12:29   ` Simon Glass
2017-09-16  2:32   ` [U-Boot] [U-Boot, v3, " Tom Rini
2017-09-16 20:32     ` Adam Ford
2017-09-16 20:42       ` Rob Clark
2017-09-17 11:08         ` Adam Ford
2017-09-17 12:28           ` Rob Clark
2017-09-17 12:30             ` Rob Clark
2017-09-17 12:53           ` Rob Clark
2017-09-17 13:28             ` Tom Rini
2017-09-17 13:42             ` Adam Ford
2017-09-17 13:50               ` Rob Clark
2017-09-17 13:52                 ` Adam Ford
2017-09-09 17:15 ` [U-Boot] [PATCH v3 4/9] fs: add fs_readdir() Rob Clark
2017-09-12 12:29   ` Simon Glass
2017-09-16  2:32   ` [U-Boot] [U-Boot,v3,4/9] " Tom Rini
2017-09-09 17:15 ` [U-Boot] [PATCH v3 5/9] fs/fat: implement opendir/readdir/closedir Rob Clark
2017-09-12 12:29   ` Simon Glass
2017-09-16  2:32   ` [U-Boot] [U-Boot, v3, " Tom Rini
2017-09-09 17:15 ` [U-Boot] [PATCH v3 6/9] fat/fs: remove a bunch of dead code Rob Clark
2017-09-16  2:32   ` [U-Boot] [U-Boot,v3,6/9] " Tom Rini
2017-09-09 17:15 ` Rob Clark [this message]
2017-09-16  2:32   ` [U-Boot] [U-Boot, v3, 7/9] fat/fs: move ls to generic implementation Tom Rini
2017-09-09 17:15 ` [U-Boot] [PATCH v3 8/9] fs/fat: fix case for FAT shortnames Rob Clark
2017-09-12 12:29   ` Simon Glass
2017-09-16  2:32   ` [U-Boot] [U-Boot,v3,8/9] " Tom Rini
2017-09-09 17:16 ` [U-Boot] [PATCH v3 9/9] fs/fat: Clean up open-coded sector <-> cluster conversions Rob Clark
2017-09-12 12:29   ` Simon Glass
2017-09-16  2:32   ` [U-Boot] [U-Boot, v3, " Tom Rini
  -- strict thread matches above, loose matches on Subject: below --
2017-09-10 11:21 [U-Boot] [PATCH v2 00/21] efi_loader: enough UEFI for standard distro boot Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v3 7/9] fat/fs: move ls to generic implementation Rob Clark

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170909171606.20029-8-robdclark@gmail.com \
    --to=robdclark@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox