* [PATCH v5 0/6] More ls improvements
@ 2025-03-01 7:50 Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 1/6] commands/ls: Return proper GRUB_ERR_* for functions returning type grub_err_t Glenn Washburn
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Glenn Washburn @ 2025-03-01 7:50 UTC (permalink / raw)
To: grub-devel, Daniel Kiper; +Cc: Vladimir Serbinenko, Glenn Washburn
Considering Daniel's feedback on the v2 of this patch series, I've broken up
patches #1 and #2 and dropped patch #3 from the original series. These changes
make the output of the ls command a little more like the GNU ls output.
Glenn Washburn
v5:
* Rebase onto current master
* Change ctx->filename to pathname != NULL in tertiary conditional in patch 5
v4: Add missing parenthesis
Glenn Washburn (6):
commands/ls: Return proper GRUB_ERR_* for functions returning type
grub_err_t
commands/ls: Merge print_files_long and print_files into print_file
commands/ls: Show modification time for file paths
commands/ls: Output path for single file arguments given with path
commands/ls: Print full paths for file args
commands/ls: Add directory header for dir args
grub-core/commands/ls.c | 97 ++++++++++++++++++++---------------------
1 file changed, 48 insertions(+), 49 deletions(-)
Range-diff against v4:
1: 9086cccd8a0f = 1: b89e1b373694 commands/ls: Return proper GRUB_ERR_* for functions returning type grub_err_t
2: 3192dc2471d0 = 2: 6cb474ddb291 commands/ls: Merge print_files_long and print_files into print_file
3: 889e1e05a355 ! 3: fe84e5952a0c commands/ls: Show modification time for file paths
@@ grub-core/commands/ls.c: grub_ls_list_files (char *dirname, int longlist, int al
- grub_file_close (file);
-
-- p = grub_strrchr (dirname, '/') + 1;
-- ctx.dirname = grub_strndup (dirname, p - dirname);
+- p = grub_strrchr (dirname, '/');
+- if (p == NULL)
+ /* PATH might be a regular file. */
-+ ctx.filename = grub_strrchr (dirname, '/') + 1;
++ ctx.filename = grub_strrchr (dirname, '/');
++ if (ctx.filename == NULL)
+ goto fail;
+- ++p;
++ ++(ctx.filename);
+
+- ctx.dirname = grub_strndup (dirname, p - dirname);
+ ctx.dirname = grub_strndup (dirname, ctx.filename - dirname);
if (ctx.dirname == NULL)
goto fail;
4: d63e007f635b = 4: 0a6e6c6d5c1e commands/ls: Output path for single file arguments given with path
5: 39adcb21e320 ! 5: 3637f8bd2c1f commands/ls: Print full paths for file args
@@ grub-core/commands/ls.c: print_file (const char *filename, const struct grub_dir
datetime.minute, datetime.second);
}
- grub_printf ("%s%s\n", filename, info->dir ? "/" : "");
-+ grub_printf ("%s%s\n", (ctx->filename) ? pathname : filename,
++ grub_printf ("%s%s\n", (pathname != NULL) ? pathname : filename,
+ info->dir ? "/" : "");
+
+ grub_free (pathname);
6: 0ebbfd3b0e15 ! 6: 44bbd467b424 commands/ls: Add directory header for dir args
@@ grub-core/commands/ls.c: grub_ls_list_files (char *dirname, int longlist, int al
/* PATH might be a regular file. */
+ ctx.print_dirhdr = 0;
- ctx.filename = grub_strrchr (dirname, '/') + 1;
- ctx.dirname = grub_strndup (dirname, ctx.filename - dirname);
- if (ctx.dirname == NULL)
+ ctx.filename = grub_strrchr (dirname, '/');
+ if (ctx.filename == NULL)
+ goto fail;
@@ grub-core/commands/ls.c: grub_cmd_ls (grub_extcmd_context_t ctxt, int argc, char **args)
grub_ls_list_devices (state[0].set);
else
--
2.34.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v5 1/6] commands/ls: Return proper GRUB_ERR_* for functions returning type grub_err_t
2025-03-01 7:50 [PATCH v5 0/6] More ls improvements Glenn Washburn
@ 2025-03-01 7:50 ` Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 2/6] commands/ls: Merge print_files_long and print_files into print_file Glenn Washburn
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Glenn Washburn @ 2025-03-01 7:50 UTC (permalink / raw)
To: grub-devel, Daniel Kiper; +Cc: Vladimir Serbinenko, Glenn Washburn
Also, remove unused code.
Signed-off-by: Glenn Washburn <development@efficientek.com>
---
grub-core/commands/ls.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/grub-core/commands/ls.c b/grub-core/commands/ls.c
index f660946a24e4..65b17768b605 100644
--- a/grub-core/commands/ls.c
+++ b/grub-core/commands/ls.c
@@ -250,7 +250,6 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
if (ctx.dirname == NULL)
goto fail;
- all = 1;
grub_memset (&info, 0, sizeof (info));
if (longlist)
print_files_long (p, &info, &ctx);
@@ -272,7 +271,7 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
grub_free (device_name);
- return 0;
+ return GRUB_ERR_NONE;
}
static grub_err_t
@@ -288,7 +287,7 @@ grub_cmd_ls (grub_extcmd_context_t ctxt, int argc, char **args)
grub_ls_list_files (args[i], state[0].set, state[2].set,
state[1].set);
- return 0;
+ return GRUB_ERR_NONE;
}
static grub_extcmd_t cmd;
--
2.34.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 2/6] commands/ls: Merge print_files_long and print_files into print_file
2025-03-01 7:50 [PATCH v5 0/6] More ls improvements Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 1/6] commands/ls: Return proper GRUB_ERR_* for functions returning type grub_err_t Glenn Washburn
@ 2025-03-01 7:50 ` Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 3/6] commands/ls: Show modification time for file paths Glenn Washburn
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Glenn Washburn @ 2025-03-01 7:50 UTC (permalink / raw)
To: grub-devel, Daniel Kiper; +Cc: Vladimir Serbinenko, Glenn Washburn
Simplify the code by removing logic around which file printer to call.
Signed-off-by: Glenn Washburn <development@efficientek.com>
---
grub-core/commands/ls.c | 35 ++++++++++++-----------------------
1 file changed, 12 insertions(+), 23 deletions(-)
diff --git a/grub-core/commands/ls.c b/grub-core/commands/ls.c
index 65b17768b605..2eaefaf9027a 100644
--- a/grub-core/commands/ls.c
+++ b/grub-core/commands/ls.c
@@ -89,24 +89,12 @@ struct grub_ls_list_files_ctx
char *dirname;
int all;
int human;
+ int longlist;
};
/* Helper for grub_ls_list_files. */
static int
-print_files (const char *filename, const struct grub_dirhook_info *info,
- void *data)
-{
- struct grub_ls_list_files_ctx *ctx = data;
-
- if (ctx->all || filename[0] != '.')
- grub_printf ("%s%s ", filename, info->dir ? "/" : "");
-
- return 0;
-}
-
-/* Helper for grub_ls_list_files. */
-static int
-print_files_long (const char *filename, const struct grub_dirhook_info *info,
+print_file (const char *filename, const struct grub_dirhook_info *info,
void *data)
{
struct grub_ls_list_files_ctx *ctx = data;
@@ -114,6 +102,12 @@ print_files_long (const char *filename, const struct grub_dirhook_info *info,
if ((! ctx->all) && (filename[0] == '.'))
return 0;
+ if (! ctx->longlist)
+ {
+ grub_printf ("%s%s ", filename, info->dir ? "/" : "");
+ return 0;
+ }
+
if (! info->dir)
{
grub_file_t file;
@@ -217,13 +211,11 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
struct grub_ls_list_files_ctx ctx = {
.dirname = dirname,
.all = all,
- .human = human
+ .human = human,
+ .longlist = longlist
};
- if (longlist)
- (fs->fs_dir) (dev, path, print_files_long, &ctx);
- else
- (fs->fs_dir) (dev, path, print_files, &ctx);
+ (fs->fs_dir) (dev, path, print_file, &ctx);
if (grub_errno == GRUB_ERR_BAD_FILE_TYPE
&& path[grub_strlen (path) - 1] != '/')
@@ -251,10 +243,7 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
goto fail;
grub_memset (&info, 0, sizeof (info));
- if (longlist)
- print_files_long (p, &info, &ctx);
- else
- print_files (p, &info, &ctx);
+ print_file (p, &info, &ctx);
grub_free (ctx.dirname);
}
--
2.34.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 3/6] commands/ls: Show modification time for file paths
2025-03-01 7:50 [PATCH v5 0/6] More ls improvements Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 1/6] commands/ls: Return proper GRUB_ERR_* for functions returning type grub_err_t Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 2/6] commands/ls: Merge print_files_long and print_files into print_file Glenn Washburn
@ 2025-03-01 7:50 ` Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 4/6] commands/ls: Output path for single file arguments given with path Glenn Washburn
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Glenn Washburn @ 2025-03-01 7:50 UTC (permalink / raw)
To: grub-devel, Daniel Kiper; +Cc: Vladimir Serbinenko, Glenn Washburn
The modification time for paths to files was not being printed because
the grub_dirhook_info, which contains the mtime, was initialized to NULL.
Instead of calling print_file() directly, use fs->fs_dir() to call
print_file() with a properly filled in grub_dirhook_info. This has the
added benefit of reducing code complexity.
Signed-off-by: Glenn Washburn <development@efficientek.com>
---
grub-core/commands/ls.c | 34 ++++++++++++++++------------------
1 file changed, 16 insertions(+), 18 deletions(-)
diff --git a/grub-core/commands/ls.c b/grub-core/commands/ls.c
index 2eaefaf9027a..1b447acf7c34 100644
--- a/grub-core/commands/ls.c
+++ b/grub-core/commands/ls.c
@@ -87,6 +87,7 @@ grub_ls_list_devices (int longlist)
struct grub_ls_list_files_ctx
{
char *dirname;
+ char *filename;
int all;
int human;
int longlist;
@@ -102,6 +103,9 @@ print_file (const char *filename, const struct grub_dirhook_info *info,
if ((! ctx->all) && (filename[0] == '.'))
return 0;
+ if ((ctx->filename != NULL) && (grub_strcmp (filename, ctx->filename) != 0))
+ return 0;
+
if (! ctx->longlist)
{
grub_printf ("%s%s ", filename, info->dir ? "/" : "");
@@ -210,6 +214,7 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
{
struct grub_ls_list_files_ctx ctx = {
.dirname = dirname,
+ .filename = NULL,
.all = all,
.human = human,
.longlist = longlist
@@ -220,30 +225,23 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
if (grub_errno == GRUB_ERR_BAD_FILE_TYPE
&& path[grub_strlen (path) - 1] != '/')
{
- /* PATH might be a regular file. */
- char *p;
- grub_file_t file;
- struct grub_dirhook_info info;
- grub_errno = 0;
-
- file = grub_file_open (dirname, GRUB_FILE_TYPE_GET_SIZE
- | GRUB_FILE_TYPE_NO_DECOMPRESS);
- if (! file)
- goto fail;
+ /*
+ * Reset errno as it is currently set, but will cause subsequent code
+ * to think there is an error.
+ */
+ grub_errno = GRUB_ERR_NONE;
- grub_file_close (file);
-
- p = grub_strrchr (dirname, '/');
- if (p == NULL)
+ /* PATH might be a regular file. */
+ ctx.filename = grub_strrchr (dirname, '/');
+ if (ctx.filename == NULL)
goto fail;
- ++p;
+ ++(ctx.filename);
- ctx.dirname = grub_strndup (dirname, p - dirname);
+ ctx.dirname = grub_strndup (dirname, ctx.filename - dirname);
if (ctx.dirname == NULL)
goto fail;
- grub_memset (&info, 0, sizeof (info));
- print_file (p, &info, &ctx);
+ (fs->fs_dir) (dev, ctx.dirname + (path - dirname), print_file, &ctx);
grub_free (ctx.dirname);
}
--
2.34.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 4/6] commands/ls: Output path for single file arguments given with path
2025-03-01 7:50 [PATCH v5 0/6] More ls improvements Glenn Washburn
` (2 preceding siblings ...)
2025-03-01 7:50 ` [PATCH v5 3/6] commands/ls: Show modification time for file paths Glenn Washburn
@ 2025-03-01 7:50 ` Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 5/6] commands/ls: Print full paths for file args Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 6/6] commands/ls: Add directory header for dir args Glenn Washburn
5 siblings, 0 replies; 7+ messages in thread
From: Glenn Washburn @ 2025-03-01 7:50 UTC (permalink / raw)
To: grub-devel, Daniel Kiper; +Cc: Vladimir Serbinenko, Glenn Washburn
Signed-off-by: Glenn Washburn <development@efficientek.com>
---
grub-core/commands/ls.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/grub-core/commands/ls.c b/grub-core/commands/ls.c
index 1b447acf7c34..886441575cac 100644
--- a/grub-core/commands/ls.c
+++ b/grub-core/commands/ls.c
@@ -108,6 +108,8 @@ print_file (const char *filename, const struct grub_dirhook_info *info,
if (! ctx->longlist)
{
+ if (ctx->filename != NULL)
+ grub_xputs (ctx->dirname);
grub_printf ("%s%s ", filename, info->dir ? "/" : "");
return 0;
}
--
2.34.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 5/6] commands/ls: Print full paths for file args
2025-03-01 7:50 [PATCH v5 0/6] More ls improvements Glenn Washburn
` (3 preceding siblings ...)
2025-03-01 7:50 ` [PATCH v5 4/6] commands/ls: Output path for single file arguments given with path Glenn Washburn
@ 2025-03-01 7:50 ` Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 6/6] commands/ls: Add directory header for dir args Glenn Washburn
5 siblings, 0 replies; 7+ messages in thread
From: Glenn Washburn @ 2025-03-01 7:50 UTC (permalink / raw)
To: grub-devel, Daniel Kiper; +Cc: Vladimir Serbinenko, Glenn Washburn
For arguments that are paths to files, print the full path of the file.
Signed-off-by: Glenn Washburn <development@efficientek.com>
---
grub-core/commands/ls.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/grub-core/commands/ls.c b/grub-core/commands/ls.c
index 886441575cac..8f6440e845fd 100644
--- a/grub-core/commands/ls.c
+++ b/grub-core/commands/ls.c
@@ -98,6 +98,7 @@ static int
print_file (const char *filename, const struct grub_dirhook_info *info,
void *data)
{
+ char *pathname = NULL;
struct grub_ls_list_files_ctx *ctx = data;
if ((! ctx->all) && (filename[0] == '.'))
@@ -117,7 +118,6 @@ print_file (const char *filename, const struct grub_dirhook_info *info,
if (! info->dir)
{
grub_file_t file;
- char *pathname;
if (ctx->dirname[grub_strlen (ctx->dirname) - 1] == '/')
pathname = grub_xasprintf ("%s%s", ctx->dirname, filename);
@@ -143,7 +143,6 @@ print_file (const char *filename, const struct grub_dirhook_info *info,
else
grub_xputs ("????????????");
- grub_free (pathname);
grub_errno = GRUB_ERR_NONE;
}
else
@@ -165,7 +164,10 @@ print_file (const char *filename, const struct grub_dirhook_info *info,
datetime.day, datetime.hour,
datetime.minute, datetime.second);
}
- grub_printf ("%s%s\n", filename, info->dir ? "/" : "");
+ grub_printf ("%s%s\n", (pathname != NULL) ? pathname : filename,
+ info->dir ? "/" : "");
+
+ grub_free (pathname);
return 0;
}
--
2.34.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 6/6] commands/ls: Add directory header for dir args
2025-03-01 7:50 [PATCH v5 0/6] More ls improvements Glenn Washburn
` (4 preceding siblings ...)
2025-03-01 7:50 ` [PATCH v5 5/6] commands/ls: Print full paths for file args Glenn Washburn
@ 2025-03-01 7:50 ` Glenn Washburn
5 siblings, 0 replies; 7+ messages in thread
From: Glenn Washburn @ 2025-03-01 7:50 UTC (permalink / raw)
To: grub-devel, Daniel Kiper; +Cc: Vladimir Serbinenko, Glenn Washburn
Like the GNU ls, first print a line with the directory path before printing
files in the directory, which will not have a directory component, but only
if there is more than one argument.
Signed-off-by: Glenn Washburn <development@efficientek.com>
---
grub-core/commands/ls.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/grub-core/commands/ls.c b/grub-core/commands/ls.c
index 8f6440e845fd..2e7e513e9b30 100644
--- a/grub-core/commands/ls.c
+++ b/grub-core/commands/ls.c
@@ -91,6 +91,7 @@ struct grub_ls_list_files_ctx
int all;
int human;
int longlist;
+ int print_dirhdr;
};
/* Helper for grub_ls_list_files. */
@@ -107,6 +108,12 @@ print_file (const char *filename, const struct grub_dirhook_info *info,
if ((ctx->filename != NULL) && (grub_strcmp (filename, ctx->filename) != 0))
return 0;
+ if (ctx->print_dirhdr)
+ {
+ grub_printf ("%s:\n", ctx->dirname);
+ ctx->print_dirhdr = 0;
+ }
+
if (! ctx->longlist)
{
if (ctx->filename != NULL)
@@ -173,7 +180,7 @@ print_file (const char *filename, const struct grub_dirhook_info *info,
}
static grub_err_t
-grub_ls_list_files (char *dirname, int longlist, int all, int human)
+grub_ls_list_files (char *dirname, int longlist, int all, int human, int dirhdr)
{
char *device_name;
grub_fs_t fs;
@@ -221,7 +228,8 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
.filename = NULL,
.all = all,
.human = human,
- .longlist = longlist
+ .longlist = longlist,
+ .print_dirhdr = dirhdr
};
(fs->fs_dir) (dev, path, print_file, &ctx);
@@ -236,6 +244,7 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
grub_errno = GRUB_ERR_NONE;
/* PATH might be a regular file. */
+ ctx.print_dirhdr = 0;
ctx.filename = grub_strrchr (dirname, '/');
if (ctx.filename == NULL)
goto fail;
@@ -275,8 +284,8 @@ grub_cmd_ls (grub_extcmd_context_t ctxt, int argc, char **args)
grub_ls_list_devices (state[0].set);
else
for (i = 0; i < argc; i++)
- grub_ls_list_files (args[i], state[0].set, state[2].set,
- state[1].set);
+ grub_ls_list_files (args[i], state[0].set, state[2].set, state[1].set,
+ argc > 1);
return GRUB_ERR_NONE;
}
--
2.34.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-03-01 7:52 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-01 7:50 [PATCH v5 0/6] More ls improvements Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 1/6] commands/ls: Return proper GRUB_ERR_* for functions returning type grub_err_t Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 2/6] commands/ls: Merge print_files_long and print_files into print_file Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 3/6] commands/ls: Show modification time for file paths Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 4/6] commands/ls: Output path for single file arguments given with path Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 5/6] commands/ls: Print full paths for file args Glenn Washburn
2025-03-01 7:50 ` [PATCH v5 6/6] commands/ls: Add directory header for dir args Glenn Washburn
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.