2020-11-09 05:23:58 +01:00
|
|
|
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
2013-11-06 22:59:23 +01:00
|
|
|
#pragma once
|
2012-04-10 21:54:31 +02:00
|
|
|
|
2013-06-27 04:14:27 +02:00
|
|
|
#include <sys/types.h>
|
|
|
|
|
2018-03-22 12:38:01 +01:00
|
|
|
typedef enum MkdirFlags {
|
|
|
|
MKDIR_FOLLOW_SYMLINK = 1 << 0,
|
tree-wide: warn when a directory path already exists but has bad mode/owner/type
When we are attempting to create directory somewhere in the bowels of /var/lib
and get an error that it already exists, it can be quite hard to diagnose what
is wrong (especially for a user who is not aware that the directory must have
the specified owner, and permissions not looser than what was requested). Let's
print a warning in most cases. A warning is appropriate, because such state is
usually a sign of borked installation and needs to be resolved by the adminstrator.
$ build/test-fs-util
Path "/tmp/test-readlink_and_make_absolute" already exists and is not a directory, refusing.
(or)
Directory "/tmp/test-readlink_and_make_absolute" already exists, but has mode 0775 that is too permissive (0755 was requested), refusing.
(or)
Directory "/tmp/test-readlink_and_make_absolute" already exists, but is owned by 1001:1000 (1000:1000 was requested), refusing.
Assertion 'mkdir_safe(tempdir, 0755, getuid(), getgid(), MKDIR_WARN_MODE) >= 0' failed at ../src/test/test-fs-util.c:320, function test_readlink_and_make_absolute(). Aborting.
No functional change except for the new log lines.
2018-03-22 13:03:41 +01:00
|
|
|
MKDIR_WARN_MODE = 1 << 1,
|
2018-03-22 12:38:01 +01:00
|
|
|
} MkdirFlags;
|
|
|
|
|
2017-12-15 17:08:13 +01:00
|
|
|
int mkdir_errno_wrapper(const char *pathname, mode_t mode);
|
2018-04-27 12:55:56 +02:00
|
|
|
int mkdirat_errno_wrapper(int dirfd, const char *pathname, mode_t mode);
|
2018-03-22 12:38:01 +01:00
|
|
|
int mkdir_safe(const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags);
|
2012-05-31 13:17:26 +02:00
|
|
|
int mkdir_parents(const char *path, mode_t mode);
|
2020-06-15 16:36:00 +02:00
|
|
|
int mkdir_parents_safe(const char *prefix, const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags);
|
2012-05-31 13:17:26 +02:00
|
|
|
int mkdir_p(const char *path, mode_t mode);
|
2020-06-15 16:36:00 +02:00
|
|
|
int mkdir_p_safe(const char *prefix, const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags);
|
2013-06-27 04:14:27 +02:00
|
|
|
|
2014-10-23 10:23:45 +02:00
|
|
|
/* mandatory access control(MAC) versions */
|
2018-03-22 12:38:01 +01:00
|
|
|
int mkdir_safe_label(const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags);
|
2020-06-15 16:36:00 +02:00
|
|
|
int mkdir_parents_label(const char *path, mode_t mod);
|
2013-07-26 03:34:18 +02:00
|
|
|
int mkdir_p_label(const char *path, mode_t mode);
|
|
|
|
|
|
|
|
/* internally used */
|
|
|
|
typedef int (*mkdir_func_t)(const char *pathname, mode_t mode);
|
2018-03-22 12:38:01 +01:00
|
|
|
int mkdir_safe_internal(const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags, mkdir_func_t _mkdir);
|
2020-06-15 16:36:00 +02:00
|
|
|
int mkdir_parents_internal(const char *prefix, const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags, mkdir_func_t _mkdir);
|
|
|
|
int mkdir_p_internal(const char *prefix, const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags, mkdir_func_t _mkdir);
|
2020-08-03 12:05:37 +02:00
|
|
|
|
|
|
|
int mkdir_p_root(const char *root, const char *p, uid_t uid, gid_t gid, mode_t m);
|