]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic/label: introduce mkdirat_label()/mkdirat_errno_wrapper() helpers
authorFranck Bui <fbui@suse.com>
Fri, 27 Apr 2018 10:55:56 +0000 (12:55 +0200)
committerFranck Bui <fbui@suse.com>
Mon, 30 Jul 2018 13:54:03 +0000 (15:54 +0200)
src/basic/label.h
src/basic/mkdir-label.c
src/basic/mkdir.c
src/basic/mkdir.h

index 08fd109bcf9db90a82d360dfa83e40c61516640a..594fd65974c1e3981270c874dcfcffea7c4c21f6 100644 (file)
@@ -12,6 +12,7 @@ typedef enum LabelFixFlags {
 int label_fix(const char *path, LabelFixFlags flags);
 
 int mkdir_label(const char *path, mode_t mode);
+int mkdirat_label(int dirfd, const char *path, mode_t mode);
 int symlink_label(const char *old_path, const char *new_path);
 
 int btrfs_subvol_make_label(const char *path);
index 1d51e92e9af1e52420ac76d77d647ea3b87136a0..0eba7fc514b2cea8ff7eedacd6e4fe126bee826c 100644 (file)
@@ -28,6 +28,23 @@ int mkdir_label(const char *path, mode_t mode) {
         return mac_smack_fix(path, 0);
 }
 
+int mkdirat_label(int dirfd, const char *path, mode_t mode) {
+        int r;
+
+        assert(path);
+
+        r = mac_selinux_create_file_prepare_at(dirfd, path, S_IFDIR);
+        if (r < 0)
+                return r;
+
+        r = mkdirat_errno_wrapper(dirfd, path, mode);
+        mac_selinux_create_file_clear();
+        if (r < 0)
+                return r;
+
+        return mac_smack_fix_at(dirfd, path, 0);
+}
+
 int mkdir_safe_label(const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags) {
         return mkdir_safe_internal(path, mode, uid, gid, flags, mkdir_label);
 }
index 6ab1b4422b4af1854a4c9492537f3b32b1c0ae0c..4bb65d5838dc8fb48b91e75677c854fa3113fa13 100644 (file)
@@ -80,6 +80,12 @@ int mkdir_errno_wrapper(const char *pathname, mode_t mode) {
         return 0;
 }
 
+int mkdirat_errno_wrapper(int dirfd, const char *pathname, mode_t mode) {
+        if (mkdirat(dirfd, pathname, mode) < 0)
+                return -errno;
+        return 0;
+}
+
 int mkdir_safe(const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags) {
         return mkdir_safe_internal(path, mode, uid, gid, flags, mkdir_errno_wrapper);
 }
index bdca15460e866f07dcced8738267a49ce8b82de1..eb54853ea78b45dc46d9ab2c8215ebfea3951d39 100644 (file)
@@ -9,6 +9,7 @@ typedef enum MkdirFlags {
 } MkdirFlags;
 
 int mkdir_errno_wrapper(const char *pathname, mode_t mode);
+int mkdirat_errno_wrapper(int dirfd, const char *pathname, mode_t mode);
 int mkdir_safe(const char *path, mode_t mode, uid_t uid, gid_t gid, MkdirFlags flags);
 int mkdir_parents(const char *path, mode_t mode);
 int mkdir_p(const char *path, mode_t mode);