1 /* SPDX-License-Identifier: LGPL-2.1+ */
11 typedef enum CopyFlags
{
12 COPY_REFLINK
= 1 << 0, /* Try to reflink */
13 COPY_MERGE
= 1 << 1, /* Merge existing trees with our new one to copy */
14 COPY_REPLACE
= 1 << 2, /* Replace an existing file if there's one */
15 COPY_SAME_MOUNT
= 1 << 3, /* Don't descend recursively into other file systems, across mount point boundaries */
16 COPY_MERGE_EMPTY
= 1 << 4, /* Merge an existing, empty directory with our new tree to copy */
17 COPY_CRTIME
= 1 << 5, /* Generate a user.crtime_usec xattr off the source crtime if there is one, on copying */
18 COPY_SIGINT
= 1 << 6, /* Check for SIGINT regularly and return EINTR if seen (caller needs to block SIGINT) */
19 COPY_MAC_CREATE
= 1 << 7, /* Create files with the correct MAC label (currently SELinux only) */
22 typedef int (*copy_progress_bytes_t
)(uint64_t n_bytes
, void *userdata
);
23 typedef int (*copy_progress_path_t
)(const char *path
, const struct stat
*st
, void *userdata
);
25 int copy_file_fd_full(const char *from
, int to
, CopyFlags copy_flags
, copy_progress_bytes_t progress
, void *userdata
);
26 static inline int copy_file_fd(const char *from
, int to
, CopyFlags copy_flags
) {
27 return copy_file_fd_full(from
, to
, copy_flags
, NULL
, NULL
);
30 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
);
31 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
) {
32 return copy_file_full(from
, to
, open_flags
, mode
, chattr_flags
, chattr_mask
, copy_flags
, NULL
, NULL
);
35 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
);
36 static inline int copy_file_atomic(const char *from
, const char *to
, mode_t mode
, unsigned chattr_flags
, unsigned chattr_mask
, CopyFlags copy_flags
) {
37 return copy_file_atomic_full(from
, to
, mode
, chattr_flags
, chattr_mask
, copy_flags
, NULL
, NULL
);
40 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
);
41 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
) {
42 return copy_tree_at_full(fdf
, from
, fdt
, to
, override_uid
, override_gid
, copy_flags
, NULL
, NULL
, NULL
);
44 static inline int copy_tree(const char *from
, const char *to
, uid_t override_uid
, gid_t override_gid
, CopyFlags copy_flags
) {
45 return copy_tree_at_full(AT_FDCWD
, from
, AT_FDCWD
, to
, override_uid
, override_gid
, copy_flags
, NULL
, NULL
, NULL
);
48 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
);
49 static inline int copy_directory_fd(int dirfd
, const char *to
, CopyFlags copy_flags
) {
50 return copy_directory_fd_full(dirfd
, to
, copy_flags
, NULL
, NULL
, NULL
);
53 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
);
54 static inline int copy_directory(const char *from
, const char *to
, CopyFlags copy_flags
) {
55 return copy_directory_full(from
, to
, copy_flags
, NULL
, NULL
, NULL
);
58 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
);
59 static inline int copy_bytes(int fdf
, int fdt
, uint64_t max_bytes
, CopyFlags copy_flags
) {
60 return copy_bytes_full(fdf
, fdt
, max_bytes
, copy_flags
, NULL
, NULL
, NULL
, NULL
);
63 int copy_times(int fdf
, int fdt
, CopyFlags flags
);
64 int copy_xattr(int fdf
, int fdt
);