#include "missing_syscall.h"
#include "mountpoint-util.h"
#include "nulstr-util.h"
+#include "selinux-util.h"
#include "stat-util.h"
#include "string-util.h"
#include "strv.h"
if (r < 0)
return r;
- if (symlinkat(target, dt, to) < 0)
+ if (copy_flags & COPY_MAC_CREATE) {
+ r = mac_selinux_create_file_prepare_at(dt, to, S_IFLNK);
+ if (r < 0)
+ return r;
+ }
+ r = symlinkat(target, dt, to);
+ if (copy_flags & COPY_MAC_CREATE)
+ mac_selinux_create_file_clear();
+ if (r < 0)
return -errno;
if (fchownat(dt, to,
if (fdf < 0)
return -errno;
+ if (copy_flags & COPY_MAC_CREATE) {
+ r = mac_selinux_create_file_prepare_at(dt, to, S_IFREG);
+ if (r < 0)
+ return r;
+ }
fdt = openat(dt, to, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW, st->st_mode & 07777);
+ if (copy_flags & COPY_MAC_CREATE)
+ mac_selinux_create_file_clear();
if (fdt < 0)
return -errno;
assert(st);
assert(to);
+ if (copy_flags & COPY_MAC_CREATE) {
+ r = mac_selinux_create_file_prepare_at(dt, to, S_IFIFO);
+ if (r < 0)
+ return r;
+ }
r = mkfifoat(dt, to, st->st_mode & 07777);
+ if (copy_flags & COPY_MAC_CREATE)
+ mac_selinux_create_file_clear();
if (r < 0)
return -errno;
assert(st);
assert(to);
+ if (copy_flags & COPY_MAC_CREATE) {
+ r = mac_selinux_create_file_prepare_at(dt, to, st->st_mode & S_IFMT);
+ if (r < 0)
+ return r;
+ }
r = mknodat(dt, to, st->st_mode, st->st_rdev);
+ if (copy_flags & COPY_MAC_CREATE)
+ mac_selinux_create_file_clear();
if (r < 0)
return -errno;
if (exists)
created = false;
else {
- r = mkdirat(dt, to, st->st_mode & 07777);
+ if (copy_flags & COPY_MAC_CREATE)
+ r = mkdirat_label(dt, to, st->st_mode & 07777);
+ else
+ r = mkdirat(dt, to, st->st_mode & 07777);
if (r >= 0)
created = true;
else if (errno == EEXIST && (copy_flags & COPY_MERGE))
assert(to);
RUN_WITH_UMASK(0000) {
+ if (copy_flags & COPY_MAC_CREATE) {
+ r = mac_selinux_create_file_prepare(to, S_IFREG);
+ if (r < 0)
+ return r;
+ }
fdt = open(to, flags|O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY, mode);
+ if (copy_flags & COPY_MAC_CREATE)
+ mac_selinux_create_file_clear();
if (fdt < 0)
return -errno;
}
if (r < 0)
return r;
+ if (copy_flags & COPY_MAC_CREATE) {
+ r = mac_selinux_create_file_prepare(to, S_IFREG);
+ if (r < 0) {
+ t = mfree(t);
+ return r;
+ }
+ }
fdt = open(t, O_CREAT|O_EXCL|O_NOFOLLOW|O_NOCTTY|O_WRONLY|O_CLOEXEC, 0600);
+ if (copy_flags & COPY_MAC_CREATE)
+ mac_selinux_create_file_clear();
if (fdt < 0) {
t = mfree(t);
return -errno;
}
} else {
+ if (copy_flags & COPY_MAC_CREATE) {
+ r = mac_selinux_create_file_prepare(to, S_IFREG);
+ if (r < 0)
+ return r;
+ }
fdt = open_tmpfile_linkable(to, O_WRONLY|O_CLOEXEC, &t);
+ if (copy_flags & COPY_MAC_CREATE)
+ mac_selinux_create_file_clear();
if (fdt < 0)
return fdt;
}