|
@@ -69,7 +69,7 @@ close :: proc "contextless" (fd: Fd) -> (Errno) {
|
|
|
stat :: proc "contextless" (filename: cstring, stat: ^Stat) -> (Errno) {
|
|
|
when size_of(int) == 8 {
|
|
|
when ODIN_ARCH == .arm64 {
|
|
|
- ret := syscall(SYS_fstatat, AT_FDCWD, cast(rawptr) filename, stat)
|
|
|
+ ret := syscall(SYS_fstatat, AT_FDCWD, cast(rawptr) filename, stat, 0)
|
|
|
return Errno(-ret)
|
|
|
} else {
|
|
|
ret := syscall(SYS_stat, cast(rawptr) filename, stat)
|
|
@@ -200,10 +200,25 @@ brk :: proc "contextless" (addr: uintptr) -> (Errno) {
|
|
|
return Errno(-ret)
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ Returns from signal handlers on some archs.
|
|
|
+*/
|
|
|
+rt_sigreturn :: proc "c" () -> ! {
|
|
|
+ intrinsics.syscall(uintptr(SYS_rt_sigreturn))
|
|
|
+ unreachable()
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
Alter an action taken by a process.
|
|
|
*/
|
|
|
-rt_sigaction :: proc "contextless" (sig: Signal, sigaction: ^Sig_Action, old_sigaction: ^Sig_Action) -> Errno {
|
|
|
+rt_sigaction :: proc "contextless" (sig: Signal, sigaction: ^Sig_Action($T), old_sigaction: ^Sig_Action) -> Errno {
|
|
|
+ // NOTE(jason): It appears that the restorer is required for i386 and amd64
|
|
|
+ when ODIN_ARCH == .i386 || ODIN_ARCH == .amd64 {
|
|
|
+ sigaction.flags += {.RESTORER}
|
|
|
+ }
|
|
|
+ if sigaction != nil && sigaction.restorer == nil && .RESTORER in sigaction.flags {
|
|
|
+ sigaction.restorer = rt_sigreturn
|
|
|
+ }
|
|
|
ret := syscall(SYS_rt_sigaction, sig, sigaction, old_sigaction, size_of(Sig_Set))
|
|
|
return Errno(-ret)
|
|
|
}
|
|
@@ -1123,7 +1138,7 @@ ftruncate :: proc "contextless" (fd: Fd, length: i64) -> (Errno) {
|
|
|
ret := syscall(SYS_ftruncate64, fd, compat64_arg_pair(length))
|
|
|
return Errno(-ret)
|
|
|
} else {
|
|
|
- ret := syscall(SYS_truncate, fd, compat64_arg_pair(length))
|
|
|
+ ret := syscall(SYS_ftruncate, fd, compat64_arg_pair(length))
|
|
|
return Errno(-ret)
|
|
|
}
|
|
|
}
|
|
@@ -1231,7 +1246,7 @@ creat :: proc "contextless" (name: cstring, mode: Mode) -> (Fd, Errno) {
|
|
|
*/
|
|
|
link :: proc "contextless" (target: cstring, linkpath: cstring) -> (Errno) {
|
|
|
when ODIN_ARCH == .arm64 {
|
|
|
- ret := syscall(SYS_linkat, AT_FDCWD, cast(rawptr) target, AT_FDCWD, cast(rawptr) linkpath)
|
|
|
+ ret := syscall(SYS_linkat, AT_FDCWD, cast(rawptr) target, AT_FDCWD, cast(rawptr) linkpath, 0)
|
|
|
return Errno(-ret)
|
|
|
} else {
|
|
|
ret := syscall(SYS_link, cast(rawptr) target, cast(rawptr) linkpath)
|
|
@@ -1261,7 +1276,7 @@ unlink :: proc "contextless" (name: cstring) -> (Errno) {
|
|
|
*/
|
|
|
symlink :: proc "contextless" (target: cstring, linkpath: cstring) -> (Errno) {
|
|
|
when ODIN_ARCH == .arm64 {
|
|
|
- ret := syscall(SYS_symlinkat, AT_FDCWD, cast(rawptr) target, cast(rawptr) linkpath)
|
|
|
+ ret := syscall(SYS_symlinkat, cast(rawptr) target, AT_FDCWD, cast(rawptr) linkpath)
|
|
|
return Errno(-ret)
|
|
|
} else {
|
|
|
ret := syscall(SYS_symlink, cast(rawptr) target, cast(rawptr) linkpath)
|
|
@@ -1291,7 +1306,7 @@ readlink :: proc "contextless" (name: cstring, buf: []u8) -> (int, Errno) {
|
|
|
*/
|
|
|
chmod :: proc "contextless" (name: cstring, mode: Mode) -> (Errno) {
|
|
|
when ODIN_ARCH == .arm64 {
|
|
|
- ret := syscall(SYS_fchmodat, cast(rawptr) name, transmute(u32) mode, 0)
|
|
|
+ ret := syscall(SYS_fchmodat, AT_FDCWD, cast(rawptr) name, transmute(u32) mode)
|
|
|
return Errno(-ret)
|
|
|
} else {
|
|
|
ret := syscall(SYS_chmod, cast(rawptr) name, transmute(u32) mode)
|
|
@@ -2476,8 +2491,8 @@ tgkill :: proc "contextless" (tgid, tid: Pid, sig: Signal) -> (Errno) {
|
|
|
Wait on process, process group or pid file descriptor.
|
|
|
Available since Linux 2.6.10.
|
|
|
*/
|
|
|
-waitid :: proc "contextless" (id_type: Id_Type, id: Id, sig_info: ^Sig_Info, options: Wait_Options) -> (Errno) {
|
|
|
- ret := syscall(SYS_waitid, id_type, id, sig_info, transmute(i32) options)
|
|
|
+waitid :: proc "contextless" (id_type: Id_Type, id: Id, sig_info: ^Sig_Info, options: Wait_Options, rusage: ^RUsage) -> (Errno) {
|
|
|
+ ret := syscall(SYS_waitid, id_type, id, sig_info, transmute(i32) options, rusage)
|
|
|
return Errno(-ret)
|
|
|
}
|
|
|
|
|
@@ -2504,7 +2519,7 @@ waitid :: proc "contextless" (id_type: Id_Type, id: Id, sig_info: ^Sig_Info, opt
|
|
|
Available since Linux 2.6.16.
|
|
|
*/
|
|
|
openat :: proc "contextless" (fd: Fd, name: cstring, flags: Open_Flags, mode: Mode = {}) -> (Fd, Errno) {
|
|
|
- ret := syscall(SYS_openat, fd, AT_FDCWD, transmute(uintptr) name, transmute(u32) mode)
|
|
|
+ ret := syscall(SYS_openat, fd, transmute(uintptr) name, transmute(u32) flags, transmute(u32) mode)
|
|
|
return errno_unwrap(ret, Fd)
|
|
|
}
|
|
|
|
|
@@ -2583,8 +2598,8 @@ linkat :: proc "contextless" (target_dirfd: Fd, oldpath: cstring, link_dirfd: Fd
|
|
|
Create a symbolic link at specified dirfd.
|
|
|
Available since Linux 2.6.16.
|
|
|
*/
|
|
|
-symlinkat :: proc "contextless" (dirfd: Fd, target: cstring, linkpath: cstring) -> (Errno) {
|
|
|
- ret := syscall(SYS_symlinkat, dirfd, cast(rawptr) target, cast(rawptr) linkpath)
|
|
|
+symlinkat :: proc "contextless" (target: cstring, dirfd: Fd, linkpath: cstring) -> (Errno) {
|
|
|
+ ret := syscall(SYS_symlinkat, cast(rawptr) target, dirfd, cast(rawptr) linkpath)
|
|
|
return Errno(-ret)
|
|
|
}
|
|
|
|
|
@@ -2619,13 +2634,13 @@ faccessat :: proc "contextless" (dirfd: Fd, name: cstring, mode: Mode = F_OK) ->
|
|
|
Wait for events on a file descriptor.
|
|
|
Available since Linux 2.6.16.
|
|
|
*/
|
|
|
-ppoll :: proc "contextless" (fds: []Poll_Fd, timeout: ^Time_Spec, sigmask: ^Sig_Set) -> (Errno) {
|
|
|
+ppoll :: proc "contextless" (fds: []Poll_Fd, timeout: ^Time_Spec, sigmask: ^Sig_Set) -> (i32, Errno) {
|
|
|
when size_of(int) == 8 {
|
|
|
ret := syscall(SYS_ppoll, raw_data(fds), len(fds), timeout, sigmask, size_of(Sig_Set))
|
|
|
- return Errno(-ret)
|
|
|
+ return errno_unwrap(ret, i32)
|
|
|
} else {
|
|
|
ret := syscall(SYS_ppoll_time64, raw_data(fds), len(fds), timeout, sigmask, size_of(Sig_Set))
|
|
|
- return Errno(-ret)
|
|
|
+ return errno_unwrap(ret, i32)
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2808,8 +2823,8 @@ getrandom :: proc "contextless" (buf: []u8, flags: Get_Random_Flags) -> (int, Er
|
|
|
Execute program relative to a directory file descriptor.
|
|
|
Available since Linux 3.19.
|
|
|
*/
|
|
|
-execveat :: proc "contextless" (dirfd: Fd, name: cstring, argv: [^]cstring, envp: [^]cstring) -> (Errno) {
|
|
|
- ret := syscall(SYS_execveat, dirfd, cast(rawptr) name, cast(rawptr) argv, cast(rawptr) envp)
|
|
|
+execveat :: proc "contextless" (dirfd: Fd, name: cstring, argv: [^]cstring, envp: [^]cstring, flags: FD_Flags = {}) -> (Errno) {
|
|
|
+ ret := syscall(SYS_execveat, dirfd, cast(rawptr) name, cast(rawptr) argv, cast(rawptr) envp, transmute(i32) flags)
|
|
|
return Errno(-ret)
|
|
|
}
|
|
|
|