fat: implement exists() for FAT fs
authorStephen Warren <swarren@nvidia.com>
Mon, 3 Feb 2014 20:21:10 +0000 (13:21 -0700)
committerChanho Park <chanho61.park@samsung.com>
Thu, 6 Aug 2015 05:57:18 +0000 (14:57 +0900)
This hooks into the generic "file exists" support added in an earlier
patch, and provides an implementation for the FAT filesystem.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Simon Glass <sjg@chromium.org>
fs/fat/fat.c
fs/fs.c
include/fat.h

index b0fac5e1ed681b9dfb75b517a9d28f459d5d100c..4bd4a91fd1e76e3f65cc09f9207f990aeef6f834 100644 (file)
@@ -824,7 +824,7 @@ __u8 do_fat_read_at_block[MAX_CLUSTSIZE]
 
 long
 do_fat_read_at(const char *filename, unsigned long pos, void *buffer,
-              unsigned long maxsize, int dols)
+              unsigned long maxsize, int dols, int dogetsize)
 {
        char fnamecopy[2048];
        boot_sector bs;
@@ -1168,7 +1168,10 @@ rootdir_done:
                        subname = nextname;
        }
 
-       ret = get_contents(mydata, dentptr, pos, buffer, maxsize);
+       if (dogetsize)
+               ret = FAT2CPU32(dentptr->size);
+       else
+               ret = get_contents(mydata, dentptr, pos, buffer, maxsize);
        debug("Size: %d, got: %ld\n", FAT2CPU32(dentptr->size), ret);
 
 exit:
@@ -1179,7 +1182,7 @@ exit:
 long
 do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols)
 {
-       return do_fat_read_at(filename, 0, buffer, maxsize, dols);
+       return do_fat_read_at(filename, 0, buffer, maxsize, dols, 0);
 }
 
 int file_fat_detectfs(void)
@@ -1249,11 +1252,18 @@ int file_fat_ls(const char *dir)
        return do_fat_read(dir, NULL, 0, LS_YES);
 }
 
+int fat_exists(const char *filename)
+{
+       int sz;
+       sz = do_fat_read_at(filename, 0, NULL, 0, LS_NO, 1);
+       return sz >= 0;
+}
+
 long file_fat_read_at(const char *filename, unsigned long pos, void *buffer,
                      unsigned long maxsize)
 {
        printf("reading %s\n", filename);
-       return do_fat_read_at(filename, pos, buffer, maxsize, LS_NO);
+       return do_fat_read_at(filename, pos, buffer, maxsize, LS_NO, 0);
 }
 
 long file_fat_read(const char *filename, void *buffer, unsigned long maxsize)
diff --git a/fs/fs.c b/fs/fs.c
index 0efeb1ae26d5eef6d102af44adb71abe92d9c8f0..acd3eb58a33dba08afe3c1b2bbc69ade108a2027 100644 (file)
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -90,7 +90,7 @@ static struct fstype_info fstypes[] = {
                .probe = fat_set_blk_dev,
                .close = fat_close,
                .ls = file_fat_ls,
-               .exists = fs_exists_unsupported,
+               .exists = fat_exists,
                .read = fat_read_file,
                .write = fs_write_unsupported,
        },
index 78e4b090eacbf4671e310b7bd3079717327576b4..b5a6969c0c2afff3697621e5e596cc3d9d0e78f5 100644 (file)
@@ -294,6 +294,7 @@ file_read_func              file_fat_read;
 int file_cd(const char *path);
 int file_fat_detectfs(void);
 int file_fat_ls(const char *dir);
+int fat_exists(const char *filename);
 long file_fat_read_at(const char *filename, unsigned long pos, void *buffer,
                      unsigned long maxsize);
 long file_fat_read(const char *filename, void *buffer, unsigned long maxsize);