diff options
-rw-r--r-- | src/tmpfiles/tmpfiles.c | 49 |
1 files changed, 33 insertions, 16 deletions
diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 557492f958..bf5192c56f 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -963,22 +963,34 @@ shortcut: return label_fix_full(fd, /* inode_path= */ NULL, /* label_path= */ path, 0); } -static int path_open_parent_safe(const char *path) { +static int path_open_parent_safe(const char *path, bool allow_failure) { _cleanup_free_ char *dn = NULL; int r, fd; if (!path_is_normalized(path)) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Failed to open parent of '%s': path not normalized.", path); + return log_full_errno(allow_failure ? LOG_INFO : LOG_ERR, + SYNTHETIC_ERRNO(EINVAL), + "Failed to open parent of '%s': path not normalized%s.", + path, + allow_failure ? ", ignoring" : ""); r = path_extract_directory(path, &dn); if (r < 0) - return log_error_errno(r, "Unable to determine parent directory of '%s': %m", path); + return log_full_errno(allow_failure ? LOG_INFO : LOG_ERR, + r, + "Unable to determine parent directory of '%s'%s: %m", + path, + allow_failure ? ", ignoring" : ""); - r = chase_symlinks(dn, arg_root, CHASE_SAFE|CHASE_WARN, NULL, &fd); + r = chase_symlinks(dn, arg_root, allow_failure ? CHASE_SAFE : CHASE_SAFE|CHASE_WARN, NULL, &fd); if (r == -ENOLINK) /* Unsafe symlink: already covered by CHASE_WARN */ return r; if (r < 0) - return log_error_errno(r, "Failed to open path '%s': %m", dn); + return log_full_errno(allow_failure ? LOG_INFO : LOG_ERR, + r, + "Failed to open path '%s'%s: %m", + dn, + allow_failure ? ", ignoring" : ""); return fd; } @@ -1433,7 +1445,7 @@ static int write_one_file(Item *i, const char *path, CreationMode creation) { /* Validate the path and keep the fd on the directory for opening the file so we're sure that it * can't be changed behind our back. */ - dir_fd = path_open_parent_safe(path); + dir_fd = path_open_parent_safe(path, i->allow_failure); if (dir_fd < 0) return dir_fd; @@ -1483,7 +1495,7 @@ static int create_file(Item *i, const char *path) { /* Validate the path and keep the fd on the directory for opening the file so we're sure that it * can't be changed behind our back. */ - dir_fd = path_open_parent_safe(path); + dir_fd = path_open_parent_safe(path, i->allow_failure); if (dir_fd < 0) return dir_fd; @@ -1551,7 +1563,7 @@ static int truncate_file(Item *i, const char *path) { /* Validate the path and keep the fd on the directory for opening the file so we're sure that it * can't be changed behind our back. */ - dir_fd = path_open_parent_safe(path); + dir_fd = path_open_parent_safe(path, i->allow_failure); if (dir_fd < 0) return dir_fd; @@ -1630,7 +1642,7 @@ static int copy_files(Item *i) { /* Validate the path and use the returned directory fd for copying the target so we're sure that the * path can't be changed behind our back. */ - dfd = path_open_parent_safe(i->path); + dfd = path_open_parent_safe(i->path, i->allow_failure); if (dfd < 0) return dfd; @@ -1667,6 +1679,7 @@ static int create_directory_or_subvolume( const char *path, mode_t mode, bool subvol, + bool allow_failure, struct stat *ret_st, CreationMode *ret_creation) { @@ -1682,7 +1695,7 @@ static int create_directory_or_subvolume( if (r < 0) return log_error_errno(r, "Failed to extract filename from path '%s': %m", path); - pfd = path_open_parent_safe(path); + pfd = path_open_parent_safe(path, allow_failure); if (pfd < 0) return pfd; @@ -1723,7 +1736,11 @@ static int create_directory_or_subvolume( /* Then look at the original error */ if (r < 0) - return log_error_errno(r, "Failed to create directory or subvolume \"%s\": %m", path); + return log_full_errno(allow_failure ? LOG_INFO : LOG_ERR, + r, + "Failed to create directory or subvolume \"%s\"%s: %m", + path, + allow_failure ? ", ignoring" : ""); return log_error_errno(errno, "Failed to open directory/subvolume we just created '%s': %m", path); } @@ -1751,7 +1768,7 @@ static int create_directory(Item *i, const char *path) { assert(i); assert(IN_SET(i->type, CREATE_DIRECTORY, TRUNCATE_DIRECTORY)); - fd = create_directory_or_subvolume(path, i->mode, /* subvol= */ false, &st, &creation); + fd = create_directory_or_subvolume(path, i->mode, /* subvol= */ false, i->allow_failure, &st, &creation); if (fd == -EEXIST) return 0; if (fd < 0) @@ -1769,7 +1786,7 @@ static int create_subvolume(Item *i, const char *path) { assert(i); assert(IN_SET(i->type, CREATE_SUBVOLUME, CREATE_SUBVOLUME_NEW_QUOTA, CREATE_SUBVOLUME_INHERIT_QUOTA)); - fd = create_directory_or_subvolume(path, i->mode, /* subvol = */ true, &st, &creation); + fd = create_directory_or_subvolume(path, i->mode, /* subvol = */ true, i->allow_failure, &st, &creation); if (fd == -EEXIST) return 0; if (fd < 0) @@ -1848,7 +1865,7 @@ static int create_device(Item *i, mode_t file_type) { /* Validate the path and use the returned directory fd for copying the target so we're sure that the * path can't be changed behind our back. */ - dfd = path_open_parent_safe(i->path); + dfd = path_open_parent_safe(i->path, i->allow_failure); if (dfd < 0) return dfd; @@ -1950,7 +1967,7 @@ static int create_fifo(Item *i) { if (r == O_DIRECTORY) return log_error_errno(SYNTHETIC_ERRNO(EISDIR), "Cannot open path '%s' for creating FIFO, is a directory.", i->path); - pfd = path_open_parent_safe(i->path); + pfd = path_open_parent_safe(i->path, i->allow_failure); if (pfd < 0) return pfd; @@ -2035,7 +2052,7 @@ static int create_symlink(Item *i) { if (r == O_DIRECTORY) return log_error_errno(SYNTHETIC_ERRNO(EISDIR), "Cannot open path '%s' for creating FIFO, is a directory.", i->path); - pfd = path_open_parent_safe(i->path); + pfd = path_open_parent_safe(i->path, i->allow_failure); if (pfd < 0) return pfd; |