X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Ftmpfiles%2Ftmpfiles.c;h=b7f6a2e058bcdcf539c5aaa7e06c7cf69b60b710;hp=42cc34d6c41576ece05a1a9242cd7a22daaa67c2;hb=eb9da376d76b48585b3b63b4f91903b54f7abd36;hpb=1ca208fb4f93e5869704af1812cbff7130a2fc03 diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 42cc34d6c..b7f6a2e05 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -52,6 +52,7 @@ #include "conf-files.h" #include "capability.h" #include "specifier.h" +#include "build.h" /* This reads all files listed in /etc/tmpfiles.d/?*.conf and creates * them in the file system. This is intended to be used to create @@ -275,12 +276,15 @@ static int dir_cleanup( continue; if (fstatat(dirfd(d), dent->d_name, &s, AT_SYMLINK_NOFOLLOW) < 0) { + if (errno == ENOENT) + continue; - if (errno != ENOENT) { + /* FUSE, NFS mounts, SELinux might return EACCES */ + if (errno == EACCES) + log_debug("stat(%s/%s) failed: %m", p, dent->d_name); + else log_error("stat(%s/%s) failed: %m", p, dent->d_name); - r = -errno; - } - + r = -errno; continue; } @@ -462,8 +466,10 @@ static int item_set_perms(Item *i, const char *path) { } static int write_one_file(Item *i, const char *path) { - int r, e, fd, flags; + int e, flags; + int fd = -1; struct stat st; + int r = 0; flags = i->type == CREATE_FILE ? O_CREAT|O_APPEND : i->type == TRUNCATE_FILE ? O_CREAT|O_TRUNC : 0; @@ -635,8 +641,9 @@ static int glob_item(Item *i, int (*action)(Item *, const char *)) { } static int create_item(Item *i) { - int r, e; + int e; struct stat st; + int r = 0; assert(i); @@ -995,7 +1002,7 @@ static void item_free(Item *i) { free(i); } -define_trivial_cleanup_func(Item*, item_free) +DEFINE_TRIVIAL_CLEANUP_FUNC(Item*, item_free); #define _cleanup_item_free_ _cleanup_(item_freep) static bool item_equal(Item *a, Item *b) { @@ -1260,6 +1267,7 @@ static int help(void) { printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n\n" "Creates, deletes and cleans up volatile and temporary files and directories.\n\n" " -h --help Show this help\n" + " --version Show package version\n" " --create Create marked files/directories\n" " --clean Clean up marked directories\n" " --remove Remove marked files/directories\n" @@ -1273,6 +1281,7 @@ static int help(void) { static int parse_argv(int argc, char *argv[]) { enum { + ARG_VERSION = 0x100, ARG_CREATE, ARG_CLEAN, ARG_REMOVE, @@ -1282,12 +1291,13 @@ static int parse_argv(int argc, char *argv[]) { static const struct option options[] = { { "help", no_argument, NULL, 'h' }, + { "version", no_argument, NULL, ARG_VERSION }, { "create", no_argument, NULL, ARG_CREATE }, { "clean", no_argument, NULL, ARG_CLEAN }, { "remove", no_argument, NULL, ARG_REMOVE }, { "prefix", required_argument, NULL, ARG_PREFIX }, { "exclude-prefix", required_argument, NULL, ARG_EXCLUDE_PREFIX }, - { NULL, 0, NULL, 0 } + {} }; int c; @@ -1300,7 +1310,11 @@ static int parse_argv(int argc, char *argv[]) { switch (c) { case 'h': - help(); + return help(); + + case ARG_VERSION: + puts(PACKAGE_STRING); + puts(SYSTEMD_FEATURES); return 0; case ARG_CREATE: @@ -1329,8 +1343,7 @@ static int parse_argv(int argc, char *argv[]) { return -EINVAL; default: - log_error("Unknown option code %c", c); - return -EINVAL; + assert_not_reached("Unhandled option"); } }