diff --git a/lib/c.zig b/lib/c.zig index 31176d04c3..681a6f73a5 100644 --- a/lib/c.zig +++ b/lib/c.zig @@ -26,6 +26,7 @@ comptime { _ = @import("c/wchar.zig"); _ = @import("c/sys.zig"); + _ = @import("c/unistd.zig"); if (builtin.target.isMuslLibC() or builtin.target.isWasiLibC()) { // Files specific to musl and wasi-libc. diff --git a/lib/c/sys.zig b/lib/c/sys.zig index d19baf1b0e..71e068616b 100644 --- a/lib/c/sys.zig +++ b/lib/c/sys.zig @@ -1,3 +1,7 @@ comptime { + _ = @import("sys/mman.zig"); + _ = @import("sys/file.zig"); + _ = @import("sys/reboot.zig"); + _ = @import("sys/capability.zig"); _ = @import("sys/utsname.zig"); } diff --git a/lib/c/sys/capability.zig b/lib/c/sys/capability.zig new file mode 100644 index 0000000000..19718a45e3 --- /dev/null +++ b/lib/c/sys/capability.zig @@ -0,0 +1,18 @@ +const std = @import("std"); +const common = @import("../common.zig"); +const builtin = @import("builtin"); + +comptime { + if (builtin.target.isMuslLibC()) { + @export(&capsetLinux, .{ .name = "capset", .linkage = common.linkage, .visibility = common.visibility }); + @export(&capgetLinux, .{ .name = "capget", .linkage = common.linkage, .visibility = common.visibility }); + } +} + +fn capsetLinux(hdrp: *anyopaque, datap: *anyopaque) callconv(.c) c_int { + return common.errno(std.os.linux.capset(@ptrCast(@alignCast(hdrp)), @ptrCast(@alignCast(datap)))); +} + +fn capgetLinux(hdrp: *anyopaque, datap: *anyopaque) callconv(.c) c_int { + return common.errno(std.os.linux.capget(@ptrCast(@alignCast(hdrp)), @ptrCast(@alignCast(datap)))); +} diff --git a/lib/c/sys/file.zig b/lib/c/sys/file.zig new file mode 100644 index 0000000000..643d3fcd03 --- /dev/null +++ b/lib/c/sys/file.zig @@ -0,0 +1,13 @@ +const std = @import("std"); +const common = @import("../common.zig"); +const builtin = @import("builtin"); + +comptime { + if (builtin.target.isMuslLibC()) { + @export(&flockLinux, .{ .name = "flock", .linkage = common.linkage, .visibility = common.visibility }); + } +} + +fn flockLinux(fd: c_int, operation: c_int) callconv(.c) c_int { + return common.errno(std.os.linux.flock(fd, operation)); +} diff --git a/lib/c/sys/mman.zig b/lib/c/sys/mman.zig new file mode 100644 index 0000000000..92de9ad076 --- /dev/null +++ b/lib/c/sys/mman.zig @@ -0,0 +1,59 @@ +const std = @import("std"); +const common = @import("../common.zig"); +const builtin = @import("builtin"); + +comptime { + if (builtin.target.isMuslLibC()) { + @export(&madviseLinux, .{ .name = "madvise", .linkage = common.linkage, .visibility = common.visibility }); + @export(&madviseLinux, .{ .name = "__madvise", .linkage = common.linkage, .visibility = common.visibility }); + + @export(&mincoreLinux, .{ .name = "mincore", .linkage = common.linkage, .visibility = common.visibility }); + + @export(&mlockLinux, .{ .name = "mlock", .linkage = common.linkage, .visibility = common.visibility }); + @export(&mlockallLinux, .{ .name = "mlockall", .linkage = common.linkage, .visibility = common.visibility }); + + @export(&mprotectLinux, .{ .name = "mprotect", .linkage = common.linkage, .visibility = common.visibility }); + @export(&mprotectLinux, .{ .name = "__mprotect", .linkage = common.linkage, .visibility = common.visibility }); + + @export(&munlockLinux, .{ .name = "munlock", .linkage = common.linkage, .visibility = common.visibility }); + @export(&munlockallLinux, .{ .name = "munlockall", .linkage = common.linkage, .visibility = common.visibility }); + + @export(&posix_madviseLinux, .{ .name = "posix_madvise", .linkage = common.linkage, .visibility = common.visibility }); + } +} + +fn madviseLinux(addr: *anyopaque, len: usize, advice: c_int) callconv(.c) c_int { + return common.errno(std.os.linux.madvise(@ptrCast(addr), len, @bitCast(advice))); +} + +fn mincoreLinux(addr: *anyopaque, len: usize, vec: [*]u8) callconv(.c) c_int { + return common.errno(std.os.linux.mincore(@ptrCast(addr), len, vec)); +} + +fn mlockLinux(addr: *const anyopaque, len: usize) callconv(.c) c_int { + return common.errno(std.os.linux.mlock(@ptrCast(addr), len)); +} + +fn mlockallLinux(flags: c_int) callconv(.c) c_int { + return common.errno(std.os.linux.mlockall(@bitCast(flags))); +} + +fn mprotectLinux(addr: *anyopaque, len: usize, prot: c_int) callconv(.c) c_int { + const page_size = std.heap.pageSize(); + const start = std.mem.alignBackward(usize, @intFromPtr(addr), page_size); + const aligned_len = std.mem.alignForward(usize, len, page_size); + return common.errno(std.os.linux.mprotect(@ptrFromInt(start), aligned_len, @bitCast(prot))); +} + +fn munlockLinux(addr: *const anyopaque, len: usize) callconv(.c) c_int { + return common.errno(std.os.linux.munlock(@ptrCast(addr), len)); +} + +fn munlockallLinux() callconv(.c) c_int { + return common.errno(std.os.linux.munlockall()); +} + +fn posix_madviseLinux(addr: *anyopaque, len: usize, advice: c_int) callconv(.c) c_int { + if (advice == std.os.linux.MADV.DONTNEED) return 0; + return @intCast(-@as(isize, @bitCast(std.os.linux.madvise(@ptrCast(addr), len, @bitCast(advice))))); +} diff --git a/lib/c/sys/reboot.zig b/lib/c/sys/reboot.zig new file mode 100644 index 0000000000..8b7b0503bd --- /dev/null +++ b/lib/c/sys/reboot.zig @@ -0,0 +1,13 @@ +const std = @import("std"); +const common = @import("../common.zig"); +const builtin = @import("builtin"); + +comptime { + if (builtin.target.isMuslLibC()) { + @export(&rebootLinux, .{ .name = "reboot", .linkage = common.linkage, .visibility = common.visibility }); + } +} + +fn rebootLinux(cmd: c_int) callconv(.c) c_int { + return common.errno(std.os.linux.reboot(.MAGIC1, .MAGIC2, @enumFromInt(cmd), null)); +} diff --git a/lib/c/unistd.zig b/lib/c/unistd.zig new file mode 100644 index 0000000000..f903ef78a8 --- /dev/null +++ b/lib/c/unistd.zig @@ -0,0 +1,183 @@ +const std = @import("std"); +const common = @import("common.zig"); +const builtin = @import("builtin"); +const linux = std.os.linux; + +comptime { + if (builtin.target.isMuslLibC()) { + @export(&_exit, .{ .name = "_exit", .linkage = common.linkage, .visibility = common.visibility }); + + @export(&accessLinux, .{ .name = "access", .linkage = common.linkage, .visibility = common.visibility }); + @export(&acctLinux, .{ .name = "acct", .linkage = common.linkage, .visibility = common.visibility }); + @export(&chdirLinux, .{ .name = "chdir", .linkage = common.linkage, .visibility = common.visibility }); + @export(&chownLinux, .{ .name = "chown", .linkage = common.linkage, .visibility = common.visibility }); + @export(&fchownatLinux, .{ .name = "fchownat", .linkage = common.linkage, .visibility = common.visibility }); + @export(&lchownLinux, .{ .name = "lchown", .linkage = common.linkage, .visibility = common.visibility }); + @export(&chrootLinux, .{ .name = "chroot", .linkage = common.linkage, .visibility = common.visibility }); + @export(&ctermidLinux, .{ .name = "ctermid", .linkage = common.linkage, .visibility = common.visibility }); + @export(&dupLinux, .{ .name = "dup", .linkage = common.linkage, .visibility = common.visibility }); + + @export(&getegidLinux, .{ .name = "getegid", .linkage = common.linkage, .visibility = common.visibility }); + @export(&geteuidLinux, .{ .name = "geteuid", .linkage = common.linkage, .visibility = common.visibility }); + @export(&getgidLinux, .{ .name = "getgid", .linkage = common.linkage, .visibility = common.visibility }); + @export(&getgroupsLinux, .{ .name = "getgroups", .linkage = common.linkage, .visibility = common.visibility }); + @export(&getpgidLinux, .{ .name = "getpgid", .linkage = common.linkage, .visibility = common.visibility }); + @export(&getpgrpLinux, .{ .name = "getpgrp", .linkage = common.linkage, .visibility = common.visibility }); + @export(&setpgidLinux, .{ .name = "setpgid", .linkage = common.linkage, .visibility = common.visibility }); + @export(&setpgrpLinux, .{ .name = "setpgrp", .linkage = common.linkage, .visibility = common.visibility }); + @export(&getsidLinux, .{ .name = "getsid", .linkage = common.linkage, .visibility = common.visibility }); + @export(&getpidLinux, .{ .name = "getpid", .linkage = common.linkage, .visibility = common.visibility }); + @export(&getppidLinux, .{ .name = "getppid", .linkage = common.linkage, .visibility = common.visibility }); + @export(&getuidLinux, .{ .name = "getuid", .linkage = common.linkage, .visibility = common.visibility }); + + @export(&rmdirLinux, .{ .name = "rmdir", .linkage = common.linkage, .visibility = common.visibility }); + @export(&linkLinux, .{ .name = "link", .linkage = common.linkage, .visibility = common.visibility }); + @export(&linkatLinux, .{ .name = "linkat", .linkage = common.linkage, .visibility = common.visibility }); + @export(&pipeLinux, .{ .name = "pipe", .linkage = common.linkage, .visibility = common.visibility }); + @export(&renameatLinux, .{ .name = "renameat", .linkage = common.linkage, .visibility = common.visibility }); + @export(&symlinkLinux, .{ .name = "symlink", .linkage = common.linkage, .visibility = common.visibility }); + @export(&symlinkatLinux, .{ .name = "symlinkat", .linkage = common.linkage, .visibility = common.visibility }); + @export(&syncLinux, .{ .name = "sync", .linkage = common.linkage, .visibility = common.visibility }); + @export(&unlinkLinux, .{ .name = "unlink", .linkage = common.linkage, .visibility = common.visibility }); + @export(&unlinkatLinux, .{ .name = "unlinkat", .linkage = common.linkage, .visibility = common.visibility }); + + @export(&execveLinux, .{ .name = "execve", .linkage = common.linkage, .visibility = common.visibility }); + } +} + +fn _exit(exit_code: c_int) callconv(.c) noreturn { + std.c._Exit(exit_code); +} + +fn accessLinux(path: [*:0]const c_char, amode: c_int) callconv(.c) c_int { + return common.errno(linux.access(@ptrCast(path), @bitCast(amode))); +} + +fn acctLinux(path: [*:0]const c_char) callconv(.c) c_int { + return common.errno(linux.acct(@ptrCast(path))); +} + +fn chdirLinux(path: [*:0]const c_char) callconv(.c) c_int { + return common.errno(linux.chdir(@ptrCast(path))); +} + +fn chownLinux(path: [*:0]const c_char, uid: linux.uid_t, gid: linux.gid_t) callconv(.c) c_int { + return common.errno(linux.chown(@ptrCast(path), uid, gid)); +} + +fn fchownatLinux(fd: c_int, path: [*:0]const c_char, uid: linux.uid_t, gid: linux.gid_t, flags: c_int) callconv(.c) c_int { + return common.errno(linux.fchownat(fd, @ptrCast(path), uid, gid, @bitCast(flags))); +} + +fn lchownLinux(path: [*:0]const c_char, uid: linux.uid_t, gid: linux.gid_t) callconv(.c) c_int { + return common.errno(linux.lchown(@ptrCast(path), uid, gid)); +} + +fn chrootLinux(path: [*:0]const c_char) callconv(.c) c_int { + return common.errno(linux.chroot(@ptrCast(path))); +} + +fn ctermidLinux(maybe_path: ?[*]c_char) callconv(.c) [*:0]c_char { + const default_tty = "/dev/tty"; + + return if (maybe_path) |path| blk: { + path[0..(default_tty.len + 1)].* = @bitCast(default_tty.*); + break :blk path[0..default_tty.len :0].ptr; + } else @ptrCast(@constCast(default_tty)); +} + +fn dupLinux(fd: c_int) callconv(.c) c_int { + return common.errno(linux.dup(fd)); +} + +fn getegidLinux() callconv(.c) linux.gid_t { + return linux.getegid(); +} + +fn geteuidLinux() callconv(.c) linux.uid_t { + return linux.geteuid(); +} + +fn getgidLinux() callconv(.c) linux.gid_t { + return linux.getgid(); +} + +fn getgroupsLinux(size: c_int, list: ?[*]linux.gid_t) callconv(.c) c_int { + return common.errno(linux.getgroups(@intCast(size), list)); +} + +fn getpgidLinux(pid: linux.pid_t) callconv(.c) linux.pid_t { + return common.errno(linux.getpgid(pid)); +} + +fn getpgrpLinux() callconv(.c) linux.pid_t { + return @intCast(linux.getpgid(0)); // @intCast as it cannot fail +} + +fn setpgidLinux(pid: linux.pid_t, pgid: linux.pid_t) callconv(.c) c_int { + return common.errno(linux.setpgid(pid, pgid)); +} + +fn setpgrpLinux() callconv(.c) linux.pid_t { + return @intCast(linux.setpgid(0, 0)); // @intCast as it cannot fail +} + +fn getpidLinux() callconv(.c) linux.pid_t { + return linux.getpid(); +} + +fn getppidLinux() callconv(.c) linux.pid_t { + return linux.getppid(); +} + +fn getsidLinux(pid: linux.pid_t) callconv(.c) linux.pid_t { + return common.errno(linux.getsid(pid)); +} + +fn getuidLinux() callconv(.c) linux.uid_t { + return linux.getuid(); +} + +fn linkLinux(old: [*:0]const c_char, new: [*:0]const c_char) callconv(.c) c_int { + return common.errno(linux.link(@ptrCast(old), @ptrCast(new))); +} + +fn linkatLinux(old_fd: c_int, old: [*:0]const c_char, new_fd: c_int, new: [*:0]const c_char, flags: c_int) callconv(.c) c_int { + return common.errno(linux.linkat(old_fd, @ptrCast(old), new_fd, @ptrCast(new), @bitCast(flags))); +} + +fn pipeLinux(fd: *[2]c_int) callconv(.c) c_int { + return common.errno(linux.pipe(@ptrCast(fd))); +} + +fn renameatLinux(old_fd: c_int, old: [*:0]const c_char, new_fd: c_int, new: [*:0]const c_char) callconv(.c) c_int { + return common.errno(linux.renameat(old_fd, @ptrCast(old), new_fd, @ptrCast(new))); +} + +fn rmdirLinux(path: [*:0]const c_char) callconv(.c) c_int { + return common.errno(linux.rmdir(@ptrCast(path))); +} + +fn symlinkLinux(existing: [*:0]const c_char, new: [*:0]const c_char) callconv(.c) c_int { + return common.errno(linux.symlink(@ptrCast(existing), @ptrCast(new))); +} + +fn symlinkatLinux(existing: [*:0]const c_char, fd: c_int, new: [*:0]const c_char) callconv(.c) c_int { + return common.errno(linux.symlinkat(@ptrCast(existing), fd, @ptrCast(new))); +} + +fn syncLinux() callconv(.c) void { + linux.sync(); +} + +fn unlinkLinux(path: [*:0]const c_char) callconv(.c) c_int { + return common.errno(linux.unlink(@ptrCast(path))); +} + +fn unlinkatLinux(fd: c_int, path: [*:0]const c_char, flags: c_int) callconv(.c) c_int { + return common.errno(linux.unlinkat(fd, @ptrCast(path), @bitCast(flags))); +} + +fn execveLinux(path: [*:0]const c_char, argv: [*:null]const ?[*:0]c_char, envp: [*:null]const ?[*:0]c_char) callconv(.c) c_int { + return common.errno(linux.execve(@ptrCast(path), @ptrCast(argv), @ptrCast(envp))); +} diff --git a/lib/libc/musl/src/linux/cap.c b/lib/libc/musl/src/linux/cap.c deleted file mode 100644 index 8d035e07a4..0000000000 --- a/lib/libc/musl/src/linux/cap.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "syscall.h" - -int capset(void *a, void *b) -{ - return syscall(SYS_capset, a, b); -} - -int capget(void *a, void *b) -{ - return syscall(SYS_capget, a, b); -} diff --git a/lib/libc/musl/src/linux/chroot.c b/lib/libc/musl/src/linux/chroot.c deleted file mode 100644 index 0e69f145de..0000000000 --- a/lib/libc/musl/src/linux/chroot.c +++ /dev/null @@ -1,8 +0,0 @@ -#define _GNU_SOURCE -#include -#include "syscall.h" - -int chroot(const char *path) -{ - return syscall(SYS_chroot, path); -} diff --git a/lib/libc/musl/src/linux/flock.c b/lib/libc/musl/src/linux/flock.c deleted file mode 100644 index 87aa5cfed2..0000000000 --- a/lib/libc/musl/src/linux/flock.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -int flock(int fd, int op) -{ - return syscall(SYS_flock, fd, op); -} diff --git a/lib/libc/musl/src/linux/reboot.c b/lib/libc/musl/src/linux/reboot.c deleted file mode 100644 index 7f12af79bc..0000000000 --- a/lib/libc/musl/src/linux/reboot.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -int reboot(int type) -{ - return syscall(SYS_reboot, 0xfee1dead, 672274793, type); -} diff --git a/lib/libc/musl/src/mman/madvise.c b/lib/libc/musl/src/mman/madvise.c deleted file mode 100644 index e0c7c0ec92..0000000000 --- a/lib/libc/musl/src/mman/madvise.c +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include "syscall.h" - -int __madvise(void *addr, size_t len, int advice) -{ - return syscall(SYS_madvise, addr, len, advice); -} - -weak_alias(__madvise, madvise); diff --git a/lib/libc/musl/src/mman/mincore.c b/lib/libc/musl/src/mman/mincore.c deleted file mode 100644 index 4bb19f857c..0000000000 --- a/lib/libc/musl/src/mman/mincore.c +++ /dev/null @@ -1,8 +0,0 @@ -#define _GNU_SOURCE -#include -#include "syscall.h" - -int mincore (void *addr, size_t len, unsigned char *vec) -{ - return syscall(SYS_mincore, addr, len, vec); -} diff --git a/lib/libc/musl/src/mman/mlock.c b/lib/libc/musl/src/mman/mlock.c deleted file mode 100644 index 71af582fe6..0000000000 --- a/lib/libc/musl/src/mman/mlock.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include "syscall.h" - -int mlock(const void *addr, size_t len) -{ -#ifdef SYS_mlock - return syscall(SYS_mlock, addr, len); -#else - return syscall(SYS_mlock2, addr, len, 0); -#endif -} diff --git a/lib/libc/musl/src/mman/mlockall.c b/lib/libc/musl/src/mman/mlockall.c deleted file mode 100644 index 0ba4e662c8..0000000000 --- a/lib/libc/musl/src/mman/mlockall.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -int mlockall(int flags) -{ - return syscall(SYS_mlockall, flags); -} diff --git a/lib/libc/musl/src/mman/mprotect.c b/lib/libc/musl/src/mman/mprotect.c deleted file mode 100644 index 535787b9ec..0000000000 --- a/lib/libc/musl/src/mman/mprotect.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include "libc.h" -#include "syscall.h" - -int __mprotect(void *addr, size_t len, int prot) -{ - size_t start, end; - start = (size_t)addr & -PAGE_SIZE; - end = (size_t)((char *)addr + len + PAGE_SIZE-1) & -PAGE_SIZE; - return syscall(SYS_mprotect, start, end-start, prot); -} - -weak_alias(__mprotect, mprotect); diff --git a/lib/libc/musl/src/mman/munlock.c b/lib/libc/musl/src/mman/munlock.c deleted file mode 100644 index 2cccef0c50..0000000000 --- a/lib/libc/musl/src/mman/munlock.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -int munlock(const void *addr, size_t len) -{ - return syscall(SYS_munlock, addr, len); -} diff --git a/lib/libc/musl/src/mman/munlockall.c b/lib/libc/musl/src/mman/munlockall.c deleted file mode 100644 index 6e9d39d684..0000000000 --- a/lib/libc/musl/src/mman/munlockall.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -int munlockall(void) -{ - return syscall(SYS_munlockall); -} diff --git a/lib/libc/musl/src/mman/posix_madvise.c b/lib/libc/musl/src/mman/posix_madvise.c deleted file mode 100644 index e5e5acb84a..0000000000 --- a/lib/libc/musl/src/mman/posix_madvise.c +++ /dev/null @@ -1,9 +0,0 @@ -#define _GNU_SOURCE -#include -#include "syscall.h" - -int posix_madvise(void *addr, size_t len, int advice) -{ - if (advice == MADV_DONTNEED) return 0; - return -__syscall(SYS_madvise, addr, len, advice); -} diff --git a/lib/libc/musl/src/process/execve.c b/lib/libc/musl/src/process/execve.c deleted file mode 100644 index 70286a1739..0000000000 --- a/lib/libc/musl/src/process/execve.c +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include "syscall.h" - -int execve(const char *path, char *const argv[], char *const envp[]) -{ - /* do we need to use environ if envp is null? */ - return syscall(SYS_execve, path, argv, envp); -} diff --git a/lib/libc/musl/src/unistd/_exit.c b/lib/libc/musl/src/unistd/_exit.c deleted file mode 100644 index 769948232e..0000000000 --- a/lib/libc/musl/src/unistd/_exit.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -_Noreturn void _exit(int status) -{ - _Exit(status); -} diff --git a/lib/libc/musl/src/unistd/access.c b/lib/libc/musl/src/unistd/access.c deleted file mode 100644 index d6eed68398..0000000000 --- a/lib/libc/musl/src/unistd/access.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include -#include "syscall.h" - -int access(const char *filename, int amode) -{ -#ifdef SYS_access - return syscall(SYS_access, filename, amode); -#else - return syscall(SYS_faccessat, AT_FDCWD, filename, amode, 0); -#endif -} diff --git a/lib/libc/musl/src/unistd/acct.c b/lib/libc/musl/src/unistd/acct.c deleted file mode 100644 index 308ffc3821..0000000000 --- a/lib/libc/musl/src/unistd/acct.c +++ /dev/null @@ -1,8 +0,0 @@ -#define _GNU_SOURCE -#include -#include "syscall.h" - -int acct(const char *filename) -{ - return syscall(SYS_acct, filename); -} diff --git a/lib/libc/musl/src/unistd/chdir.c b/lib/libc/musl/src/unistd/chdir.c deleted file mode 100644 index 5ba78b6317..0000000000 --- a/lib/libc/musl/src/unistd/chdir.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -int chdir(const char *path) -{ - return syscall(SYS_chdir, path); -} diff --git a/lib/libc/musl/src/unistd/chown.c b/lib/libc/musl/src/unistd/chown.c deleted file mode 100644 index 14b032550d..0000000000 --- a/lib/libc/musl/src/unistd/chown.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include -#include "syscall.h" - -int chown(const char *path, uid_t uid, gid_t gid) -{ -#ifdef SYS_chown - return syscall(SYS_chown, path, uid, gid); -#else - return syscall(SYS_fchownat, AT_FDCWD, path, uid, gid, 0); -#endif -} diff --git a/lib/libc/musl/src/unistd/ctermid.c b/lib/libc/musl/src/unistd/ctermid.c deleted file mode 100644 index 1612770af1..0000000000 --- a/lib/libc/musl/src/unistd/ctermid.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -char *ctermid(char *s) -{ - return s ? strcpy(s, "/dev/tty") : "/dev/tty"; -} diff --git a/lib/libc/musl/src/unistd/dup.c b/lib/libc/musl/src/unistd/dup.c deleted file mode 100644 index 7fee01201b..0000000000 --- a/lib/libc/musl/src/unistd/dup.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -int dup(int fd) -{ - return syscall(SYS_dup, fd); -} diff --git a/lib/libc/musl/src/unistd/fchownat.c b/lib/libc/musl/src/unistd/fchownat.c deleted file mode 100644 index 62457a3ec0..0000000000 --- a/lib/libc/musl/src/unistd/fchownat.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -int fchownat(int fd, const char *path, uid_t uid, gid_t gid, int flag) -{ - return syscall(SYS_fchownat, fd, path, uid, gid, flag); -} diff --git a/lib/libc/musl/src/unistd/getegid.c b/lib/libc/musl/src/unistd/getegid.c deleted file mode 100644 index 6287490da2..0000000000 --- a/lib/libc/musl/src/unistd/getegid.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -gid_t getegid(void) -{ - return __syscall(SYS_getegid); -} diff --git a/lib/libc/musl/src/unistd/geteuid.c b/lib/libc/musl/src/unistd/geteuid.c deleted file mode 100644 index 88f2cd5382..0000000000 --- a/lib/libc/musl/src/unistd/geteuid.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -uid_t geteuid(void) -{ - return __syscall(SYS_geteuid); -} diff --git a/lib/libc/musl/src/unistd/getgid.c b/lib/libc/musl/src/unistd/getgid.c deleted file mode 100644 index 1c9fe7157b..0000000000 --- a/lib/libc/musl/src/unistd/getgid.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -gid_t getgid(void) -{ - return __syscall(SYS_getgid); -} diff --git a/lib/libc/musl/src/unistd/getgroups.c b/lib/libc/musl/src/unistd/getgroups.c deleted file mode 100644 index 0e6e63af01..0000000000 --- a/lib/libc/musl/src/unistd/getgroups.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -int getgroups(int count, gid_t list[]) -{ - return syscall(SYS_getgroups, count, list); -} diff --git a/lib/libc/musl/src/unistd/getpgid.c b/lib/libc/musl/src/unistd/getpgid.c deleted file mode 100644 index d295bfd59b..0000000000 --- a/lib/libc/musl/src/unistd/getpgid.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -pid_t getpgid(pid_t pid) -{ - return syscall(SYS_getpgid, pid); -} diff --git a/lib/libc/musl/src/unistd/getpgrp.c b/lib/libc/musl/src/unistd/getpgrp.c deleted file mode 100644 index 90e9bb07f6..0000000000 --- a/lib/libc/musl/src/unistd/getpgrp.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -pid_t getpgrp(void) -{ - return __syscall(SYS_getpgid, 0); -} diff --git a/lib/libc/musl/src/unistd/getpid.c b/lib/libc/musl/src/unistd/getpid.c deleted file mode 100644 index a6d4e6d1bc..0000000000 --- a/lib/libc/musl/src/unistd/getpid.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -pid_t getpid(void) -{ - return __syscall(SYS_getpid); -} diff --git a/lib/libc/musl/src/unistd/getppid.c b/lib/libc/musl/src/unistd/getppid.c deleted file mode 100644 index 05cade53b6..0000000000 --- a/lib/libc/musl/src/unistd/getppid.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -pid_t getppid(void) -{ - return __syscall(SYS_getppid); -} diff --git a/lib/libc/musl/src/unistd/getsid.c b/lib/libc/musl/src/unistd/getsid.c deleted file mode 100644 index 93ba690e7e..0000000000 --- a/lib/libc/musl/src/unistd/getsid.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -pid_t getsid(pid_t pid) -{ - return syscall(SYS_getsid, pid); -} diff --git a/lib/libc/musl/src/unistd/getuid.c b/lib/libc/musl/src/unistd/getuid.c deleted file mode 100644 index 61309d1b79..0000000000 --- a/lib/libc/musl/src/unistd/getuid.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -uid_t getuid(void) -{ - return __syscall(SYS_getuid); -} diff --git a/lib/libc/musl/src/unistd/lchown.c b/lib/libc/musl/src/unistd/lchown.c deleted file mode 100644 index ccd5ee0255..0000000000 --- a/lib/libc/musl/src/unistd/lchown.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include -#include "syscall.h" - -int lchown(const char *path, uid_t uid, gid_t gid) -{ -#ifdef SYS_lchown - return syscall(SYS_lchown, path, uid, gid); -#else - return syscall(SYS_fchownat, AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW); -#endif -} diff --git a/lib/libc/musl/src/unistd/link.c b/lib/libc/musl/src/unistd/link.c deleted file mode 100644 index feec18e533..0000000000 --- a/lib/libc/musl/src/unistd/link.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include -#include "syscall.h" - -int link(const char *existing, const char *new) -{ -#ifdef SYS_link - return syscall(SYS_link, existing, new); -#else - return syscall(SYS_linkat, AT_FDCWD, existing, AT_FDCWD, new, 0); -#endif -} diff --git a/lib/libc/musl/src/unistd/linkat.c b/lib/libc/musl/src/unistd/linkat.c deleted file mode 100644 index 6a9a0b7759..0000000000 --- a/lib/libc/musl/src/unistd/linkat.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -int linkat(int fd1, const char *existing, int fd2, const char *new, int flag) -{ - return syscall(SYS_linkat, fd1, existing, fd2, new, flag); -} diff --git a/lib/libc/musl/src/unistd/mips/pipe.s b/lib/libc/musl/src/unistd/mips/pipe.s deleted file mode 100644 index ba2c39a304..0000000000 --- a/lib/libc/musl/src/unistd/mips/pipe.s +++ /dev/null @@ -1,20 +0,0 @@ -.set noreorder - -.global pipe -.type pipe,@function -pipe: - lui $gp, %hi(_gp_disp) - addiu $gp, %lo(_gp_disp) - addu $gp, $gp, $25 - li $2, 4042 - syscall - beq $7, $0, 1f - nop - lw $25, %call16(__syscall_ret)($gp) - jr $25 - subu $4, $0, $2 -1: sw $2, 0($4) - sw $3, 4($4) - move $2, $0 - jr $ra - nop diff --git a/lib/libc/musl/src/unistd/mips64/pipe.s b/lib/libc/musl/src/unistd/mips64/pipe.s deleted file mode 100644 index f8a27dccfb..0000000000 --- a/lib/libc/musl/src/unistd/mips64/pipe.s +++ /dev/null @@ -1,19 +0,0 @@ -.set noreorder -.global pipe -.type pipe,@function -pipe: - lui $3, %hi(%neg(%gp_rel(pipe))) - daddiu $3, $3, %lo(%neg(%gp_rel(pipe))) - daddu $3, $3, $25 - li $2, 5021 - syscall - beq $7, $0, 1f - nop - ld $25, %got_disp(__syscall_ret)($3) - jr $25 - dsubu $4, $0, $2 -1: sw $2, 0($4) - sw $3, 4($4) - move $2, $0 - jr $ra - nop diff --git a/lib/libc/musl/src/unistd/mipsn32/pipe.s b/lib/libc/musl/src/unistd/mipsn32/pipe.s deleted file mode 100644 index 80f882e2b1..0000000000 --- a/lib/libc/musl/src/unistd/mipsn32/pipe.s +++ /dev/null @@ -1,19 +0,0 @@ -.set noreorder -.global pipe -.type pipe,@function -pipe: - lui $3, %hi(%neg(%gp_rel(pipe))) - addiu $3, $3, %lo(%neg(%gp_rel(pipe))) - addu $3, $3, $25 - li $2, 6021 - syscall - beq $7, $0, 1f - nop - lw $25, %got_disp(__syscall_ret)($3) - jr $25 - subu $4, $0, $2 -1: sw $2, 0($4) - sw $3, 4($4) - move $2, $0 - jr $ra - nop diff --git a/lib/libc/musl/src/unistd/pipe.c b/lib/libc/musl/src/unistd/pipe.c deleted file mode 100644 index d07b8d24ae..0000000000 --- a/lib/libc/musl/src/unistd/pipe.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include "syscall.h" - -int pipe(int fd[2]) -{ -#ifdef SYS_pipe - return syscall(SYS_pipe, fd); -#else - return syscall(SYS_pipe2, fd, 0); -#endif -} diff --git a/lib/libc/musl/src/unistd/renameat.c b/lib/libc/musl/src/unistd/renameat.c deleted file mode 100644 index c3b40a258b..0000000000 --- a/lib/libc/musl/src/unistd/renameat.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include "syscall.h" - -int renameat(int oldfd, const char *old, int newfd, const char *new) -{ -#ifdef SYS_renameat - return syscall(SYS_renameat, oldfd, old, newfd, new); -#else - return syscall(SYS_renameat2, oldfd, old, newfd, new, 0); -#endif -} diff --git a/lib/libc/musl/src/unistd/rmdir.c b/lib/libc/musl/src/unistd/rmdir.c deleted file mode 100644 index 6825ffc835..0000000000 --- a/lib/libc/musl/src/unistd/rmdir.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include -#include "syscall.h" - -int rmdir(const char *path) -{ -#ifdef SYS_rmdir - return syscall(SYS_rmdir, path); -#else - return syscall(SYS_unlinkat, AT_FDCWD, path, AT_REMOVEDIR); -#endif -} diff --git a/lib/libc/musl/src/unistd/setpgid.c b/lib/libc/musl/src/unistd/setpgid.c deleted file mode 100644 index 061606951d..0000000000 --- a/lib/libc/musl/src/unistd/setpgid.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -int setpgid(pid_t pid, pid_t pgid) -{ - return syscall(SYS_setpgid, pid, pgid); -} diff --git a/lib/libc/musl/src/unistd/setpgrp.c b/lib/libc/musl/src/unistd/setpgrp.c deleted file mode 100644 index a2a37f65f3..0000000000 --- a/lib/libc/musl/src/unistd/setpgrp.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -pid_t setpgrp(void) -{ - return setpgid(0, 0); -} diff --git a/lib/libc/musl/src/unistd/symlink.c b/lib/libc/musl/src/unistd/symlink.c deleted file mode 100644 index 0973d78a89..0000000000 --- a/lib/libc/musl/src/unistd/symlink.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include -#include "syscall.h" - -int symlink(const char *existing, const char *new) -{ -#ifdef SYS_symlink - return syscall(SYS_symlink, existing, new); -#else - return syscall(SYS_symlinkat, existing, AT_FDCWD, new); -#endif -} diff --git a/lib/libc/musl/src/unistd/symlinkat.c b/lib/libc/musl/src/unistd/symlinkat.c deleted file mode 100644 index d1c59b4db0..0000000000 --- a/lib/libc/musl/src/unistd/symlinkat.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -int symlinkat(const char *existing, int fd, const char *new) -{ - return syscall(SYS_symlinkat, existing, fd, new); -} diff --git a/lib/libc/musl/src/unistd/sync.c b/lib/libc/musl/src/unistd/sync.c deleted file mode 100644 index f18765aa85..0000000000 --- a/lib/libc/musl/src/unistd/sync.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -void sync(void) -{ - __syscall(SYS_sync); -} diff --git a/lib/libc/musl/src/unistd/unlink.c b/lib/libc/musl/src/unistd/unlink.c deleted file mode 100644 index c40c28d50b..0000000000 --- a/lib/libc/musl/src/unistd/unlink.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include -#include "syscall.h" - -int unlink(const char *path) -{ -#ifdef SYS_unlink - return syscall(SYS_unlink, path); -#else - return syscall(SYS_unlinkat, AT_FDCWD, path, 0); -#endif -} diff --git a/lib/libc/musl/src/unistd/unlinkat.c b/lib/libc/musl/src/unistd/unlinkat.c deleted file mode 100644 index e0e25d22a3..0000000000 --- a/lib/libc/musl/src/unistd/unlinkat.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -int unlinkat(int fd, const char *path, int flag) -{ - return syscall(SYS_unlinkat, fd, path, flag); -} diff --git a/lib/std/c.zig b/lib/std/c.zig index 6bbf3cbe46..e68d5a71c5 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -10649,6 +10649,7 @@ pub extern "c" fn fread(noalias ptr: [*]u8, size_of_type: usize, item_count: usi pub extern "c" fn printf(format: [*:0]const u8, ...) c_int; pub extern "c" fn abort() noreturn; pub extern "c" fn exit(code: c_int) noreturn; +pub extern "c" fn _Exit(code: c_int) noreturn; pub extern "c" fn _exit(code: c_int) noreturn; pub extern "c" fn isatty(fd: fd_t) c_int; pub extern "c" fn lseek(fd: fd_t, offset: off_t, whence: whence_t) off_t; diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 22a5b42999..f5868f71e9 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -1391,6 +1391,10 @@ pub fn faccessat(dirfd: i32, path: [*:0]const u8, mode: u32, flags: u32) usize { return syscall4(.faccessat2, @as(usize, @bitCast(@as(isize, dirfd))), @intFromPtr(path), mode, flags); } +pub fn acct(path: [*:0]const u8) usize { + return syscall1(.acct, @intFromPtr(path)); +} + pub fn pipe(fd: *[2]i32) usize { if (comptime (native_arch.isMIPS() or native_arch.isSPARC())) { return syscall_pipe(fd); @@ -1601,11 +1605,27 @@ pub fn fchown(fd: i32, owner: uid_t, group: gid_t) usize { } } +pub fn fchownat(fd: i32, path: [*:0]const u8, owner: uid_t, group: gid_t, flags: u32) usize { + return syscall5(.fchownat, @as(usize, @bitCast(@as(isize, fd))), @intFromPtr(path), owner, group, flags); +} + pub fn chown(path: [*:0]const u8, owner: uid_t, group: gid_t) usize { if (@hasField(SYS, "chown32")) { return syscall3(.chown32, @intFromPtr(path), owner, group); - } else { + } else if (@hasField(SYS, "chown")) { return syscall3(.chown, @intFromPtr(path), owner, group); + } else { + return fchownat(AT.FDCWD, path, owner, group, 0); + } +} + +pub fn lchown(path: [*:0]const u8, owner: uid_t, group: gid_t) usize { + if (@hasField(SYS, "lchown32")) { + return syscall3(.lchown32, @intFromPtr(path), owner, group); + } else if (@hasField(SYS, "lchown")) { + return syscall3(.lchown, @intFromPtr(path), owner, group); + } else { + return fchownat(AT.FDCWD, path, owner, group, AT.SYMLINK_NOFOLLOW); } } @@ -2064,7 +2084,11 @@ pub fn setpgid(pid: pid_t, pgid: pid_t) usize { return syscall2(.setpgid, @intCast(pid), @intCast(pgid)); } -pub fn getgroups(size: usize, list: ?*gid_t) usize { +pub fn getpgid(pid: pid_t) usize { + return syscall1(.getpgid, @intCast(pid)); +} + +pub fn getgroups(size: usize, list: ?[*]gid_t) usize { if (@hasField(SYS, "getgroups32")) { return syscall2(.getgroups32, size, @intFromPtr(list)); } else { @@ -2084,6 +2108,10 @@ pub fn setsid() usize { return syscall0(.setsid); } +pub fn getsid(pid: pid_t) usize { + return syscall1(.getsid, @intCast(pid)); +} + pub fn getpid() pid_t { // Casts result to a pid_t, safety-checking >= 0, because getpid() cannot fail return @intCast(@as(u32, @truncate(syscall0(.getpid)))); diff --git a/src/libs/musl.zig b/src/libs/musl.zig index 295e516930..3c2c4dd25f 100644 --- a/src/libs/musl.zig +++ b/src/libs/musl.zig @@ -704,8 +704,6 @@ const src_files = [_][]const u8{ "musl/src/linux/arch_prctl.c", "musl/src/linux/brk.c", "musl/src/linux/cache.c", - "musl/src/linux/cap.c", - "musl/src/linux/chroot.c", "musl/src/linux/clock_adjtime.c", "musl/src/linux/clone.c", "musl/src/linux/copy_file_range.c", @@ -713,7 +711,6 @@ const src_files = [_][]const u8{ "musl/src/linux/eventfd.c", "musl/src/linux/fallocate.c", "musl/src/linux/fanotify.c", - "musl/src/linux/flock.c", "musl/src/linux/getdents.c", "musl/src/linux/getrandom.c", "musl/src/linux/gettid.c", @@ -738,7 +735,6 @@ const src_files = [_][]const u8{ "musl/src/linux/pwritev2.c", "musl/src/linux/quotactl.c", "musl/src/linux/readahead.c", - "musl/src/linux/reboot.c", "musl/src/linux/remap_file_pages.c", "musl/src/linux/sbrk.c", "musl/src/linux/sendfile.c", @@ -1157,18 +1153,10 @@ const src_files = [_][]const u8{ "musl/src/misc/syscall.c", "musl/src/misc/syslog.c", "musl/src/misc/wordexp.c", - "musl/src/mman/madvise.c", - "musl/src/mman/mincore.c", - "musl/src/mman/mlockall.c", - "musl/src/mman/mlock.c", "musl/src/mman/mmap.c", - "musl/src/mman/mprotect.c", "musl/src/mman/mremap.c", "musl/src/mman/msync.c", - "musl/src/mman/munlockall.c", - "musl/src/mman/munlock.c", "musl/src/mman/munmap.c", - "musl/src/mman/posix_madvise.c", "musl/src/mman/shm_open.c", "musl/src/mq/mq_close.c", "musl/src/mq/mq_getattr.c", @@ -1304,7 +1292,6 @@ const src_files = [_][]const u8{ "musl/src/process/execle.c", "musl/src/process/execlp.c", "musl/src/process/execv.c", - "musl/src/process/execve.c", "musl/src/process/execvp.c", "musl/src/process/fexecve.c", "musl/src/process/fork.c", @@ -1871,51 +1858,26 @@ const src_files = [_][]const u8{ "musl/src/time/utime.c", "musl/src/time/wcsftime.c", "musl/src/time/__year_to_secs.c", - "musl/src/unistd/access.c", - "musl/src/unistd/acct.c", "musl/src/unistd/alarm.c", - "musl/src/unistd/chdir.c", - "musl/src/unistd/chown.c", "musl/src/unistd/close.c", - "musl/src/unistd/ctermid.c", "musl/src/unistd/dup2.c", "musl/src/unistd/dup3.c", - "musl/src/unistd/dup.c", - "musl/src/unistd/_exit.c", "musl/src/unistd/faccessat.c", "musl/src/unistd/fchdir.c", - "musl/src/unistd/fchownat.c", "musl/src/unistd/fchown.c", "musl/src/unistd/fdatasync.c", "musl/src/unistd/fsync.c", "musl/src/unistd/ftruncate.c", "musl/src/unistd/getcwd.c", - "musl/src/unistd/getegid.c", - "musl/src/unistd/geteuid.c", - "musl/src/unistd/getgid.c", - "musl/src/unistd/getgroups.c", "musl/src/unistd/gethostname.c", "musl/src/unistd/getlogin.c", "musl/src/unistd/getlogin_r.c", - "musl/src/unistd/getpgid.c", - "musl/src/unistd/getpgrp.c", - "musl/src/unistd/getpid.c", - "musl/src/unistd/getppid.c", - "musl/src/unistd/getsid.c", - "musl/src/unistd/getuid.c", "musl/src/unistd/isatty.c", - "musl/src/unistd/lchown.c", - "musl/src/unistd/linkat.c", - "musl/src/unistd/link.c", "musl/src/unistd/lseek.c", - "musl/src/unistd/mips64/pipe.s", "musl/src/unistd/mipsn32/lseek.c", - "musl/src/unistd/mipsn32/pipe.s", - "musl/src/unistd/mips/pipe.s", "musl/src/unistd/nice.c", "musl/src/unistd/pause.c", "musl/src/unistd/pipe2.c", - "musl/src/unistd/pipe.c", "musl/src/unistd/posix_close.c", "musl/src/unistd/pread.c", "musl/src/unistd/preadv.c", @@ -1925,13 +1887,9 @@ const src_files = [_][]const u8{ "musl/src/unistd/readlinkat.c", "musl/src/unistd/readlink.c", "musl/src/unistd/readv.c", - "musl/src/unistd/renameat.c", - "musl/src/unistd/rmdir.c", "musl/src/unistd/setegid.c", "musl/src/unistd/seteuid.c", "musl/src/unistd/setgid.c", - "musl/src/unistd/setpgid.c", - "musl/src/unistd/setpgrp.c", "musl/src/unistd/setregid.c", "musl/src/unistd/setresgid.c", "musl/src/unistd/setresuid.c", @@ -1940,17 +1898,12 @@ const src_files = [_][]const u8{ "musl/src/unistd/setuid.c", "musl/src/unistd/setxid.c", "musl/src/unistd/sleep.c", - "musl/src/unistd/symlinkat.c", - "musl/src/unistd/symlink.c", - "musl/src/unistd/sync.c", "musl/src/unistd/tcgetpgrp.c", "musl/src/unistd/tcsetpgrp.c", "musl/src/unistd/truncate.c", "musl/src/unistd/ttyname.c", "musl/src/unistd/ttyname_r.c", "musl/src/unistd/ualarm.c", - "musl/src/unistd/unlinkat.c", - "musl/src/unistd/unlink.c", "musl/src/unistd/usleep.c", "musl/src/unistd/write.c", "musl/src/unistd/writev.c",