summaryrefslogtreecommitdiff
path: root/src/basic/mkdir.h
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2022-02-10 08:30:08 +0100
committerLennart Poettering <lennart@poettering.net>2022-02-11 10:05:21 +0100
commite01e68e70ae1db9fe61adec3e7bdcced7adc1930 (patch)
treefae145e4e3ddd8600a3cd2ffe8c3204652b3a1c2 /src/basic/mkdir.h
parenta38f3ceeda0e7acbb9c6ef35903db8344e6123f9 (diff)
downloadsystemd-e01e68e70ae1db9fe61adec3e7bdcced7adc1930.tar.gz
basic: do not warn in mkdir_p() when parent directory exists
This effectively disables warnings about type/mode/ownership of existing directories when recursively creating parent directories. (Or files. If there's a file in a place we expect a directory, the code will later try to create a file and fail. This follows the general pattern where we do (void)mkdir() if the mkdir() is immediately followed by opening of a file.) I was recently debugging an issue with the fstab-generator [1], and it says: 'Directory "/tmp" already exists, but has mode 0777 that is too permissive (0644 was requested), refusing.' which is very specific but totally wrong in this context. This output was added in 37c1d5e97dbc869edd8fc178427714e2d9428d2b, and I still think it is worth to do it, because if you actually *do* want the directory, if there's something wrong, the precise error message will make it much easier to diagnose. And we can't easily pass the information what failed up the call chain because there are multiple things we check (ownership, permission mask, type)… So passing a param whether to warn or not down into the library code seems like the best solution, despite not being very elegant. [1] https://bugzilla.redhat.com/show_bug.cgi?id=2051285
Diffstat (limited to 'src/basic/mkdir.h')
-rw-r--r--src/basic/mkdir.h5
1 files changed, 3 insertions, 2 deletions
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 <sys/types.h>
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);