diff mbox series

[v2,28/28] fs/squashfs: implement exists() function

Message ID 20201103111126.23600-29-richard.genoud@posteo.net
State Accepted
Commit dd4866b43754b18f0c06672e341d93e16b8bf674
Delegated to: Tom Rini
Headers show
Series fs/squashfs: fix memory leaks and introduce exists() function | expand

Commit Message

Richard Genoud Nov. 3, 2020, 11:11 a.m. UTC
This permits to find a file and use the distro_bootcmd

Signed-off-by: Richard Genoud <richard.genoud@posteo.net>
---
 fs/fs.c            |  2 +-
 fs/squashfs/sqfs.c | 38 ++++++++++++++++++++++++++++++++++++++
 include/squashfs.h |  1 +
 3 files changed, 40 insertions(+), 1 deletion(-)

Comments

João Marcos Costa Nov. 3, 2020, 12:48 p.m. UTC | #1
Reviewed-by Joao Marcos Costa <jmcosta944@gmail.com>

Em ter., 3 de nov. de 2020 às 08:12, Richard Genoud <
richard.genoud@posteo.net> escreveu:

> This permits to find a file and use the distro_bootcmd
>
> Signed-off-by: Richard Genoud <richard.genoud@posteo.net>
> ---
>  fs/fs.c            |  2 +-
>  fs/squashfs/sqfs.c | 38 ++++++++++++++++++++++++++++++++++++++
>  include/squashfs.h |  1 +
>  3 files changed, 40 insertions(+), 1 deletion(-)
>
> diff --git a/fs/fs.c b/fs/fs.c
> index fb27c910d4f..7a4020607a3 100644
> --- a/fs/fs.c
> +++ b/fs/fs.c
> @@ -296,7 +296,7 @@ static struct fstype_info fstypes[] = {
>                 .size = sqfs_size,
>                 .close = sqfs_close,
>                 .closedir = sqfs_closedir,
> -               .exists = fs_exists_unsupported,
> +               .exists = sqfs_exists,
>                 .uuid = fs_uuid_unsupported,
>                 .write = fs_write_unsupported,
>                 .ln = fs_ln_unsupported,
> diff --git a/fs/squashfs/sqfs.c b/fs/squashfs/sqfs.c
> index a96c1d4f564..c8e8d682cd4 100644
> --- a/fs/squashfs/sqfs.c
> +++ b/fs/squashfs/sqfs.c
> @@ -1657,6 +1657,44 @@ free_strings:
>         return ret;
>  }
>
> +int sqfs_exists(const char *filename)
> +{
> +       struct fs_dir_stream *dirsp = NULL;
> +       struct squashfs_dir_stream *dirs;
> +       char *dir, *file;
> +       struct fs_dirent *dent;
> +       int ret;
> +
> +       sqfs_split_path(&file, &dir, filename);
> +       /*
> +        * sqfs_opendir will uncompress inode and directory tables, and
> will
> +        * return a pointer to the directory that contains the requested
> file.
> +        */
> +       ret = sqfs_opendir(dir, &dirsp);
> +       if (ret) {
> +               ret = -EINVAL;
> +               goto free_strings;
> +       }
> +
> +       dirs = (struct squashfs_dir_stream *)dirsp;
> +
> +       while (!sqfs_readdir(dirsp, &dent)) {
> +               ret = strcmp(dent->name, file);
> +               if (!ret)
> +                       break;
> +               free(dirs->entry);
> +               dirs->entry = NULL;
> +       }
> +
> +       sqfs_closedir(dirsp);
> +
> +free_strings:
> +       free(dir);
> +       free(file);
> +
> +       return ret == 0;
> +}
> +
>  void sqfs_close(void)
>  {
>         free(ctxt.sblk);
> diff --git a/include/squashfs.h b/include/squashfs.h
> index 819cf8c2da8..7489eefa1f2 100644
> --- a/include/squashfs.h
> +++ b/include/squashfs.h
> @@ -19,6 +19,7 @@ int sqfs_probe(struct blk_desc *fs_dev_desc,
>  int sqfs_read(const char *filename, void *buf, loff_t offset,
>               loff_t len, loff_t *actread);
>  int sqfs_size(const char *filename, loff_t *size);
> +int sqfs_exists(const char *filename);
>  void sqfs_close(void);
>  void sqfs_closedir(struct fs_dir_stream *dirs);
>
>
Tom Rini Nov. 20, 2020, 1:38 a.m. UTC | #2
On Tue, Nov 03, 2020 at 12:11:26PM +0100, Richard Genoud wrote:

> This permits to find a file and use the distro_bootcmd
> 
> Reviewed-by: Joao Marcos Costa <jmcosta944@gmail.com>
> Signed-off-by: Richard Genoud <richard.genoud@posteo.net>

Applied to u-boot/master, thanks!
diff mbox series

Patch

diff --git a/fs/fs.c b/fs/fs.c
index fb27c910d4f..7a4020607a3 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -296,7 +296,7 @@  static struct fstype_info fstypes[] = {
 		.size = sqfs_size,
 		.close = sqfs_close,
 		.closedir = sqfs_closedir,
-		.exists = fs_exists_unsupported,
+		.exists = sqfs_exists,
 		.uuid = fs_uuid_unsupported,
 		.write = fs_write_unsupported,
 		.ln = fs_ln_unsupported,
diff --git a/fs/squashfs/sqfs.c b/fs/squashfs/sqfs.c
index a96c1d4f564..c8e8d682cd4 100644
--- a/fs/squashfs/sqfs.c
+++ b/fs/squashfs/sqfs.c
@@ -1657,6 +1657,44 @@  free_strings:
 	return ret;
 }
 
+int sqfs_exists(const char *filename)
+{
+	struct fs_dir_stream *dirsp = NULL;
+	struct squashfs_dir_stream *dirs;
+	char *dir, *file;
+	struct fs_dirent *dent;
+	int ret;
+
+	sqfs_split_path(&file, &dir, filename);
+	/*
+	 * sqfs_opendir will uncompress inode and directory tables, and will
+	 * return a pointer to the directory that contains the requested file.
+	 */
+	ret = sqfs_opendir(dir, &dirsp);
+	if (ret) {
+		ret = -EINVAL;
+		goto free_strings;
+	}
+
+	dirs = (struct squashfs_dir_stream *)dirsp;
+
+	while (!sqfs_readdir(dirsp, &dent)) {
+		ret = strcmp(dent->name, file);
+		if (!ret)
+			break;
+		free(dirs->entry);
+		dirs->entry = NULL;
+	}
+
+	sqfs_closedir(dirsp);
+
+free_strings:
+	free(dir);
+	free(file);
+
+	return ret == 0;
+}
+
 void sqfs_close(void)
 {
 	free(ctxt.sblk);
diff --git a/include/squashfs.h b/include/squashfs.h
index 819cf8c2da8..7489eefa1f2 100644
--- a/include/squashfs.h
+++ b/include/squashfs.h
@@ -19,6 +19,7 @@  int sqfs_probe(struct blk_desc *fs_dev_desc,
 int sqfs_read(const char *filename, void *buf, loff_t offset,
 	      loff_t len, loff_t *actread);
 int sqfs_size(const char *filename, loff_t *size);
+int sqfs_exists(const char *filename);
 void sqfs_close(void);
 void sqfs_closedir(struct fs_dir_stream *dirs);