aboutsummaryrefslogtreecommitdiff
path: root/core/sys/darwin/copyfile.odin
blob: 6c58b8067d572bce7fa77bd4324faa590051ce07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package darwin

import "core:sys/posix"

copyfile_state_t :: distinct rawptr

copyfile_flags :: bit_set[enum {
	ACL,
	STAT,
	XATTR,
	DATA,

	RECURSIVE = 15,

	CHECK,
	EXCL,
	NOFOLLOW_SRC,
	NOFOLLOW_DST,
	MOVE,
	UNLINK,
	PACK,
	UNPACK,

	CLONE,
	CLONE_FORCE,
	RUN_IN_PLACE,
	DATA_SPARSE,
	PRESERVE_DST_TRACKED,
	VERBOSE = 30,
}; u32]

COPYFILE_SECURITY :: copyfile_flags{.STAT, .ACL}
COPYFILE_METADATA :: COPYFILE_SECURITY + copyfile_flags{.XATTR}
COPYFILE_ALL      :: COPYFILE_METADATA + copyfile_flags{.DATA}

COPYFILE_NOFOLLOW :: copyfile_flags{.NOFOLLOW_SRC, .NOFOLLOW_DST}

copyfile_state_flag :: enum u32 {
	SRC_FD = 1,
	SRC_FILENAME,
	DST_FD,
	DST_FILENAME,
	QUARANTINE,
	STATUS_CB,
	STATUS_CTX,
	COPIED,
	XATTRNAME,
	WAS_CLONED,
	SRC_BSIZE,
	DST_BSIZE,
	BSIZE,
	FORBID_CROSS_MOUNT,
	NOCPROTECT,
	PRESERVE_SUID,
	RECURSIVE_SRC_FTSENT,
	FORBID_DST_EXISTING_SYMLINKS,
}

foreign system {
	copyfile  :: proc(from, to: cstring,  state: copyfile_state_t, flags: copyfile_flags) -> i32 ---
	fcopyfile :: proc(from, to: posix.FD, state: copyfile_state_t, flags: copyfile_flags) -> i32 ---

	copyfile_state_alloc :: proc() -> copyfile_state_t ---
	copyfile_state_free  :: proc(state: copyfile_state_t) -> posix.result ---
	copyfile_state_get   :: proc(state: copyfile_state_t, flag: copyfile_state_flag, dst: rawptr) -> posix.result ---
	copyfile_state_set   :: proc(state: copyfile_state_t, flag: copyfile_state_flag, src: rawptr) -> posix.result ---
}