1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
10 #include <sys/types.h>
12 typedef enum CopyFlags
{
13 COPY_REFLINK
= 1 << 0, /* Try to reflink */
14 COPY_MERGE
= 1 << 1, /* Merge existing trees with our new one to copy */
15 COPY_REPLACE
= 1 << 2, /* Replace an existing file if there's one */
16 COPY_SAME_MOUNT
= 1 << 3, /* Don't descend recursively into other file systems, across mount point boundaries */
17 COPY_MERGE_EMPTY
= 1 << 4, /* Merge an existing, empty directory with our new tree to copy */
18 COPY_CRTIME
= 1 << 5, /* Generate a user.crtime_usec xattr off the source crtime if there is one, on copying */
19 COPY_SIGINT
= 1 << 6, /* Check for SIGINT regularly and return EINTR if seen (caller needs to block SIGINT) */
20 COPY_SIGTERM
= 1 << 7, /* ditto, but for SIGTERM */
21 COPY_MAC_CREATE
= 1 << 8, /* Create files with the correct MAC label (currently SELinux only) */
22 COPY_HARDLINKS
= 1 << 9, /* Try to reproduce hard links */
23 COPY_FSYNC
= 1 << 10, /* fsync() after we are done */
24 COPY_FSYNC_FULL
= 1 << 11, /* fsync_full() after we are done */
25 COPY_SYNCFS
= 1 << 12, /* syncfs() the *top-level* dir after we are done */
26 COPY_ALL_XATTRS
= 1 << 13, /* Preserve all xattrs when copying, not just those in the user namespace */
29 typedef int (*copy_progress_bytes_t
)(uint64_t n_bytes
, void *userdata
);
30 typedef int (*copy_progress_path_t
)(const char *path
, const struct stat
*st
, void *userdata
);
32 int copy_file_fd_full(const char *from
, int to
, CopyFlags copy_flags
, copy_progress_bytes_t progress
, void *userdata
);
33 static inline int copy_file_fd(const char *from
, int to
, CopyFlags copy_flags
) {
34 return copy_file_fd_full(from
, to
, copy_flags
, NULL
, NULL
);
37 int copy_file_full(const char *from
, const char *to
, int open_flags
, mode_t mode
, unsigned chattr_flags
, unsigned chattr_mask
, CopyFlags copy_flags
, copy_progress_bytes_t progress
, void *userdata
);
38 static inline int copy_file(const char *from
, const char *to
, int open_flags
, mode_t mode
, unsigned chattr_flags
, unsigned chattr_mask
, CopyFlags copy_flags
) {
39 return copy_file_full(from
, to
, open_flags
, mode
, chattr_flags
, chattr_mask
, copy_flags
, NULL
, NULL
);
42 int copy_file_atomic_full(const char *from
, const char *to
, mode_t mode
, unsigned chattr_flags
, unsigned chattr_mask
, CopyFlags copy_flags
, copy_progress_bytes_t progress
, void *userdata
);
43 static inline int copy_file_atomic(const char *from
, const char *to
, mode_t mode
, unsigned chattr_flags
, unsigned chattr_mask
, CopyFlags copy_flags
) {
44 return copy_file_atomic_full(from
, to
, mode
, chattr_flags
, chattr_mask
, copy_flags
, NULL
, NULL
);
47 int copy_tree_at_full(int fdf
, const char *from
, int fdt
, const char *to
, uid_t override_uid
, gid_t override_gid
, CopyFlags copy_flags
, copy_progress_path_t progress_path
, copy_progress_bytes_t progress_bytes
, void *userdata
);
48 static inline int copy_tree_at(int fdf
, const char *from
, int fdt
, const char *to
, uid_t override_uid
, gid_t override_gid
, CopyFlags copy_flags
) {
49 return copy_tree_at_full(fdf
, from
, fdt
, to
, override_uid
, override_gid
, copy_flags
, NULL
, NULL
, NULL
);
51 static inline int copy_tree(const char *from
, const char *to
, uid_t override_uid
, gid_t override_gid
, CopyFlags copy_flags
) {
52 return copy_tree_at_full(AT_FDCWD
, from
, AT_FDCWD
, to
, override_uid
, override_gid
, copy_flags
, NULL
, NULL
, NULL
);
55 int copy_directory_fd_full(int dirfd
, const char *to
, CopyFlags copy_flags
, copy_progress_path_t progress_path
, copy_progress_bytes_t progress_bytes
, void *userdata
);
56 static inline int copy_directory_fd(int dirfd
, const char *to
, CopyFlags copy_flags
) {
57 return copy_directory_fd_full(dirfd
, to
, copy_flags
, NULL
, NULL
, NULL
);
60 int copy_directory_full(const char *from
, const char *to
, CopyFlags copy_flags
, copy_progress_path_t progress_path
, copy_progress_bytes_t progress_bytes
, void *userdata
);
61 static inline int copy_directory(const char *from
, const char *to
, CopyFlags copy_flags
) {
62 return copy_directory_full(from
, to
, copy_flags
, NULL
, NULL
, NULL
);
65 int copy_bytes_full(int fdf
, int fdt
, uint64_t max_bytes
, CopyFlags copy_flags
, void **ret_remains
, size_t *ret_remains_size
, copy_progress_bytes_t progress
, void *userdata
);
66 static inline int copy_bytes(int fdf
, int fdt
, uint64_t max_bytes
, CopyFlags copy_flags
) {
67 return copy_bytes_full(fdf
, fdt
, max_bytes
, copy_flags
, NULL
, NULL
, NULL
, NULL
);
70 int copy_times(int fdf
, int fdt
, CopyFlags flags
);
71 int copy_access(int fdf
, int fdt
);
72 int copy_rights_with_fallback(int fdf
, int fdt
, const char *patht
);
73 static inline int copy_rights(int fdf
, int fdt
) {
74 return copy_rights_with_fallback(fdf
, fdt
, NULL
); /* no fallback */
76 int copy_xattr(int fdf
, int fdt
, CopyFlags copy_flags
);