diff --git a/src/basic/mkdir.c b/src/basic/mkdir.c index 51a0d74e87..d2c6b96a38 100644 --- a/src/basic/mkdir.c +++ b/src/basic/mkdir.c @@ -51,6 +51,9 @@ int mkdir_safe_internal( _mkdirat); } + if (flags & MKDIR_IGNORE_EXISTING) + return 0; + if (!S_ISDIR(st.st_mode)) return log_full_errno(flags & MKDIR_WARN_MODE ? LOG_WARNING : LOG_DEBUG, SYNTHETIC_ERRNO(ENOTDIR), "Path \"%s\" already exists and is not a directory, refusing.", path); @@ -138,7 +141,7 @@ int mkdir_parents_internal(const char *prefix, const char *path, mode_t mode, ui s[n] = '\0'; if (!prefix || !path_startswith_full(prefix, path, /* accept_dot_dot= */ false)) { - r = mkdir_safe_internal(path, mode, uid, gid, flags, _mkdirat); + r = mkdir_safe_internal(path, mode, uid, gid, flags | MKDIR_IGNORE_EXISTING, _mkdirat); if (r < 0 && r != -EEXIST) return r; } diff --git a/src/basic/mkdir.h b/src/basic/mkdir.h index 34a5227577..c0c0ea6c4f 100644 --- a/src/basic/mkdir.h +++ b/src/basic/mkdir.h @@ -4,8 +4,9 @@ #include typedef enum MkdirFlags { - MKDIR_FOLLOW_SYMLINK = 1 << 0, - MKDIR_WARN_MODE = 1 << 1, + MKDIR_FOLLOW_SYMLINK = 1 << 0, + MKDIR_IGNORE_EXISTING = 1 << 1, /* Quietly accept a preexisting directory (or file) */ + MKDIR_WARN_MODE = 1 << 2, /* Log at LOG_WARNING when mode doesn't match */ } MkdirFlags; int mkdirat_errno_wrapper(int dirfd, const char *pathname, mode_t mode);