aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCiD- <jkercher43@gmail.com>2022-04-01 22:41:35 -0400
committerCiD- <jkercher43@gmail.com>2022-04-01 22:41:35 -0400
commit88de3a1c0633761e2f73f4e576a0dfd2bb9c32bf (patch)
tree4c6b77281d88fa86b17c69e1847d74a7e6224c89
parent645661889137f6f4cb96b9671976dbc006345497 (diff)
add _chtimes
-rw-r--r--core/os/os2/file_linux.odin10
-rw-r--r--core/sys/unix/syscalls_linux.odin6
2 files changed, 14 insertions, 2 deletions
diff --git a/core/os/os2/file_linux.odin b/core/os/os2/file_linux.odin
index 3202b9e16..89075e00c 100644
--- a/core/os/os2/file_linux.odin
+++ b/core/os/os2/file_linux.odin
@@ -27,6 +27,8 @@ _O_SYNC :: 0o4010000
_O_CLOEXEC :: 0o2000000
_O_PATH :: 0o10000000
+_AT_FDCWD :: -100
+
_open :: proc(name: string, flags: File_Flags, perm: File_Mode) -> (Handle, Error) {
cstr := strings.clone_to_cstring(name, context.temp_allocator)
@@ -250,8 +252,12 @@ _lchown :: proc(name: string, uid, gid: int) -> Error {
}
_chtimes :: proc(name: string, atime, mtime: time.Time) -> Error {
- //TODO
- return nil
+ name_cstr := strings.clone_to_cstring(name, context.temp_allocator)
+ times := [2]Unix_File_Time {
+ { atime._nsec, 0 },
+ { mtime._nsec, 0 },
+ }
+ return _ok_or_error(unix.sys_utimensat(_AT_FDCWD, name_cstr, &times, 0))
}
_exists :: proc(name: string) -> bool {
diff --git a/core/sys/unix/syscalls_linux.odin b/core/sys/unix/syscalls_linux.odin
index 8a1aadb9c..6fc6dc594 100644
--- a/core/sys/unix/syscalls_linux.odin
+++ b/core/sys/unix/syscalls_linux.odin
@@ -1779,6 +1779,12 @@ sys_fork :: proc() -> int {
}
}
+// NOTE: Unsure about if this works directly on 32 bit archs. It may need 32 bit version of the time struct.
+// As of Linux 5.1, there is a utimensat_time64 function. Maybe use this in the future?
+sys_utimensat :: proc(dfd: int, path: cstring, times: rawptr, flags: int) -> int {
+ return int(intrinsics.syscall(SYS_utimensat, uintptr(dfd), uintptr(rawptr(path)), uintptr(times), uintptr(flags)))
+}
+
get_errno :: proc(res: int) -> i32 {
if res < 0 && res > -4096 {
return i32(-res)