diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2021-03-25 14:23:58 +0100 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2021-03-25 14:35:39 +0100 |
commit | b0b88d26c9df6d336167f87ce926bba9b56f6af0 (patch) | |
tree | 39733ee0a0127380bc7b4c93cd67f6a15afc74e4 /lib/fstree/fstree_from_file.c | |
parent | bd87f7c8a46cabe6d4c71d9cea74329898da31a7 (diff) |
libfstree: Allow / as argument for "glob" and "dir" commands
This allows putting globbed files & directories into the filesystem
root, as well as explicitly setting attributes of the root directory
from the file lisiting.
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/fstree/fstree_from_file.c')
-rw-r--r-- | lib/fstree/fstree_from_file.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/lib/fstree/fstree_from_file.c b/lib/fstree/fstree_from_file.c index dd7ca22..3bf8cd1 100644 --- a/lib/fstree/fstree_from_file.c +++ b/lib/fstree/fstree_from_file.c @@ -344,19 +344,20 @@ static const struct callback_t { unsigned int mode; bool need_extra; bool is_glob; + bool allow_root; int (*callback)(fstree_t *fs, const char *filename, size_t line_num, const char *path, struct stat *sb, const char *basepath, unsigned int glob_flags, const char *extra); } file_list_hooks[] = { - { "dir", S_IFDIR, false, false, add_generic }, - { "slink", S_IFLNK, true, false, add_generic }, - { "link", 0, true, false, add_hard_link }, - { "nod", 0, true, false, add_device }, - { "pipe", S_IFIFO, false, false, add_generic }, - { "sock", S_IFSOCK, false, false, add_generic }, - { "file", S_IFREG, false, false, add_file }, - { "glob", 0, true, true, glob_files }, + { "dir", S_IFDIR, false, false, true, add_generic }, + { "slink", S_IFLNK, true, false, false, add_generic }, + { "link", 0, true, false, false, add_hard_link }, + { "nod", 0, true, false, false, add_device }, + { "pipe", S_IFIFO, false, false, false, add_generic }, + { "sock", S_IFSOCK, false, false, false, add_generic }, + { "file", S_IFREG, false, false, false, add_file }, + { "glob", 0, true, true, true, glob_files }, }; #define NUM_HOOKS (sizeof(file_list_hooks) / sizeof(file_list_hooks[0])) @@ -456,9 +457,12 @@ static int handle_line(fstree_t *fs, const char *filename, if ((line = read_str(line, &path)) == NULL) goto fail_ent; - if (canonicalize_name(path) || *path == '\0') + if (canonicalize_name(path)) goto fail_ent; + if (*path == '\0' && !cb->allow_root) + goto fail_root; + if (cb->is_glob && *line == '*') { ++line; mode = 0; @@ -507,6 +511,10 @@ static int handle_line(fstree_t *fs, const char *filename, return cb->callback(fs, filename, line_num, path, &sb, basepath, glob_flags, extra); +fail_root: + fprintf(stderr, "%s: " PRI_SZ ": cannot use / as argument for %s.\n", + filename, line_num, cb->keyword); + return -1; fail_no_extra: fprintf(stderr, "%s: " PRI_SZ ": missing argument for %s.\n", filename, line_num, cb->keyword); |