Skip to content

Commit

Permalink
daemon: glob: add optarg to control trailing slash for dirs
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
ptoscano committed Feb 4, 2016
1 parent 14b8e67 commit 01f46e4
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 7 deletions.
11 changes: 9 additions & 2 deletions daemon/glob.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
21 changes: 16 additions & 5 deletions generator/actions.ml
Original file line number Diff line number Diff line change
Expand Up @@ -5969,27 +5969,34 @@ See also: C<guestfs_command_lines>" };
* 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 = "\
Expand All @@ -6004,6 +6011,10 @@ It is just a wrapper around the C L<glob(3)> function
with flags C<GLOB_MARK|GLOB_BRACE>.
See that manual page for more details.
C<directoryslash> controls whether use the C<GLOB_MARK> flag for
L<glob(3)>, 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</dev/sd*>). Use C<guestfs_list_devices>,
C<guestfs_list_partitions> etc functions instead." };
Expand Down
2 changes: 2 additions & 0 deletions gobject/Makefile.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down Expand Up @@ -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 \
Expand Down
1 change: 1 addition & 0 deletions po/POTFILES
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 01f46e4

Please sign in to comment.