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 */
19 typedef int (*copy_progress_bytes_t
)(uint64_t n_bytes
, void *userdata
);
20 typedef int (*copy_progress_path_t
)(const char *path
, const struct stat
*st
, void *userdata
);
22 int copy_file_fd_full(const char *from
, int to
, CopyFlags copy_flags
, copy_progress_bytes_t progress
, void *userdata
);
23 static inline int copy_file_fd(const char *from
, int to
, CopyFlags copy_flags
) {
24 return copy_file_fd_full(from
, to
, copy_flags
, NULL
, NULL
);
27 int copy_file_full(const char *from
, const char *to
, int open_flags
, mode_t mode
, unsigned chattr_flags
, CopyFlags copy_flags
, copy_progress_bytes_t progress
, void *userdata
);
28 static inline int copy_file(const char *from
, const char *to
, int open_flags
, mode_t mode
, unsigned chattr_flags
, CopyFlags copy_flags
) {
29 return copy_file_full(from
, to
, open_flags
, mode
, chattr_flags
, copy_flags
, NULL
, NULL
);
32 int copy_file_atomic_full(const char *from
, const char *to
, mode_t mode
, unsigned chattr_flags
, CopyFlags copy_flags
, copy_progress_bytes_t progress
, void *userdata
);
33 static inline int copy_file_atomic(const char *from
, const char *to
, mode_t mode
, unsigned chattr_flags
, CopyFlags copy_flags
) {
34 return copy_file_atomic_full(from
, to
, mode
, chattr_flags
, copy_flags
, NULL
, NULL
);
37 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
);
38 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
) {
39 return copy_tree_at_full(fdf
, from
, fdt
, to
, override_uid
, override_gid
, copy_flags
, NULL
, NULL
, NULL
);
41 static inline int copy_tree(const char *from
, const char *to
, uid_t override_uid
, gid_t override_gid
, CopyFlags copy_flags
) {
42 return copy_tree_at_full(AT_FDCWD
, from
, AT_FDCWD
, to
, override_uid
, override_gid
, copy_flags
, NULL
, NULL
, NULL
);
45 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
);
46 static inline int copy_directory_fd(int dirfd
, const char *to
, CopyFlags copy_flags
) {
47 return copy_directory_fd_full(dirfd
, to
, copy_flags
, NULL
, NULL
, NULL
);
50 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
);
51 static inline int copy_directory(const char *from
, const char *to
, CopyFlags copy_flags
) {
52 return copy_directory_full(from
, to
, copy_flags
, NULL
, NULL
, NULL
);
55 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
);
56 static inline int copy_bytes(int fdf
, int fdt
, uint64_t max_bytes
, CopyFlags copy_flags
) {
57 return copy_bytes_full(fdf
, fdt
, max_bytes
, copy_flags
, NULL
, NULL
, NULL
, NULL
);
60 int copy_times(int fdf
, int fdt
);
61 int copy_xattr(int fdf
, int fdt
);