From: Franck Bui Date: Thu, 26 Apr 2018 13:45:17 +0000 (+0200) Subject: tmpfiles: introduce empty_directory() X-Git-Tag: v240~864^2~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5494602195f5300db8b2eac7c2b77b922d0ceddf;p=thirdparty%2Fsystemd.git tmpfiles: introduce empty_directory() --- diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 9e007d54e6e..7b8c4bb53ff 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -866,40 +866,15 @@ static int path_open_parent_safe(const char *path) { static int path_set_perms(Item *i, const char *path) { _cleanup_close_ int fd = -1; - struct stat stbuf, *st = NULL; assert(i); assert(path); fd = open(path, O_NOFOLLOW|O_CLOEXEC|O_PATH); - if (fd < 0) { - int level = LOG_ERR, r = -errno; - - /* Option "e" operates only on existing objects. Do not - * print errors about non-existent files or directories */ - if (i->type == EMPTY_DIRECTORY && errno == ENOENT) { - level = LOG_DEBUG; - r = 0; - } - - log_full_errno(level, errno, "Adjusting owner and mode for %s failed: %m", path); - return r; - } - - if (i->type == EMPTY_DIRECTORY) { - /* FIXME: introduce fd_is_dir() helper ? */ - if (fstat(fd, &stbuf) < 0) - return log_error_errno(errno, "Failed to fstat() file %s: %m", path); - - if (!S_ISDIR(stbuf.st_mode)) { - log_error("'%s' already exists and is not a directory. ", path); - return -EEXIST; - } - - st = &stbuf; - } + if (fd < 0) + return log_error_errno(errno, "Failed to open \"%s\" to adjust permissions: %m", path); - return fd_set_perms(i, fd, st); + return fd_set_perms(i, fd, NULL); } static int parse_xattrs_from_arg(Item *i) { @@ -1642,6 +1617,29 @@ static int create_subvolume(Item *i, const char *path) { return r; } +static int empty_directory(Item *i, const char *path) { + int r; + + assert(i); + assert(i->type == EMPTY_DIRECTORY); + + r = is_dir(path, false); + if (r == -ENOENT) { + /* Option "e" operates only on existing objects. Do not + * print errors about non-existent files or directories */ + log_debug("Skipping missing directory: %s", path); + return 0; + } + if (r < 0) + return log_error_errno(r, "is_dir() failed on path %s: %m", path); + if (r == 0) { + log_error("'%s' already exists and is not a directory.", path); + return -EEXIST; + } + + return path_set_perms(i, path); +} + static int create_device(Item *i, mode_t file_type) { _cleanup_close_ int dfd = -1, fd = -1; CreationMode creation; @@ -1901,7 +1899,7 @@ static int create_item(Item *i) { break; case EMPTY_DIRECTORY: - r = glob_item(i, path_set_perms); + r = glob_item(i, empty_directory); if (r < 0) return r; break;