aboutsummaryrefslogtreecommitdiff
path: root/core/sys/darwin
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2025-05-03 13:29:37 +0200
committerLaytan Laats <laytanlaats@hotmail.com>2025-05-08 19:32:30 +0200
commitcacb9f9f540b7ffa93d7fd0d0e1b4667be42480f (patch)
treee408053c01ece60aa08cd48f9ae49a460b680042 /core/sys/darwin
parentedbe7aa06e5e9afc833ba85a94597f1a0a568747 (diff)
os2: better copy_directory, and add native copy_file and copy_directory variants on MacOS
Diffstat (limited to 'core/sys/darwin')
-rw-r--r--core/sys/darwin/copyfile.odin67
-rw-r--r--core/sys/darwin/darwin.odin1
-rw-r--r--core/sys/darwin/sync.odin2
-rw-r--r--core/sys/darwin/xnu_system_call_wrappers.odin10
4 files changed, 68 insertions, 12 deletions
diff --git a/core/sys/darwin/copyfile.odin b/core/sys/darwin/copyfile.odin
new file mode 100644
index 000000000..6c58b8067
--- /dev/null
+++ b/core/sys/darwin/copyfile.odin
@@ -0,0 +1,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 ---
+}
diff --git a/core/sys/darwin/darwin.odin b/core/sys/darwin/darwin.odin
index d109f5544..96cfc7be6 100644
--- a/core/sys/darwin/darwin.odin
+++ b/core/sys/darwin/darwin.odin
@@ -3,6 +3,7 @@ package darwin
import "core:c"
+@(export)
foreign import system "system:System.framework"
Bool :: b8
diff --git a/core/sys/darwin/sync.odin b/core/sys/darwin/sync.odin
index 58fc7c9e4..6d68dc8f8 100644
--- a/core/sys/darwin/sync.odin
+++ b/core/sys/darwin/sync.odin
@@ -1,7 +1,5 @@
package darwin
-foreign import system "system:System.framework"
-
// #define OS_WAIT_ON_ADDR_AVAILABILITY \
// __API_AVAILABLE(macos(14.4), ios(17.4), tvos(17.4), watchos(10.4))
when ODIN_OS == .Darwin {
diff --git a/core/sys/darwin/xnu_system_call_wrappers.odin b/core/sys/darwin/xnu_system_call_wrappers.odin
index 1188091a9..6376949f4 100644
--- a/core/sys/darwin/xnu_system_call_wrappers.odin
+++ b/core/sys/darwin/xnu_system_call_wrappers.odin
@@ -19,16 +19,6 @@ X_OK :: c.int((1 << 0)) /* test for execute or search permission */
W_OK :: c.int((1 << 1)) /* test for write permission */
R_OK :: c.int((1 << 2)) /* test for read permission */
-/* copyfile flags */
-COPYFILE_ACL :: (1 << 0)
-COPYFILE_STAT :: (1 << 1)
-COPYFILE_XATTR :: (1 << 2)
-COPYFILE_DATA :: (1 << 3)
-
-COPYFILE_SECURITY :: (COPYFILE_STAT | COPYFILE_ACL)
-COPYFILE_METADATA :: (COPYFILE_SECURITY | COPYFILE_XATTR)
-COPYFILE_ALL :: (COPYFILE_METADATA | COPYFILE_DATA)
-
/* syslimits.h */
PATH_MAX :: 1024 /* max bytes in pathname */