From f0891277008c6535aa12e2e9b1b52eb8da6bc678 Mon Sep 17 00:00:00 2001 From: Pino Toscano Date: Thu, 4 Feb 2016 10:45:20 +0100 Subject: [PATCH] daemon: glob: add optarg to control trailing slash for dirs Add a new optional bool "directoryslash" to indicate whether the caller wants trailing slashes in names of directories, defaulting to true (the current behaviour); this helps with interoperability with other tools (such as rm). Related to RHBZ#1293271. (cherry picked from commit 01f46e4e3128b8d8ab009ca198de440e776c2cd6) --- daemon/glob.c | 11 +++++++++-- generator/actions.ml | 21 ++++++++++++++++----- gobject/Makefile.inc | 2 ++ po/POTFILES | 1 + 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/daemon/glob.c b/daemon/glob.c index 45fb30f..a22fd33 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 dfeb34c..998caa5 100644 --- a/generator/actions.ml +++ b/generator/actions.ml @@ -5908,27 +5908,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 = "\ @@ -5943,6 +5950,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 20c98ff..4b99a78 100644 --- a/gobject/Makefile.inc +++ b/gobject/Makefile.inc @@ -69,6 +69,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 d4058ac..a5f3f9e 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -194,6 +194,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 -- 2.7.4