diff --git a/daemon/glob.c b/daemon/glob.c index 45fb30f19..a22fd33b8 100644 --- a/daemon/glob.c +++ b/daemon/glob.c @@ -26,14 +26,21 @@ #include "actions.h" char ** -do_glob_expand (const char *pattern) +do_glob_expand (const char *pattern, int directoryslash) { int r; glob_t buf = { .gl_pathc = 0, .gl_pathv = NULL, .gl_offs = 0 }; + int flags = GLOB_BRACE | GLOB_MARK; + + /* GLOB_MARK is default, unless the user explicitly disabled it. */ + if ((optargs_bitmask & GUESTFS_GLOB_EXPAND_DIRECTORYSLASH_BITMASK) + && !directoryslash) { + flags &= ~GLOB_MARK; + } /* glob(3) in glibc never calls chdir, so this seems to be safe: */ CHROOT_IN; - r = glob (pattern, GLOB_MARK|GLOB_BRACE, NULL, &buf); + r = glob (pattern, flags, NULL, &buf); CHROOT_OUT; if (r == GLOB_NOMATCH) { /* Return an empty list instead of an error. */ diff --git a/generator/actions.ml b/generator/actions.ml index 0755fefbf..36b8680ef 100644 --- a/generator/actions.ml +++ b/generator/actions.ml @@ -5969,27 +5969,34 @@ See also: C" }; * start with "/". There is no concept of "cwd" in libguestfs, * hence no "."-relative names. *) - style = RStringList "paths", [Pathname "pattern"], []; + style = RStringList "paths", [Pathname "pattern"], [OBool "directoryslash"]; proc_nr = Some 113; + once_had_no_optargs = true; tests = [ InitScratchFS, Always, TestResult ( [["mkdir_p"; "/glob_expand/b/c"]; ["touch"; "/glob_expand/b/c/d"]; ["touch"; "/glob_expand/b/c/e"]; - ["glob_expand"; "/glob_expand/b/c/*"]], + ["glob_expand"; "/glob_expand/b/c/*"; ""]], "is_string_list (ret, 2, \"/glob_expand/b/c/d\", \"/glob_expand/b/c/e\")"), []; InitScratchFS, Always, TestResult ( [["mkdir_p"; "/glob_expand2/b/c"]; ["touch"; "/glob_expand2/b/c/d"]; ["touch"; "/glob_expand2/b/c/e"]; - ["glob_expand"; "/glob_expand2/*/c/*"]], + ["glob_expand"; "/glob_expand2/*/c/*"; ""]], "is_string_list (ret, 2, \"/glob_expand2/b/c/d\", \"/glob_expand2/b/c/e\")"), []; InitScratchFS, Always, TestResult ( [["mkdir_p"; "/glob_expand3/b/c"]; ["touch"; "/glob_expand3/b/c/d"]; ["touch"; "/glob_expand3/b/c/e"]; - ["glob_expand"; "/glob_expand3/*/x/*"]], - "is_string_list (ret, 0)"), [] + ["glob_expand"; "/glob_expand3/*/x/*"; ""]], + "is_string_list (ret, 0)"), []; + InitScratchFS, Always, TestResult ( + [["mkdir_p"; "/glob_expand4/b/c"]; + ["touch"; "/glob_expand4/b1"]; + ["touch"; "/glob_expand4/c1"]; + ["glob_expand"; "/glob_expand4/b*"; "false"]], + "is_string_list (ret, 2, \"/glob_expand4/b\", \"/glob_expand4/b1\")"), []; ]; shortdesc = "expand a wildcard path"; longdesc = "\ @@ -6004,6 +6011,10 @@ It is just a wrapper around the C L function with flags C. See that manual page for more details. +C controls whether use the C flag for +L, and it defaults to true. It can be explicitly set as +off to return no trailing slashes in filenames of directories. + Notice that there is no equivalent command for expanding a device name (eg. F). Use C, C etc functions instead." }; diff --git a/gobject/Makefile.inc b/gobject/Makefile.inc index 3522eb27e..5ba0fc994 100644 --- a/gobject/Makefile.inc +++ b/gobject/Makefile.inc @@ -68,6 +68,7 @@ guestfs_gobject_headers= \ include/guestfs-gobject/optargs-disk_create.h \ include/guestfs-gobject/optargs-e2fsck.h \ include/guestfs-gobject/optargs-fstrim.h \ + include/guestfs-gobject/optargs-glob_expand.h \ include/guestfs-gobject/optargs-grep.h \ include/guestfs-gobject/optargs-hivex_open.h \ include/guestfs-gobject/optargs-inspect_get_icon.h \ @@ -154,6 +155,7 @@ guestfs_gobject_sources= \ src/optargs-disk_create.c \ src/optargs-e2fsck.c \ src/optargs-fstrim.c \ + src/optargs-glob_expand.c \ src/optargs-grep.c \ src/optargs-hivex_open.c \ src/optargs-inspect_get_icon.c \ diff --git a/po/POTFILES b/po/POTFILES index aca174deb..2a1e3136b 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -195,6 +195,7 @@ gobject/src/optargs-cpio_out.c gobject/src/optargs-disk_create.c gobject/src/optargs-e2fsck.c gobject/src/optargs-fstrim.c +gobject/src/optargs-glob_expand.c gobject/src/optargs-grep.c gobject/src/optargs-hivex_open.c gobject/src/optargs-inspect_get_icon.c