From b2cd58a3226627179f58807bd333fbe0606ff489 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Fri, 5 Feb 2021 09:44:54 -0800 Subject: [PATCH] Get all tests passing on NetBSD --- Makefile | 2 +- libc/calls/execve-sysv.c | 8 +- libc/calls/getcwd-xnu.c | 5 +- libc/calls/getpid.c | 4 +- libc/calls/getppid.c | 6 +- libc/calls/internal.h | 7 +- libc/calls/netbsdtramp.S | 29 ++ libc/calls/pipe-sysv.S | 4 +- libc/calls/sigaction.c | 76 ++-- libc/calls/thunks/ftruncate-sysv.S | 2 +- libc/calls/thunks/lseek-sysv.S | 6 +- libc/calls/thunks/mmap-sysv.S | 2 +- libc/calls/thunks/pread-sysv.S | 2 +- libc/calls/thunks/preadv-sysv.S | 2 +- libc/calls/thunks/pwrite-sysv.S | 2 +- libc/calls/thunks/pwritev-sysv.S | 2 +- libc/calls/thunks/truncate-sysv.S | 2 +- libc/calls/wait4-nt.c | 2 +- libc/fmt/filetimetotime.c | 2 +- libc/fmt/filetimetotimespec.c | 2 +- libc/fmt/filetimetotimeval.c | 2 +- libc/stdio/dirstream.c | 22 ++ libc/stdio/system.c | 7 +- libc/sysv/calls/sys_getcwd.s | 2 +- libc/sysv/calls/sys_getgid.s | 2 +- libc/sysv/calls/sys_getpid.s | 2 +- libc/sysv/calls/sys_getuid.s | 2 +- libc/sysv/calls/sys_sigaction.s | 2 +- libc/sysv/calls/sysctl.s | 2 +- libc/sysv/consts.sh | 12 +- libc/sysv/consts/__NR_getcwd.s | 2 +- libc/sysv/consts/__NR_getgid.s | 2 +- libc/sysv/consts/__NR_getpid.s | 2 +- libc/sysv/consts/__NR_getuid.s | 2 +- libc/sysv/consts/__NR_sigaction.s | 2 +- libc/sysv/consts/__NR_sysctl.s | 2 +- libc/sysv/netbsd.txt | 554 ----------------------------- libc/sysv/newconsts.py | 2 +- libc/sysv/syscalls.sh | 26 +- test/libc/calls/sigaction_test.c | 13 + tool/net/greenbean.c | 28 +- 41 files changed, 202 insertions(+), 655 deletions(-) create mode 100644 libc/calls/netbsdtramp.S delete mode 100644 libc/sysv/netbsd.txt diff --git a/Makefile b/Makefile index 6698c748a..a6ad437b7 100644 --- a/Makefile +++ b/Makefile @@ -61,7 +61,7 @@ # build/config.mk SHELL = /bin/sh -HOSTS ?= freebsd openbsd rhel7 rhel5 xnu win7 win10 +HOSTS ?= freebsd openbsd netbsd rhel7 rhel5 xnu win7 win10 SANITY := $(shell build/sanitycheck $$PPID) GNUMAKEFLAGS += --output-sync diff --git a/libc/calls/execve-sysv.c b/libc/calls/execve-sysv.c index f687ae637..c7357be64 100644 --- a/libc/calls/execve-sysv.c +++ b/libc/calls/execve-sysv.c @@ -32,9 +32,11 @@ int sys_execve(const char *prog, char *const argv[], char *const envp[]) { for (i = 0; argv[i];) ++i; shargs = alloca((i + 2) * sizeof(char *)); memcpy(shargs + 2, argv + 1, i * sizeof(char *)); - shargs[0] = !IsFreebsd() ? _PATH_BSHELL - : firstnonnull(commandv("bash", alloca(PATH_MAX)), - _PATH_BSHELL); + if (IsFreebsd() || IsNetbsd()) { + shargs[0] = firstnonnull(commandv("bash", alloca(PATH_MAX)), _PATH_BSHELL); + } else { + shargs[0] = _PATH_BSHELL; + } shargs[1] = prog; return __sys_execve(shargs[0], shargs, envp); } diff --git a/libc/calls/getcwd-xnu.c b/libc/calls/getcwd-xnu.c index 4da7837f0..7e404bc83 100644 --- a/libc/calls/getcwd-xnu.c +++ b/libc/calls/getcwd-xnu.c @@ -24,8 +24,9 @@ #include "libc/sysv/consts/o.h" #include "libc/sysv/errfuns.h" -#define XNU_F_GETPATH 50 -#define XNU_MAXPATHLEN 1024 +#define NETBSD_F_GETPATH 15 +#define XNU_F_GETPATH 50 +#define XNU_MAXPATHLEN 1024 char *sys_getcwd_xnu(char *res, size_t size) { int fd; diff --git a/libc/calls/getpid.c b/libc/calls/getpid.c index bb25e57ab..5db92d62d 100644 --- a/libc/calls/getpid.c +++ b/libc/calls/getpid.c @@ -28,7 +28,7 @@ static int __pid; static int __getpid(void) { if (!IsWindows()) { - return sys_getpid(); + return sys_getpid().ax; } else { return GetCurrentProcessId(); } @@ -46,7 +46,7 @@ static void __updatepid(void) { int getpid(void) { static bool once; if (__vforked) { - return sys_getpid(); + return sys_getpid().ax; } if (!once) { __updatepid(); diff --git a/libc/calls/getppid.c b/libc/calls/getppid.c index 1f93a3924..e4dbd5663 100644 --- a/libc/calls/getppid.c +++ b/libc/calls/getppid.c @@ -24,7 +24,11 @@ */ int32_t getppid(void) { if (!IsWindows()) { - return sys_getppid(); + if (!IsNetbsd()) { + return sys_getppid(); + } else { + return sys_getpid().dx; + } } else { return sys_getppid_nt(); } diff --git a/libc/calls/internal.h b/libc/calls/internal.h index c9d4161f3..8de8af18d 100644 --- a/libc/calls/internal.h +++ b/libc/calls/internal.h @@ -58,7 +58,7 @@ struct Fd { struct Fds { size_t f; // lowest free slot size_t n; // monotonic capacity - struct Fd * p; + struct Fd *p; struct Fd __init_p[OPEN_MAX]; }; @@ -172,7 +172,7 @@ i32 sys_setresgid(uint32_t, uint32_t, uint32_t) hidden; i32 sys_setresuid(uint32_t, uint32_t, uint32_t) hidden; i32 sys_setrlimit(i32, const struct rlimit *) hidden; i32 sys_setsid(void) hidden; -i32 sys_sigaction(i32, const void *, void *, i64) hidden; +i32 sys_sigaction(i32, const void *, void *, i64, i64) hidden; i32 sys_sigprocmask(i32, const sigset *, sigset *, u64) hidden; i32 sys_sigsuspend(const sigset *, u64) hidden; i32 sys_symlinkat(const char *, i32, const char *) hidden; @@ -199,7 +199,7 @@ i64 sys_splice(i32, i64 *, i32, i64 *, u64, u32) hidden; i64 sys_vmsplice(i32, const struct iovec *, i64, u32) hidden; i64 sys_write(i32, const void *, u64) hidden; u32 sys_getgid(void) hidden; -u32 sys_getpid(void) hidden; +axdx_t sys_getpid(void) hidden; u32 sys_getsid(int) hidden; u32 sys_gettid(void) hidden; u32 sys_getuid(void) hidden; @@ -219,6 +219,7 @@ void __sigenter_xnu(void *, i32, i32, void *, void *) hidden wontreturn; int sys_utimensat_xnu(int, const char *, const struct timespec *, int) hidden; int sys_nanosleep_xnu(const struct timespec *, struct timespec *) hidden; void __stat2linux(void *) hidden; +void __restore_rt_netbsd(void) hidden; void __xnutrampoline(void *, i32, i32, const struct __darwin_siginfo *, const struct __darwin_ucontext *) hidden wontreturn; diff --git a/libc/calls/netbsdtramp.S b/libc/calls/netbsdtramp.S new file mode 100644 index 000000000..572b3807b --- /dev/null +++ b/libc/calls/netbsdtramp.S @@ -0,0 +1,29 @@ +/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ +│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2021 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/macros.h" +.text.syscall + +__restore_rt_netbsd: + mov %r15,%rdi + mov $308,%rax # setcontext + syscall + mov $-1,%edi + mov $1,%rax # exit + syscall + .endfn __restore_rt_netbsd,globl,hidden diff --git a/libc/calls/pipe-sysv.S b/libc/calls/pipe-sysv.S index 5ec2f82f6..2a436a98b 100644 --- a/libc/calls/pipe-sysv.S +++ b/libc/calls/pipe-sysv.S @@ -34,8 +34,8 @@ sys_pipe: xor %esi,%esi #endif call __sys_pipe -#if SupportsXnu() - testb IsXnu() +#if SupportsXnu() || SupportsNetbsd() + testb $XNU|NETBSD,__hostos(%rip) jz 1f cmp $-1,%rax je 1f diff --git a/libc/calls/sigaction.c b/libc/calls/sigaction.c index 67eedd1e3..9bd9fa75f 100644 --- a/libc/calls/sigaction.c +++ b/libc/calls/sigaction.c @@ -22,6 +22,7 @@ #include "libc/calls/sigbits.h" #include "libc/calls/struct/sigaction-freebsd.internal.h" #include "libc/calls/struct/sigaction-linux.internal.h" +#include "libc/calls/struct/sigaction-netbsd.h" #include "libc/calls/struct/sigaction-openbsd.internal.h" #include "libc/calls/struct/sigaction-xnu.internal.h" #include "libc/calls/struct/sigaction.h" @@ -42,6 +43,7 @@ union metasigaction { struct sigaction_linux linux; struct sigaction_freebsd freebsd; struct sigaction_openbsd openbsd; + struct sigaction_netbsd netbsd; struct sigaction_xnu_in xnu_in; struct sigaction_xnu_out xnu_out; }; @@ -63,7 +65,7 @@ union metasigaction { } while (0); #endif -static void sigaction$cosmo2native(union metasigaction *sa) { +static void sigaction_cosmo2native(union metasigaction *sa) { if (!sa) return; switch (__hostos) { case LINUX: @@ -82,12 +84,16 @@ static void sigaction$cosmo2native(union metasigaction *sa) { SWITCHEROO(sa->cosmo, sa->openbsd, sa_handler, sa_flags, sa_flags, sa_mask); break; + case NETBSD: + SWITCHEROO(sa->cosmo, sa->netbsd, sa_handler, sa_flags, sa_flags, + sa_mask); + break; default: break; } } -static void sigaction$native2cosmo(union metasigaction *sa) { +static void sigaction_native2cosmo(union metasigaction *sa) { if (!sa) return; switch (__hostos) { case LINUX: @@ -106,6 +112,10 @@ static void sigaction$native2cosmo(union metasigaction *sa) { SWITCHEROO(sa->openbsd, sa->cosmo, sa_handler, sa_flags, sa_flags, sa_mask); break; + case NETBSD: + SWITCHEROO(sa->netbsd, sa->cosmo, sa_handler, sa_flags, sa_flags, + sa_mask); + break; default: break; } @@ -128,9 +138,12 @@ int(sigaction)(int sig, const struct sigaction *act, struct sigaction *oldact) { sizeof(struct sigaction) > sizeof(struct sigaction_xnu_in) && sizeof(struct sigaction) > sizeof(struct sigaction_xnu_out) && sizeof(struct sigaction) > sizeof(struct sigaction_freebsd) && - sizeof(struct sigaction) > sizeof(struct sigaction_openbsd)); + sizeof(struct sigaction) > sizeof(struct sigaction_openbsd) && + sizeof(struct sigaction) > sizeof(struct sigaction_netbsd)); + int64_t arg4, arg5; int rc, rva, oldrva; struct sigaction *ap, copy; + if (IsMetal()) return enosys(); /* TODO: Signals on Metal */ if (!(0 < sig && sig < NSIG)) return einval(); if (sig == SIGKILL || sig == SIGSTOP) return einval(); if (!act) { @@ -147,32 +160,43 @@ int(sigaction)(int sig, const struct sigaction *act, struct sigaction *oldact) { return einval(); } if (!IsWindows()) { - if (!IsMetal()) { - if (act) { - memcpy(©, act, sizeof(copy)); - ap = © - if (IsXnu()) { - ap->sa_restorer = (void *)&__xnutrampoline; - ap->sa_handler = (void *)&__xnutrampoline; - } else if (IsLinux()) { - if (!(ap->sa_flags & SA_RESTORER)) { - ap->sa_flags |= SA_RESTORER; - ap->sa_restorer = &__restore_rt; - } - } else if (rva >= kSigactionMinRva) { - ap->sa_sigaction = (sigaction_f)__sigenter; + if (act) { + memcpy(©, act, sizeof(copy)); + ap = © + if (IsXnu()) { + ap->sa_restorer = (void *)&__xnutrampoline; + ap->sa_handler = (void *)&__xnutrampoline; + } else if (IsLinux()) { + if (!(ap->sa_flags & SA_RESTORER)) { + ap->sa_flags |= SA_RESTORER; + ap->sa_restorer = &__restore_rt; } - sigaction$cosmo2native((union metasigaction *)ap); - } else { - ap = NULL; + } else if (IsNetbsd()) { + ap->sa_sigaction = act->sa_sigaction; + } else if (rva >= kSigactionMinRva) { + ap->sa_sigaction = (sigaction_f)__sigenter; } - rc = sys_sigaction( - sig, ap, oldact, - (!IsXnu() ? 8 /* or linux whines */ - : (int64_t)(intptr_t)oldact /* from go code */)); - if (rc != -1) sigaction$native2cosmo((union metasigaction *)oldact); + sigaction_cosmo2native((union metasigaction *)ap); } else { - return enosys(); /* TODO: Signals on Metal */ + ap = NULL; + } + if (IsXnu()) { + arg4 = (int64_t)(intptr_t)oldact; /* from go code */ + arg5 = 0; + } else if (IsNetbsd()) { + if (ap) { + arg4 = (int64_t)(intptr_t)&__restore_rt_netbsd; + arg5 = 2; /* netbsd/lib/libc/arch/x86_64/sys/__sigtramp2.S */ + } else { + arg4 = 0; + arg5 = 0; /* netbsd/lib/libc/arch/x86_64/sys/__sigtramp2.S */ + } + } else { + arg4 = 8; /* or linux whines */ + arg5 = 0; + } + if ((rc = sys_sigaction(sig, ap, oldact, arg4, arg5)) != -1) { + sigaction_native2cosmo((union metasigaction *)oldact); } } else { if (oldact) { diff --git a/libc/calls/thunks/ftruncate-sysv.S b/libc/calls/thunks/ftruncate-sysv.S index e07623f84..dc1875c62 100644 --- a/libc/calls/thunks/ftruncate-sysv.S +++ b/libc/calls/thunks/ftruncate-sysv.S @@ -21,6 +21,6 @@ / Directly calls ftruncate() impl on host o/s if available. sys_ftruncate: - mov %rsi,%rdx # openbsd:pad + mov %rsi,%rdx # netbsd+openbsd:pad jmp __sys_ftruncate .endfn sys_ftruncate,globl,hidden diff --git a/libc/calls/thunks/lseek-sysv.S b/libc/calls/thunks/lseek-sysv.S index 03965beb1..f97982135 100644 --- a/libc/calls/thunks/lseek-sysv.S +++ b/libc/calls/thunks/lseek-sysv.S @@ -22,9 +22,9 @@ / Directly calls lseek() impl on host o/s if available. sys_lseek: -#if SupportsOpenbsd() - testb IsOpenbsd() # openbsd:evilpad - cmovnz %rdx,%rcx +#if SupportsOpenbsd() || SupportsNetbsd() + testb $OPENBSD|NETBSD,__hostos(%rip) + cmovnz %rdx,%rcx # openbsd:evilpad cmovnz %rsi,%rdx cmovnz .Lzero(%rip),%rsi #endif diff --git a/libc/calls/thunks/mmap-sysv.S b/libc/calls/thunks/mmap-sysv.S index 93647faa7..a739c766c 100644 --- a/libc/calls/thunks/mmap-sysv.S +++ b/libc/calls/thunks/mmap-sysv.S @@ -23,7 +23,7 @@ sys_mmap: push %rbp mov %rsp,%rbp - push %r9 # openbsd:pad + push %r9 # netbsd+openbsd:pad call __sys_mmap leave ret diff --git a/libc/calls/thunks/pread-sysv.S b/libc/calls/thunks/pread-sysv.S index 805cd3c01..c046cc598 100644 --- a/libc/calls/thunks/pread-sysv.S +++ b/libc/calls/thunks/pread-sysv.S @@ -21,6 +21,6 @@ / Directly calls pread() impl on host o/s if available. sys_pread: - mov %rcx,%r8 # openbsd:pad + mov %rcx,%r8 # netbsd+openbsd:pad jmp __sys_pread .endfn sys_pread,globl,hidden diff --git a/libc/calls/thunks/preadv-sysv.S b/libc/calls/thunks/preadv-sysv.S index bf3bc3e2b..6ee8ecc5a 100644 --- a/libc/calls/thunks/preadv-sysv.S +++ b/libc/calls/thunks/preadv-sysv.S @@ -21,6 +21,6 @@ / Directly calls preadv() impl on host o/s if available. sys_preadv: - mov %rcx,%r8 # openbsd:pad + mov %rcx,%r8 # netbsd+openbsd:pad jmp __sys_preadv .endfn sys_preadv,globl,hidden diff --git a/libc/calls/thunks/pwrite-sysv.S b/libc/calls/thunks/pwrite-sysv.S index 1f3c8e4ef..b13ecebf3 100644 --- a/libc/calls/thunks/pwrite-sysv.S +++ b/libc/calls/thunks/pwrite-sysv.S @@ -21,6 +21,6 @@ / Directly calls pwrite() impl on host o/s if available. sys_pwrite: - mov %rcx,%r8 # openbsd:pad + mov %rcx,%r8 # netbsd+openbsd:pad jmp __sys_pwrite .endfn sys_pwrite,globl,hidden diff --git a/libc/calls/thunks/pwritev-sysv.S b/libc/calls/thunks/pwritev-sysv.S index 831f2e1a6..0a34eaf41 100644 --- a/libc/calls/thunks/pwritev-sysv.S +++ b/libc/calls/thunks/pwritev-sysv.S @@ -21,6 +21,6 @@ / Directly calls pwritev() impl on host o/s if available. sys_pwritev: - mov %rcx,%r8 # openbsd:pad + mov %rcx,%r8 # netbsd+openbsd:pad jmp __sys_pwritev .endfn sys_pwritev,globl,hidden diff --git a/libc/calls/thunks/truncate-sysv.S b/libc/calls/thunks/truncate-sysv.S index 80a52ae0d..bc6453ad9 100644 --- a/libc/calls/thunks/truncate-sysv.S +++ b/libc/calls/thunks/truncate-sysv.S @@ -21,6 +21,6 @@ / Directly calls truncate() impl on host o/s if available. sys_truncate: - mov %rsi,%rdx # openbsd:pad + mov %rsi,%rdx # netbsd+openbsd:pad jmp __sys_truncate .endfn sys_truncate,globl,hidden diff --git a/libc/calls/wait4-nt.c b/libc/calls/wait4-nt.c index 0c1f8094e..d04156b00 100644 --- a/libc/calls/wait4-nt.c +++ b/libc/calls/wait4-nt.c @@ -33,7 +33,7 @@ #include "libc/sysv/errfuns.h" textwindows int sys_wait4_nt(int pid, int *opt_out_wstatus, int options, - struct rusage *opt_out_rusage) { + struct rusage *opt_out_rusage) { int pids[64]; int64_t handles[64]; uint32_t dwExitCode; diff --git a/libc/fmt/filetimetotime.c b/libc/fmt/filetimetotime.c index 96fbf6e19..640d92a04 100644 --- a/libc/fmt/filetimetotime.c +++ b/libc/fmt/filetimetotime.c @@ -19,7 +19,7 @@ #include "libc/fmt/conv.h" #include "libc/nt/struct/filetime.h" -int64_t filetimetotime(struct NtFileTime ft) { +textwindows int64_t filetimetotime(struct NtFileTime ft) { uint64_t t = (uint64_t)ft.dwHighDateTime << 32 | ft.dwLowDateTime; return (t - MODERNITYSECONDS * HECTONANOSECONDS) / HECTONANOSECONDS; } diff --git a/libc/fmt/filetimetotimespec.c b/libc/fmt/filetimetotimespec.c index adec602f5..40c07f313 100644 --- a/libc/fmt/filetimetotimespec.c +++ b/libc/fmt/filetimetotimespec.c @@ -23,7 +23,7 @@ /** * Converts Windows COBOL timestamp to UNIX epoch in nanoseconds. */ -struct timespec FileTimeToTimeSpec(struct NtFileTime ft) { +textwindows struct timespec FileTimeToTimeSpec(struct NtFileTime ft) { uint64_t x; x = ft.dwHighDateTime; x <<= 32; diff --git a/libc/fmt/filetimetotimeval.c b/libc/fmt/filetimetotimeval.c index d738ce91a..7edcf7c70 100644 --- a/libc/fmt/filetimetotimeval.c +++ b/libc/fmt/filetimetotimeval.c @@ -21,7 +21,7 @@ #include "libc/fmt/conv.h" #include "libc/nt/struct/filetime.h" -void FileTimeToTimeVal(struct timeval *tv, struct NtFileTime ft) { +textwindows void FileTimeToTimeVal(struct timeval *tv, struct NtFileTime ft) { uint64_t x; x = ft.dwHighDateTime; x <<= 32; diff --git a/libc/stdio/dirstream.c b/libc/stdio/dirstream.c index d281432ba..157265393 100644 --- a/libc/stdio/dirstream.c +++ b/libc/stdio/dirstream.c @@ -21,6 +21,7 @@ #include "libc/calls/internal.h" #include "libc/calls/struct/dirent.h" #include "libc/dce.h" +#include "libc/macros.h" #include "libc/mem/mem.h" #include "libc/nt/enum/fileflagandattributes.h" #include "libc/nt/enum/filetype.h" @@ -86,6 +87,17 @@ struct dirent_openbsd { char d_name[256]; }; +/** + * NetBSD getdents(). + */ +struct dirent_netbsd { + uint64_t d_fileno; + uint16_t d_reclen; + uint16_t d_namlen; + uint8_t d_type; + char d_name[512]; +}; + static textwindows noinline DIR *opendir_nt(const char *name) { int len; DIR *res; @@ -205,6 +217,7 @@ struct dirent *readdir(DIR *dir) { long basep; struct dirent *ent; struct dirent_bsd *bsd; + struct dirent_netbsd *nbsd; struct dirent_openbsd *obsd; if (!IsWindows()) { if (dir->buf_pos >= dir->buf_end) { @@ -227,6 +240,15 @@ struct dirent *readdir(DIR *dir) { ent->d_reclen = obsd->d_reclen; ent->d_type = obsd->d_type; memcpy(ent->d_name, obsd->d_name, obsd->d_namlen + 1); + } else if (IsNetbsd()) { + nbsd = (struct dirent_netbsd *)(dir->buf + dir->buf_pos); + dir->buf_pos += nbsd->d_reclen; + ent = &dir->ent; + ent->d_ino = nbsd->d_fileno; + ent->d_off = dir->tell++; + ent->d_reclen = nbsd->d_reclen; + ent->d_type = nbsd->d_type; + memcpy(ent->d_name, nbsd->d_name, MAX(256, nbsd->d_namlen + 1)); } else { bsd = (struct dirent_bsd *)(dir->buf + dir->buf_pos); dir->buf_pos += bsd->d_reclen; diff --git a/libc/stdio/system.c b/libc/stdio/system.c index ea69be8e6..ae41a1833 100644 --- a/libc/stdio/system.c +++ b/libc/stdio/system.c @@ -26,6 +26,7 @@ #include "libc/runtime/runtime.h" #include "libc/stdio/stdio.h" #include "libc/str/str.h" +#include "libc/sysv/consts/ok.h" #include "libc/sysv/consts/sig.h" /** @@ -39,7 +40,11 @@ int system(const char *cmdline) { int pid, wstatus; sigset_t chldmask, savemask; struct sigaction ignore, saveint, savequit; - if (!cmdline) return 1; + if (!cmdline) { + if (IsWindows()) return 1; + if (access(_PATH_BSHELL, X_OK) == 0) return 1; + return 0; + } ignore.sa_flags = 0; ignore.sa_handler = SIG_IGN; sigemptyset(&ignore.sa_mask); diff --git a/libc/sysv/calls/sys_getcwd.s b/libc/sysv/calls/sys_getcwd.s index ba8b4e315..0e1d04df5 100644 --- a/libc/sysv/calls/sys_getcwd.s +++ b/libc/sysv/calls/sys_getcwd.s @@ -1,2 +1,2 @@ .include "o/libc/sysv/macros.internal.inc" -.scall sys_getcwd 0xfff130146ffff04f globl hidden +.scall sys_getcwd 0x128130146ffff04f globl hidden diff --git a/libc/sysv/calls/sys_getgid.s b/libc/sysv/calls/sys_getgid.s index ad87b86cd..f0489daf0 100644 --- a/libc/sysv/calls/sys_getgid.s +++ b/libc/sysv/calls/sys_getgid.s @@ -1,2 +1,2 @@ .include "o/libc/sysv/macros.internal.inc" -.scall sys_getgid 0xfff02f02f202f068 globl hidden +.scall sys_getgid 0x02f02f02f202f068 globl hidden diff --git a/libc/sysv/calls/sys_getpid.s b/libc/sysv/calls/sys_getpid.s index 527e134f0..9ffc24c93 100644 --- a/libc/sysv/calls/sys_getpid.s +++ b/libc/sysv/calls/sys_getpid.s @@ -1,2 +1,2 @@ .include "o/libc/sysv/macros.internal.inc" -.scall sys_getpid 0xfff0140142014027 globl hidden +.scall sys_getpid 0x0140140142014027 globl hidden diff --git a/libc/sysv/calls/sys_getuid.s b/libc/sysv/calls/sys_getuid.s index 6009e1b0c..ff68375c2 100644 --- a/libc/sysv/calls/sys_getuid.s +++ b/libc/sysv/calls/sys_getuid.s @@ -1,2 +1,2 @@ .include "o/libc/sysv/macros.internal.inc" -.scall sys_getuid 0xfff0180182018066 globl hidden +.scall sys_getuid 0x0180180182018066 globl hidden diff --git a/libc/sysv/calls/sys_sigaction.s b/libc/sysv/calls/sys_sigaction.s index 30a5b1490..82ab8a2fc 100644 --- a/libc/sysv/calls/sys_sigaction.s +++ b/libc/sysv/calls/sys_sigaction.s @@ -1,2 +1,2 @@ .include "o/libc/sysv/macros.internal.inc" -.scall sys_sigaction 0xfff02e1a0202e00d globl hidden +.scall sys_sigaction 0x15402e1a0202e00d globl hidden diff --git a/libc/sysv/calls/sysctl.s b/libc/sysv/calls/sysctl.s index e10c6eb59..5c092ad0a 100644 --- a/libc/sysv/calls/sysctl.s +++ b/libc/sysv/calls/sysctl.s @@ -1,2 +1,2 @@ .include "o/libc/sysv/macros.internal.inc" -.scall sysctl 0xfff0ca0ca20cafff globl +.scall sysctl 0x0ca0ca0ca20cafff globl diff --git a/libc/sysv/consts.sh b/libc/sysv/consts.sh index 52e65a08d..0524a8c1b 100755 --- a/libc/sysv/consts.sh +++ b/libc/sysv/consts.sh @@ -2804,7 +2804,7 @@ syscon nr __NR_mmap 0x0009 0x20000c5 0x01dd 0x00c5 0x0c5 -1 syscon nr __NR_msync 0x001a 0x2000041 0x0041 0x0100 0x115 -1 syscon nr __NR_mprotect 0x000a 0x200004a 0x004a 0x004a 0x04a -1 syscon nr __NR_munmap 0x000b 0x2000049 0x0049 0x0049 0x049 -1 -syscon nr __NR_sigaction 0x000d 0x200002e 0x01a0 0x002e -1 -1 +syscon nr __NR_sigaction 0x000d 0x200002e 0x01a0 0x002e 0x154 -1 syscon nr __NR_sigprocmask 0x000e 0x2000030 0x0154 0x0030 0x125 -1 syscon nr __NR_ioctl 0x0010 0x2000036 0x0036 0x0036 0x036 -1 syscon nr __NR_pread 0x0011 0x2000099 0x01db 0x00ad 0x0ad -1 @@ -2830,7 +2830,7 @@ syscon nr __NR_nanosleep 0x0023 -1 0x00f0 0x005b 0x1ae -1 syscon nr __NR_getitimer 0x0024 0x2000056 0x0056 0x0046 0x1aa -1 syscon nr __NR_setitimer 0x0026 0x2000053 0x0053 0x0045 0x1a9 -1 syscon nr __NR_alarm 0x0025 -1 -1 -1 -1 -1 -syscon nr __NR_getpid 0x0027 0x2000014 0x0014 0x0014 -1 -1 +syscon nr __NR_getpid 0x0027 0x2000014 0x0014 0x0014 0x014 -1 syscon nr __NR_sendfile 0x0028 0x2000151 0x0189 -1 -1 -1 syscon nr __NR_socket 0x0029 0x2000061 0x0061 0x0061 0x18a -1 syscon nr __NR_connect 0x002a 0x2000062 0x0062 0x0062 0x062 -1 @@ -2874,7 +2874,7 @@ syscon nr __NR_fsync 0x004a 0x200005f 0x005f 0x005f 0x05f -1 syscon nr __NR_fdatasync 0x004b 0x20000bb 0x0226 0x005f 0x0f1 -1 syscon nr __NR_truncate 0x004c 0x20000c8 0x01df 0x00c8 0x0c8 -1 syscon nr __NR_ftruncate 0x004d 0x20000c9 0x01e0 0x00c9 0x0c9 -1 -syscon nr __NR_getcwd 0x004f -1 0x0146 0x0130 -1 -1 +syscon nr __NR_getcwd 0x004f -1 0x0146 0x0130 0x128 -1 syscon nr __NR_chdir 0x0050 0x200000c 0x000c 0x000c 0x00c -1 syscon nr __NR_fchdir 0x0051 0x200000d 0x000d 0x000d 0x00d -1 syscon nr __NR_rename 0x0052 0x2000080 0x0080 0x0080 0x080 -1 @@ -2898,8 +2898,8 @@ syscon nr __NR_sysinfo 0x0063 -1 -1 -1 -1 -1 syscon nr __NR_times 0x0064 -1 -1 -1 -1 -1 syscon nr __NR_ptrace 0x0065 0x200001a 0x001a 0x001a 0x01a -1 syscon nr __NR_syslog 0x0067 -1 -1 -1 -1 -1 -syscon nr __NR_getuid 0x0066 0x2000018 0x0018 0x0018 -1 -1 -syscon nr __NR_getgid 0x0068 0x200002f 0x002f 0x002f -1 -1 +syscon nr __NR_getuid 0x0066 0x2000018 0x0018 0x0018 0x018 -1 +syscon nr __NR_getgid 0x0068 0x200002f 0x002f 0x002f 0x02f -1 syscon nr __NR_getppid 0x006e 0x2000027 0x0027 0x0027 -1 -1 syscon nr __NR_getpgrp 0x006f 0x2000051 0x0051 0x0051 0x051 -1 syscon nr __NR_setsid 0x0070 0x2000093 0x0093 0x0093 0x093 -1 @@ -3138,7 +3138,7 @@ syscon nr __NR_unmount -1 0x200009f 0x0016 0x0016 0x016 -1 syscon nr __NR_issetugid -1 0x2000147 0x00fd 0x00fd -1 -1 syscon nr __NR_minherit -1 0x20000fa 0x00fa 0x00fa 0x111 -1 syscon nr __NR_pathconf -1 0x20000bf 0x00bf 0x00bf 0x0bf -1 -syscon nr __NR_sysctl -1 0x20000ca -1 0x00ca -1 -1 +syscon nr __NR_sysctl -1 0x20000ca -1 0x00ca 0x0ca -1 syscon nr __NR_ntp_adjtime -1 0x200020f 0x00b0 -1 0x0b0 -1 syscon nr __NR_ntp_gettime -1 0x2000210 0x00f8 -1 0x1c0 -1 syscon nr __NR_shm_unlink -1 0x200010b 0x01e3 -1 -1 -1 diff --git a/libc/sysv/consts/__NR_getcwd.s b/libc/sysv/consts/__NR_getcwd.s index d0f87b11c..0037f8a4f 100644 --- a/libc/sysv/consts/__NR_getcwd.s +++ b/libc/sysv/consts/__NR_getcwd.s @@ -1,2 +1,2 @@ .include "libc/sysv/consts/syscon.inc" -.syscon nr __NR_getcwd 0x004f -1 0x0146 0x0130 -1 -1 +.syscon nr __NR_getcwd 0x004f -1 0x0146 0x0130 0x128 -1 diff --git a/libc/sysv/consts/__NR_getgid.s b/libc/sysv/consts/__NR_getgid.s index 3a772b216..0d34e2780 100644 --- a/libc/sysv/consts/__NR_getgid.s +++ b/libc/sysv/consts/__NR_getgid.s @@ -1,2 +1,2 @@ .include "libc/sysv/consts/syscon.inc" -.syscon nr __NR_getgid 0x0068 0x200002f 0x002f 0x002f -1 -1 +.syscon nr __NR_getgid 0x0068 0x200002f 0x002f 0x002f 0x02f -1 diff --git a/libc/sysv/consts/__NR_getpid.s b/libc/sysv/consts/__NR_getpid.s index 634f5acbc..d47b7a8a8 100644 --- a/libc/sysv/consts/__NR_getpid.s +++ b/libc/sysv/consts/__NR_getpid.s @@ -1,2 +1,2 @@ .include "libc/sysv/consts/syscon.inc" -.syscon nr __NR_getpid 0x0027 0x2000014 0x0014 0x0014 -1 -1 +.syscon nr __NR_getpid 0x0027 0x2000014 0x0014 0x0014 0x014 -1 diff --git a/libc/sysv/consts/__NR_getuid.s b/libc/sysv/consts/__NR_getuid.s index c86e12125..e09a0c7af 100644 --- a/libc/sysv/consts/__NR_getuid.s +++ b/libc/sysv/consts/__NR_getuid.s @@ -1,2 +1,2 @@ .include "libc/sysv/consts/syscon.inc" -.syscon nr __NR_getuid 0x0066 0x2000018 0x0018 0x0018 -1 -1 +.syscon nr __NR_getuid 0x0066 0x2000018 0x0018 0x0018 0x018 -1 diff --git a/libc/sysv/consts/__NR_sigaction.s b/libc/sysv/consts/__NR_sigaction.s index e75f1857a..478361a68 100644 --- a/libc/sysv/consts/__NR_sigaction.s +++ b/libc/sysv/consts/__NR_sigaction.s @@ -1,2 +1,2 @@ .include "libc/sysv/consts/syscon.inc" -.syscon nr __NR_sigaction 0x000d 0x200002e 0x01a0 0x002e -1 -1 +.syscon nr __NR_sigaction 0x000d 0x200002e 0x01a0 0x002e 0x154 -1 diff --git a/libc/sysv/consts/__NR_sysctl.s b/libc/sysv/consts/__NR_sysctl.s index f3e6febc6..99b2db046 100644 --- a/libc/sysv/consts/__NR_sysctl.s +++ b/libc/sysv/consts/__NR_sysctl.s @@ -1,2 +1,2 @@ .include "libc/sysv/consts/syscon.inc" -.syscon nr __NR_sysctl -1 0x20000ca -1 0x00ca -1 -1 +.syscon nr __NR_sysctl -1 0x20000ca -1 0x00ca 0x0ca -1 diff --git a/libc/sysv/netbsd.txt b/libc/sysv/netbsd.txt deleted file mode 100644 index a4f5338ba..000000000 --- a/libc/sysv/netbsd.txt +++ /dev/null @@ -1,554 +0,0 @@ -0 INDIR { int|sys||syscall(int code, ... register_t args[SYS_MAXSYSARGS]); } -1 STD { void|sys||exit(int rval); } -2 STD { int|sys||fork(void); } -3 STD RUMP { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } -4 STD RUMP { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } -5 STD RUMP { int|sys||open(const char *path, int flags, ... mode_t mode); } -6 STD RUMP { int|sys||close(int fd); } -7 COMPAT_50 MODULAR compat_50 { int|sys||wait4(pid_t pid, int *status, int options, struct rusage50 *rusage); } -8 COMPAT_43 MODULAR compat_43 { int|sys||creat(const char *path, mode_t mode); } ocreat -9 STD RUMP { int|sys||link(const char *path, const char *link); } -10 STD RUMP { int|sys||unlink(const char *path); } -11 OBSOL execv -12 STD RUMP { int|sys||chdir(const char *path); } -13 STD RUMP { int|sys||fchdir(int fd); } -14 COMPAT_50 MODULAR compat_50 RUMP { int|sys||mknod(const char *path, mode_t mode, uint32_t dev); } -15 STD RUMP { int|sys||chmod(const char *path, mode_t mode); } -16 STD RUMP { int|sys||chown(const char *path, uid_t uid, gid_t gid); } -17 STD { int|sys||obreak(char *nsize); } break -18 COMPAT_20 MODULAR compat_20 { int|sys||getfsstat(struct statfs12 *buf, long bufsize, int flags); } -19 COMPAT_43 MODULAR compat_43 { long|sys||lseek(int fd, long offset, int whence); } olseek -20 NOERR RUMP { pid_t|sys||getpid_with_ppid(void); } getpid -21 COMPAT_40 MODULAR compat_40 { int|sys||mount(const char *type, const char *path, int flags, void *data); } -22 STD RUMP { int|sys||unmount(const char *path, int flags); } -23 STD RUMP { int|sys||setuid(uid_t uid); } -24 NOERR RUMP { uid_t|sys||getuid_with_euid(void); } getuid -25 NOERR RUMP { uid_t|sys||geteuid(void); } -26 STD MODULAR ptrace { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } -27 STD RUMP { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } -28 STD RUMP { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } -29 STD RUMP { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } -30 STD RUMP { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } -31 STD RUMP { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } -32 STD RUMP { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } -33 STD RUMP { int|sys||access(const char *path, int flags); } -34 STD RUMP { int|sys||chflags(const char *path, u_long flags); } -35 STD RUMP { int|sys||fchflags(int fd, u_long flags); } -36 NOERR RUMP { void|sys||sync(void); } -37 STD { int|sys||kill(pid_t pid, int signum); } -38 COMPAT_43 MODULAR compat_43 { int|sys||stat(const char *path, struct stat43 *ub); } stat43 -39 NOERR RUMP { pid_t|sys||getppid(void); } -40 COMPAT_43 MODULAR compat_43 { int|sys||lstat(const char *path, struct stat43 *ub); } lstat43 -41 STD RUMP { int|sys||dup(int fd); } -42 STD RUMP { int|sys||pipe(void); } -43 NOERR RUMP { gid_t|sys||getegid(void); } -44 STD { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } -45 STD RUMP { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } -46 COMPAT_13 MODULAR compat_13 { int|sys||sigaction(int signum, const struct sigaction13 *nsa, struct sigaction13 *osa); } sigaction13 -47 NOERR RUMP { gid_t|sys||getgid_with_egid(void); } getgid -48 COMPAT_13 MODULAR compat_13 { int|sys||sigprocmask(int how, int mask); } sigprocmask13 -49 STD RUMP { int|sys||__getlogin(char *namebuf, size_t namelen); } -50 STD RUMP { int|sys||__setlogin(const char *namebuf); } -51 STD { int|sys||acct(const char *path); } -52 COMPAT_13 MODULAR compat_13 { int|sys||sigpending(void); } sigpending13 -53 COMPAT_13 MODULAR compat_13 { int|sys||sigaltstack( const struct sigaltstack13 *nss, struct sigaltstack13 *oss); } sigaltstack13 -54 STD RUMP { int|sys||ioctl(int fd, u_long com, ... void *data); } -55 COMPAT_12 MODULAR compat_12 { int|sys||reboot(int opt); } oreboot -56 STD RUMP { int|sys||revoke(const char *path); } -57 STD RUMP { int|sys||symlink(const char *path, const char *link); } -58 STD RUMP { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } -59 STD { int|sys||execve(const char *path, char * const *argp, char * const *envp); } -60 STD RUMP { mode_t|sys||umask(mode_t newmask); } -61 STD RUMP { int|sys||chroot(const char *path); } -62 COMPAT_43 MODULAR compat_43 { int|sys||fstat(int fd, struct stat43 *sb); } fstat43 -63 COMPAT_43 MODULAR compat_43 { int|sys||getkerninfo(int op, char *where, int *size, int arg); } ogetkerninfo -64 COMPAT_43 MODULAR compat_43 { int|sys||getpagesize(void); } ogetpagesize -65 COMPAT_12 MODULAR compat_12 { int|sys||msync(void *addr, size_t len); } -; XXX COMPAT_??? for 4.4BSD-compatible vfork(2)? -66 STD { int|sys||vfork(void); } -67 OBSOL vread -68 OBSOL vwrite -69 OBSOL sbrk -70 OBSOL sstk -71 COMPAT_43 MODULAR compat_43 { int|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long pos); } ommap -72 STD { int|sys||ovadvise(int anom); } vadvise -73 STD { int|sys||munmap(void *addr, size_t len); } -74 STD { int|sys||mprotect(void *addr, size_t len, int prot); } -75 STD { int|sys||madvise(void *addr, size_t len, int behav); } -76 OBSOL vhangup -77 OBSOL vlimit -78 STD { int|sys||mincore(void *addr, size_t len, char *vec); } -79 STD RUMP { int|sys||getgroups(int gidsetsize, gid_t *gidset); } -80 STD RUMP { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } -81 STD RUMP { int|sys||getpgrp(void); } -82 STD RUMP { int|sys||setpgid(pid_t pid, pid_t pgid); } -83 COMPAT_50 MODULAR compat_50 { int|sys||setitimer(int which, const struct itimerval50 *itv, struct itimerval50 *oitv); } -84 COMPAT_43 MODULAR compat_43 { int|sys||wait(void); } owait -85 COMPAT_12 MODULAR compat_12 { int|sys||swapon(const char *name); } oswapon -86 COMPAT_50 MODULAR compat_50 { int|sys||getitimer(int which, struct itimerval50 *itv); } -87 COMPAT_43 MODULAR compat_43 { int|sys||gethostname(char *hostname, u_int len); } ogethostname -88 COMPAT_43 MODULAR compat_43 { int|sys||sethostname(char *hostname, u_int len); } osethostname -89 COMPAT_43 MODULAR compat_43 { int|sys||getdtablesize(void); } ogetdtablesize -90 STD RUMP { int|sys||dup2(int from, int to); } -91 STD RUMP { ssize_t|sys||getrandom(void *buf, size_t buflen, unsigned int flags); } -92 STD RUMP { int|sys||fcntl(int fd, int cmd, ... void *arg); } -93 COMPAT_50 MODULAR compat_50 RUMP { int|sys||select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval50 *tv); } -94 UNIMPL setdopt -95 STD RUMP { int|sys||fsync(int fd); } -96 STD { int|sys||setpriority(int which, id_t who, int prio); } -97 COMPAT_30 MODULAR compat_30 { int|sys||socket(int domain, int type, int protocol); } -98 STD RUMP { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } -99 COMPAT_43 MODULAR compat_43 { int|sys||accept(int s, void *name, socklen_t *anamelen); } oaccept -100 STD { int|sys||getpriority(int which, id_t who); } -101 COMPAT_43 MODULAR compat_43 { int|sys||send(int s, void *buf, int len, int flags); } osend -102 COMPAT_43 MODULAR compat_43 { int|sys||recv(int s, void *buf, int len, int flags); } orecv -103 COMPAT_13 MODULAR compat_13 { int|sys||sigreturn(struct sigcontext13 *sigcntxp); } sigreturn13 -104 STD RUMP { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } -105 STD RUMP { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } -106 STD RUMP { int|sys||listen(int s, int backlog); } -107 OBSOL vtimes -108 COMPAT_43 MODULAR compat_43 { int|sys||sigvec(int signum, struct sigvec *nsv, struct sigvec *osv); } osigvec -109 COMPAT_43 MODULAR compat { int|sys||sigblock(int mask); } osigblock -110 COMPAT_43 MODULAR compat { int|sys||sigsetmask(int mask); } osigsetmask -111 COMPAT_13 MODULAR compat { int|sys||sigsuspend(int mask); } sigsuspend13 -112 COMPAT_43 MODULAR compat_43 { int|sys||sigstack(struct sigstack *nss, struct sigstack *oss); } osigstack -113 COMPAT_43 MODULAR compat_43 { int|sys||recvmsg(int s, struct omsghdr *msg, int flags); } orecvmsg -114 COMPAT_43 MODULAR compat_43 { int|sys||sendmsg(int s, void *msg, int flags); } osendmsg -115 OBSOL vtrace -116 COMPAT_50 MODULAR compat_50 { int|sys||gettimeofday(struct timeval50 *tp, void *tzp); } -117 COMPAT_50 MODULAR compat_50 { int|sys||getrusage(int who, struct rusage50 *rusage); } -118 STD RUMP { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } -119 OBSOL resuba -120 STD RUMP { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } -121 STD RUMP { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } -122 COMPAT_50 MODULAR compat_50 { int|sys||settimeofday(const struct timeval50 *tv, const void *tzp); } -123 STD RUMP { int|sys||fchown(int fd, uid_t uid, gid_t gid); } -124 STD RUMP { int|sys||fchmod(int fd, mode_t mode); } -125 COMPAT_43 MODULAR compat_43 { int|sys||recvfrom(int s, void *buf, size_t len, int flags, void *from, socklen_t *fromlenaddr); } orecvfrom -126 STD RUMP { int|sys||setreuid(uid_t ruid, uid_t euid); } -127 STD RUMP { int|sys||setregid(gid_t rgid, gid_t egid); } -128 STD RUMP { int|sys||rename(const char *from, const char *to); } -129 COMPAT_43 MODULAR compat_43 { int|sys||truncate(const char *path, long length); } otruncate -130 COMPAT_43 MODULAR compat_43 { int|sys||ftruncate(int fd, long length); } oftruncate -131 STD RUMP { int|sys||flock(int fd, int how); } -132 STD RUMP { int|sys||mkfifo(const char *path, mode_t mode); } -133 STD RUMP { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } -134 STD RUMP { int|sys||shutdown(int s, int how); } -135 STD RUMP { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } -136 STD RUMP { int|sys||mkdir(const char *path, mode_t mode); } -137 STD RUMP { int|sys||rmdir(const char *path); } -138 COMPAT_50 MODULAR compat_50 RUMP { int|sys||utimes(const char *path, const struct timeval50 *tptr); } -139 OBSOL 4.2 sigreturn -140 COMPAT_50 MODULAR compat_50 { int|sys||adjtime(const struct timeval50 *delta, struct timeval50 *olddelta); } -141 COMPAT_43 MODULAR compat_43 { int|sys||getpeername(int fdes, void *asa, socklen_t *alen); } ogetpeername -142 COMPAT_43 MODULAR compat_43 { int32_t|sys||gethostid(void); } ogethostid -143 COMPAT_43 MODULAR compat_43 { int|sys||sethostid(int32_t hostid); } osethostid -144 COMPAT_43 MODULAR compat_43 { int|sys||getrlimit(int which, struct orlimit *rlp); } ogetrlimit -145 COMPAT_43 MODULAR compat_43 { int|sys||setrlimit(int which, const struct orlimit *rlp); } osetrlimit -146 COMPAT_43 MODULAR compat_43 { int|sys||killpg(int pgid, int signum); } okillpg -147 STD RUMP { int|sys||setsid(void); } -148 COMPAT_50 MODULAR compat_50_quota { int|sys||quotactl(const char *path, int cmd, int uid, void *arg); } -149 COMPAT_43 MODULAR compat_43 { int|sys||quota(void); } oquota -150 COMPAT_43 MODULAR compat_43 { int|sys||getsockname(int fdec, void *asa, socklen_t *alen); } ogetsockname - -; Syscalls 151-180 inclusive are reserved for vendor-specific -; system calls. (This includes various calls added for compatibity -; with other Unix variants.) -; Some of these calls are now supported by BSD... -151 UNIMPL -152 UNIMPL -153 UNIMPL -154 UNIMPL -155 STD MODULAR nfsserver RUMP { int|sys||nfssvc(int flag, void *argp); } -156 COMPAT_43 MODULAR compat_43 { int|sys||getdirentries(int fd, char *buf, u_int count, long *basep); } ogetdirentries -157 COMPAT_20 MODULAR compat_20 { int|sys||statfs(const char *path, struct statfs12 *buf); } -158 COMPAT_20 MODULAR compat_20 { int|sys||fstatfs(int fd, struct statfs12 *buf); } -159 UNIMPL -160 UNIMPL -161 COMPAT_30 MODULAR compat_30 { int|sys||getfh(const char *fname, struct compat_30_fhandle *fhp); } -162 COMPAT_09 MODULAR compat_09 { int|sys||getdomainname(char *domainname, int len); } ogetdomainname -163 COMPAT_09 MODULAR compat_09 { int|sys||setdomainname(char *domainname, int len); } osetdomainname -164 COMPAT_09 MODULAR compat { int|sys||uname(struct outsname *name); } ouname -165 STD { int|sys||sysarch(int op, void *parms); } -166 STD { int|sys||__futex(int *uaddr, int op, int val, const struct timespec *timeout, int *uaddr2, int val2, int val3); } -167 STD { int|sys||__futex_set_robust_list(void *head, size_t len); } -168 STD { int|sys||__futex_get_robust_list(lwpid_t lwpid, void **headp, size_t *lenp); } -; XXX more generally, never on machines where sizeof(void *) != sizeof(int) -#if !defined(_LP64) -169 COMPAT_10 MODULAR compat_sysv_10 { int|sys||semsys(int which, int a2, int a3, int a4, int a5); } osemsys -#else -169 EXCL 1.0 semsys -#endif -; XXX more generally, never on machines where sizeof(void *) != sizeof(int) -#if !defined(_LP64) -170 COMPAT_10 MODULAR compat_sysv_10 { int|sys||msgsys(int which, int a2, int a3, int a4, int a5, int a6); } omsgsys -#else -170 EXCL 1.0 msgsys -#endif -; XXX more generally, never on machines where sizeof(void *) != sizeof(int) -#if !defined(_LP64) -171 COMPAT_10 MODULAR compat_sysv_10 { int|sys||shmsys(int which, int a2, int a3, int a4); } oshmsys -#else -171 EXCL 1.0 shmsys -#endif -172 UNIMPL -173 STD RUMP { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } -174 STD RUMP { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } -; For some reason, ntp_gettime doesn't want to raise SIGSYS when it's excluded. -175 COMPAT_30 MODULAR compat_30 { int|sys||ntp_gettime(struct ntptimeval30 *ntvp); } -#if defined(NTP) || !defined(_KERNEL_OPT) -176 STD { int|sys||ntp_adjtime(struct timex *tp); } -#else -176 EXCL ntp_adjtime -#endif -177 UNIMPL -178 UNIMPL -179 UNIMPL -180 UNIMPL - -; Syscalls 180-199 are used by/reserved for BSD -181 STD RUMP { int|sys||setgid(gid_t gid); } -182 STD RUMP { int|sys||setegid(gid_t egid); } -183 STD RUMP { int|sys||seteuid(uid_t euid); } -184 STD MODULAR lfs { int|sys||lfs_bmapv(fsid_t *fsidp, struct block_info *blkiov, int blkcnt); } -185 STD MODULAR lfs { int|sys||lfs_markv(fsid_t *fsidp, struct block_info *blkiov, int blkcnt); } -186 STD MODULAR lfs { int|sys||lfs_segclean(fsid_t *fsidp, u_long segment); } -187 COMPAT_50 MODULAR compat_50 { int|sys||lfs_segwait(fsid_t *fsidp, struct timeval50 *tv); } -188 COMPAT_12 MODULAR compat_12 { int|sys||stat(const char *path, struct stat12 *ub); } stat12 -189 COMPAT_12 MODULAR compat_12 { int|sys||fstat(int fd, struct stat12 *sb); } fstat12 -190 COMPAT_12 MODULAR compat_12 { int|sys||lstat(const char *path, struct stat12 *ub); } lstat12 -191 STD RUMP { long|sys||pathconf(const char *path, int name); } -192 STD RUMP { long|sys||fpathconf(int fd, int name); } -193 STD RUMP { int|sys||getsockopt2(int s, int level, int name, void *val, socklen_t *avalsize); } -194 STD RUMP { int|sys||getrlimit(int which, struct rlimit *rlp); } -195 STD RUMP { int|sys||setrlimit(int which, const struct rlimit *rlp); } -196 COMPAT_12 MODULAR compat_12 { int|sys||getdirentries(int fd, char *buf, u_int count, long *basep); } -197 STD { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } -198 INDIR { quad_t|sys||__syscall(quad_t code, ... register_t args[SYS_MAXSYSARGS]); } -199 STD RUMP { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } -200 STD RUMP { int|sys||truncate(const char *path, int PAD, off_t length); } -201 STD RUMP { int|sys||ftruncate(int fd, int PAD, off_t length); } -202 STD RUMP { int|sys||__sysctl(const int *name, u_int namelen, void *oldv, size_t *oldlenp, const void *newv, size_t newlen); } -203 STD { int|sys||mlock(const void *addr, size_t len); } -204 STD { int|sys||munlock(const void *addr, size_t len); } -205 STD { int|sys||undelete(const char *path); } -206 COMPAT_50 MODULAR compat_50 RUMP { int|sys||futimes(int fd, const struct timeval50 *tptr); } -207 STD RUMP { pid_t|sys||getpgid(pid_t pid); } -208 STD RUMP { int|sys||reboot(int opt, char *bootstr); } -209 STD RUMP { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } -; -; Syscalls 210-219 are reserved for dynamically loaded syscalls -; -210 EXTERN MODULAR openafs { int|sys||afssys(long id, long a1, long a2, long a3, long a4, long a5, long a6); } -211 UNIMPL -212 UNIMPL -213 UNIMPL -214 UNIMPL -215 UNIMPL -216 UNIMPL -217 UNIMPL -218 UNIMPL -219 UNIMPL -; System calls 220-300 are reserved for use by NetBSD -220 COMPAT_14 MODULAR compat_sysv_14 { int|sys||__semctl(int semid, int semnum, int cmd, union __semun *arg); } -221 STD MODULAR sysv_ipc { int|sys||semget(key_t key, int nsems, int semflg); } -222 STD MODULAR sysv_ipc { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } -223 STD MODULAR sysv_ipc { int|sys||semconfig(int flag); } -224 COMPAT_14 MODULAR compat_sysv_14 { int|sys||msgctl(int msqid, int cmd, struct msqid_ds14 *buf); } -225 STD MODULAR sysv_ipc { int|sys||msgget(key_t key, int msgflg); } -226 STD MODULAR sysv_ipc { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } -227 STD MODULAR sysv_ipc { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } -228 STD MODULAR sysv_ipc { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } -229 COMPAT_14 MODULAR compat_sysv_14 { int|sys||shmctl(int shmid, int cmd, struct shmid_ds14 *buf); } -230 STD MODULAR sysv_ipc { int|sys||shmdt(const void *shmaddr); } -231 STD MODULAR sysv_ipc { int|sys||shmget(key_t key, size_t size, int shmflg); } -232 COMPAT_50 MODULAR compat_50 { int|sys||clock_gettime(clockid_t clock_id, struct timespec50 *tp); } -233 COMPAT_50 MODULAR compat_50 { int|sys||clock_settime(clockid_t clock_id, const struct timespec50 *tp); } -234 COMPAT_50 MODULAR compat_50 { int|sys||clock_getres(clockid_t clock_id, struct timespec50 *tp); } -235 STD RUMP { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } -236 STD RUMP { int|sys||timer_delete(timer_t timerid); } -237 COMPAT_50 MODULAR compat_50 { int|sys||timer_settime(timer_t timerid, int flags, const struct itimerspec50 *value, struct itimerspec50 *ovalue); } -238 COMPAT_50 MODULAR compat_50 { int|sys||timer_gettime(timer_t timerid, struct itimerspec50 *value); } -239 STD RUMP { int|sys||timer_getoverrun(timer_t timerid); } -; -; Syscalls 240-269 are reserved for other IEEE Std1003.1b syscalls -; -240 COMPAT_50 MODULAR compat_50 { int|sys||nanosleep(const struct timespec50 *rqtp, struct timespec50 *rmtp); } -241 STD RUMP { int|sys||fdatasync(int fd); } -242 STD { int|sys||mlockall(int flags); } -243 STD { int|sys||munlockall(void); } -244 COMPAT_50 MODULAR compat_50 { int|sys||__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec50 *timeout); } -245 STD { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } -246 STD RUMP { int|sys||modctl(int cmd, void *arg); } -247 STD MODULAR ksem RUMP { int|sys||_ksem_init(unsigned int value, intptr_t *idp); } -248 STD MODULAR ksem RUMP { int|sys||_ksem_open(const char *name, int oflag, mode_t mode, unsigned int value, intptr_t *idp); } -249 STD MODULAR ksem RUMP { int|sys||_ksem_unlink(const char *name); } -250 STD MODULAR ksem RUMP { int|sys||_ksem_close(intptr_t id); } -251 STD MODULAR ksem RUMP { int|sys||_ksem_post(intptr_t id); } -252 STD MODULAR ksem RUMP { int|sys||_ksem_wait(intptr_t id); } -253 STD MODULAR ksem RUMP { int|sys||_ksem_trywait(intptr_t id); } -254 STD MODULAR ksem RUMP { int|sys||_ksem_getvalue(intptr_t id, unsigned int *value); } -255 STD MODULAR ksem RUMP { int|sys||_ksem_destroy(intptr_t id); } -256 STD MODULAR ksem RUMP { int|sys||_ksem_timedwait(intptr_t id, const struct timespec *abstime); } -257 STD MODULAR mqueue { mqd_t|sys||mq_open(const char * name, int oflag, mode_t mode, struct mq_attr *attr); } -258 STD MODULAR mqueue { int|sys||mq_close(mqd_t mqdes); } -259 STD MODULAR mqueue { int|sys||mq_unlink(const char *name); } -260 STD MODULAR mqueue { int|sys||mq_getattr(mqd_t mqdes, struct mq_attr *mqstat); } -261 STD MODULAR mqueue { int|sys||mq_setattr(mqd_t mqdes, const struct mq_attr *mqstat, struct mq_attr *omqstat); } -262 STD MODULAR mqueue { int|sys||mq_notify(mqd_t mqdes, const struct sigevent *notification); } -263 STD MODULAR mqueue { int|sys||mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio); } -264 STD MODULAR mqueue { ssize_t|sys||mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio); } -265 COMPAT_50 MODULAR compat_50 { int|sys||mq_timedsend(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec50 *abs_timeout); } -266 COMPAT_50 MODULAR compat_50 { ssize_t|sys||mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec50 *abs_timeout); } -267 UNIMPL -268 UNIMPL -269 UNIMPL -270 STD RUMP { int|sys||__posix_rename(const char *from, const char *to); } -271 STD { int|sys||swapctl(int cmd, void *arg, int misc); } -272 COMPAT_30 MODULAR compat_30 { int|sys||getdents(int fd, char *buf, size_t count); } -273 STD { int|sys||minherit(void *addr, size_t len, int inherit); } -274 STD RUMP { int|sys||lchmod(const char *path, mode_t mode); } -275 STD RUMP { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } -276 COMPAT_50 MODULAR compat_50 RUMP { int|sys||lutimes(const char *path, const struct timeval50 *tptr); } -277 STD { int|sys|13|msync(void *addr, size_t len, int flags); } -278 COMPAT_30 MODULAR compat_30 { int|sys|13|stat(const char *path, struct stat13 *ub); } -279 COMPAT_30 MODULAR compat_30 { int|sys|13|fstat(int fd, struct stat13 *sb); } -280 COMPAT_30 MODULAR compat_30 { int|sys|13|lstat(const char *path, struct stat13 *ub); } -281 STD { int|sys|14|sigaltstack( const struct sigaltstack *nss, struct sigaltstack *oss); } -282 STD { int|sys|14|vfork(void); } -283 STD RUMP { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } -284 STD RUMP { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } -285 STD RUMP { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } -286 STD RUMP { pid_t|sys||getsid(pid_t pid); } -287 STD { pid_t|sys||__clone(int flags, void *stack); } -288 STD RUMP { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } -289 STD RUMP { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } -290 STD RUMP { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } -291 COMPAT_16 MODULAR compat_16 { int|sys|14|sigaction(int signum, const struct sigaction *nsa, struct sigaction *osa); } -292 STD { int|sys|14|sigpending(sigset_t *set); } -293 STD { int|sys|14|sigprocmask(int how, const sigset_t *set, sigset_t *oset); } -294 STD { int|sys|14|sigsuspend(const sigset_t *set); } -295 COMPAT_16 MODULAR compat_16 { int|sys|14|sigreturn(struct sigcontext *sigcntxp); } -296 STD RUMP { int|sys||__getcwd(char *bufp, size_t length); } -297 STD RUMP { int|sys||fchroot(int fd); } -298 COMPAT_30 MODULAR compat_30 { int|sys||fhopen(const struct compat_30_fhandle *fhp, int flags); } -299 COMPAT_30 MODULAR compat_30 { int|sys||fhstat(const struct compat_30_fhandle *fhp, struct stat13 *sb); } -300 COMPAT_20 MODULAR compat_20 { int|sys||fhstatfs(const struct compat_30_fhandle *fhp, struct statfs12 *buf); } -301 COMPAT_50 MODULAR compat_sysv_50 { int|sys|13|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } -302 COMPAT_50 MODULAR compat_sysv_50 { int|sys|13|msgctl(int msqid, int cmd, struct msqid_ds *buf); } -303 COMPAT_50 MODULAR compat_sysv_50 { int|sys|13|shmctl(int shmid, int cmd, struct shmid_ds13 *buf); } -304 STD RUMP { int|sys||lchflags(const char *path, u_long flags); } -305 NOERR RUMP { int|sys||issetugid(void); } -306 STD RUMP { int|sys||utrace(const char *label, void *addr, size_t len); } -307 STD { int|sys||getcontext(struct __ucontext *ucp); } -308 STD { int|sys||setcontext(const struct __ucontext *ucp); } -309 STD { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } -310 STD { int|sys||_lwp_exit(void); } -311 STD { lwpid_t|sys||_lwp_self(void); } -312 STD { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } -313 STD { int|sys||_lwp_suspend(lwpid_t target); } -314 STD { int|sys||_lwp_continue(lwpid_t target); } -315 STD { int|sys||_lwp_wakeup(lwpid_t target); } -316 STD { void *|sys||_lwp_getprivate(void); } -317 STD { void|sys||_lwp_setprivate(void *ptr); } -318 STD { int|sys||_lwp_kill(lwpid_t target, int signo); } -319 STD { int|sys||_lwp_detach(lwpid_t target); } -320 COMPAT_50 MODULAR compat_50 { int|sys||_lwp_park(const struct timespec50 *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } -321 STD { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } -322 STD { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } -323 STD { int|sys||_lwp_setname(lwpid_t target, const char *name); } -324 STD { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } -325 STD { int|sys||_lwp_ctl(int features, struct lwpctl **address); } -; Syscalls 326-339 reserved for LWP syscalls. -326 UNIMPL -327 UNIMPL -328 UNIMPL -329 UNIMPL -; SA system calls. -330 COMPAT_60 MODULAR compat_60 { int|sys||sa_register(void *newv, void **oldv, int flags, ssize_t stackinfo_offset); } -331 COMPAT_60 MODULAR compat_60 { int|sys||sa_stacks(int num, stack_t *stacks); } -332 COMPAT_60 MODULAR compat_60 { int|sys||sa_enable(void); } -333 COMPAT_60 MODULAR compat_60 { int|sys||sa_setconcurrency(int concurrency); } -334 COMPAT_60 MODULAR compat_60 { int|sys||sa_yield(void); } -335 COMPAT_60 MODULAR compat_60 { int|sys||sa_preempt(int sa_id); } -336 OBSOL sys_sa_unblockyield -; -; Syscalls 337-339 are reserved for other scheduler activation syscalls. -; -337 UNIMPL -338 UNIMPL -339 UNIMPL -340 STD { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } -341 OBSOL sys_pmc_get_info -342 OBSOL sys_pmc_control -343 STD { int|sys||rasctl(void *addr, size_t len, int op); } -344 STD RUMP { int|sys||kqueue(void); } -345 COMPAT_50 MODULAR compat_50 RUMP { int|sys||kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec50 *timeout); } - -; Scheduling system calls. -346 STD { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } -347 STD { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } -348 STD { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } -349 STD { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } -350 STD { int|sys||sched_yield(void); } -351 STD { int|sys||_sched_protect(int priority); } -352 UNIMPL -353 UNIMPL - -354 STD RUMP { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } -355 STD { int|sys||uuidgen(struct uuid *store, int count); } -356 COMPAT_90 MODULAR compat_90 { int|sys||getvfsstat(struct statvfs90 *buf, size_t bufsize, int flags); } -357 COMPAT_90 MODULAR compat_90 { int|sys||statvfs1(const char *path, struct statvfs90 *buf, int flags); } -358 COMPAT_90 MODULAR compat_90 { int|sys||fstatvfs1(int fd, struct statvfs90 *buf, int flags); } -359 COMPAT_30 MODULAR compat_30 { int|sys||fhstatvfs1( const struct compat_30_fhandle *fhp, struct statvfs90 *buf, int flags); } -360 STD RUMP { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } -361 STD RUMP { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } -362 STD RUMP { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } -363 STD RUMP { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } -364 STD RUMP { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } -365 STD RUMP { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } -366 STD RUMP { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } -367 STD RUMP { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } -368 STD RUMP { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } -369 STD RUMP { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } -370 STD RUMP { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } -371 STD RUMP { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } -372 STD RUMP { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } -373 COMPAT_50 MODULAR compat_50 RUMP { int|sys||pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec50 *ts, const sigset_t *mask); } -374 COMPAT_50 MODULAR compat_50 RUMP { int|sys||pollts(struct pollfd *fds, u_int nfds, const struct timespec50 *ts, const sigset_t *mask); } -375 STD RUMP { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } -376 STD RUMP { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } -377 STD RUMP { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } -378 STD RUMP { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } -379 STD RUMP { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } -380 STD RUMP { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } -381 STD RUMP { int|sys||listxattr(const char *path, char *list, size_t size); } -382 STD RUMP { int|sys||llistxattr(const char *path, char *list, size_t size); } -383 STD RUMP { int|sys||flistxattr(int fd, char *list, size_t size); } -384 STD RUMP { int|sys||removexattr(const char *path, const char *name); } -385 STD RUMP { int|sys||lremovexattr(const char *path, const char *name); } -386 STD RUMP { int|sys||fremovexattr(int fd, const char *name); } -387 COMPAT_50 MODULAR compat_50 RUMP { int|sys|30|stat(const char *path, struct stat30 *ub); } -388 COMPAT_50 MODULAR compat_50 RUMP { int|sys|30|fstat(int fd, struct stat30 *sb); } -389 COMPAT_50 MODULAR compat_50 RUMP { int|sys|30|lstat(const char *path, struct stat30 *ub); } -390 STD RUMP { int|sys|30|getdents(int fd, char *buf, size_t count); } -391 IGNORED old posix_fadvise -392 COMPAT_30 MODULAR compat_30 { int|sys|30|fhstat(const struct compat_30_fhandle *fhp, struct stat30 *sb); } -393 COMPAT_50 MODULAR compat_30 { int|sys|30|ntp_gettime(struct ntptimeval50 *ntvp); } -394 STD RUMP { int|sys|30|socket(int domain, int type, int protocol); } -395 STD RUMP { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } -396 STD RUMP { int|sys|40|fhopen(const void *fhp, size_t fh_size, int flags); } -397 COMPAT_90 MODULAR compat_90 { int|sys||fhstatvfs1(const void *fhp, size_t fh_size, struct statvfs90 *buf, int flags); } -398 COMPAT_50 MODULAR compat_50 RUMP { int|sys|40|fhstat(const void *fhp, size_t fh_size, struct stat30 *sb); } - -; Asynchronous I/O system calls -399 STD MODULAR aio RUMP { int|sys||aio_cancel(int fildes, struct aiocb *aiocbp); } -400 STD MODULAR aio RUMP { int|sys||aio_error(const struct aiocb *aiocbp); } -401 STD MODULAR aio RUMP { int|sys||aio_fsync(int op, struct aiocb *aiocbp); } -402 STD MODULAR aio RUMP { int|sys||aio_read(struct aiocb *aiocbp); } -403 STD MODULAR aio RUMP { int|sys||aio_return(struct aiocb *aiocbp); } -404 COMPAT_50 MODULAR compat { int|sys||aio_suspend(const struct aiocb *const *list, int nent, const struct timespec50 *timeout); } -405 STD MODULAR aio RUMP { int|sys||aio_write(struct aiocb *aiocbp); } -406 STD MODULAR aio RUMP { int|sys||lio_listio(int mode, struct aiocb *const *list, int nent, struct sigevent *sig); } - -407 UNIMPL -408 UNIMPL -409 UNIMPL - -410 STD RUMP { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } -411 STD { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } - -; Processor-sets system calls -412 STD { int|sys||pset_create(psetid_t *psid); } -413 STD { int|sys||pset_destroy(psetid_t psid); } -414 STD { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } -415 STD { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } -416 NOERR RUMP { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } -417 STD RUMP { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } -418 STD RUMP { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } -419 STD RUMP { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } -420 STD RUMP { int|sys|50|utimes(const char *path, const struct timeval *tptr); } -421 STD RUMP { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } -422 STD MODULAR lfs { int|sys|50|lfs_segwait(fsid_t *fsidp, struct timeval *tv); } -423 STD RUMP { int|sys|50|futimes(int fd, const struct timeval *tptr); } -424 STD RUMP { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } -425 STD RUMP { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } -426 STD RUMP { int|sys|50|getitimer(int which, struct itimerval *itv); } -427 STD RUMP { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } -428 STD RUMP { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } -429 STD RUMP { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } -430 STD RUMP { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } -431 STD { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } -432 STD MODULAR mqueue { int|sys|50|mq_timedsend(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio, const struct timespec *abs_timeout); } -433 STD MODULAR mqueue { ssize_t|sys|50|mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio, const struct timespec *abs_timeout); } -434 COMPAT_60 MODULAR compat_60 { int|sys||_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } -435 STD RUMP { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } -436 STD RUMP { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } -437 STD RUMP { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } -438 STD MODULAR aio RUMP { int|sys|50|aio_suspend( const struct aiocb *const *list, int nent, const struct timespec *timeout); } -439 STD RUMP { int|sys|50|stat(const char *path, struct stat *ub); } -440 STD RUMP { int|sys|50|fstat(int fd, struct stat *sb); } -441 STD RUMP { int|sys|50|lstat(const char *path, struct stat *ub); } -442 STD MODULAR sysv_ipc { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } -443 STD MODULAR sysv_ipc { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } -444 STD MODULAR sysv_ipc { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } -445 STD { int|sys|50|getrusage(int who, struct rusage *rusage); } -446 STD RUMP { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } -447 STD RUMP { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } -#if defined(NTP) || !defined(_KERNEL_OPT) -448 STD { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } -#else -448 EXCL ___ntp_gettime50 -#endif -449 STD { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } -450 STD RUMP { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } -451 STD RUMP { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } -; 452 only ever appeared in 5.99.x and can be reused after netbsd-7 -452 OBSOL 5.99 quotactl -453 STD RUMP { int|sys||pipe2(int *fildes, int flags); } -454 STD RUMP { int|sys||dup3(int from, int to, int flags); } -455 STD RUMP { int|sys||kqueue1(int flags); } -456 STD RUMP { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } -457 STD RUMP { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } -458 STD RUMP { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } -459 STD RUMP { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } -460 STD RUMP { int|sys||mknodat(int fd, const char *path, mode_t mode, int PAD, dev_t dev); } -461 STD RUMP { int|sys||mkdirat(int fd, const char *path, mode_t mode); } -462 STD RUMP { int|sys||faccessat(int fd, const char *path, int amode, int flag); } -463 STD RUMP { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } -464 STD RUMP { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } -465 STD { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } -466 STD RUMP { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } -467 STD RUMP { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } -468 STD RUMP { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } -469 STD RUMP { ssize_t|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } -470 STD RUMP { int|sys||symlinkat(const char *path1, int fd, const char *path2); } -471 STD RUMP { int|sys||unlinkat(int fd, const char *path, int flag); } -472 STD RUMP { int|sys||futimens(int fd, const struct timespec *tptr); } -473 STD RUMP { int|sys||__quotactl(const char *path, struct quotactl_args *args); } -474 NOERR { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } -475 STD RUMP { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } -476 STD RUMP { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } -477 NOERR RUMP { int|sys||clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp); } -478 STD { int|sys|60|_lwp_park(clockid_t clock_id, int flags, struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } -479 NOERR RUMP { int|sys||posix_fallocate(int fd, int PAD, off_t pos, off_t len); } -480 STD RUMP { int|sys||fdiscard(int fd, int PAD, off_t pos, off_t len); } -481 STD { int|sys||wait6(idtype_t idtype, id_t id, int *status, int options, struct wrusage *wru, siginfo_t *info); } -482 STD RUMP { int|sys||clock_getcpuclockid2(idtype_t idtype, id_t id, clockid_t *clock_id); } -483 STD RUMP { int|sys|90|getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } -484 STD RUMP { int|sys|90|statvfs1(const char *path, struct statvfs *buf, int flags); } -485 STD RUMP { int|sys|90|fstatvfs1(int fd, struct statvfs *buf, int flags); } -486 STD RUMP { int|sys|90|fhstatvfs1(const void *fhp, size_t fh_size, struct statvfs *buf, int flags); } -487 STD { int|sys||__acl_get_link(const char *path, acl_type_t type, struct acl *aclp); } -488 STD { int|sys||__acl_set_link(const char *path, acl_type_t type, struct acl *aclp); } -489 STD { int|sys||__acl_delete_link(const char *path, acl_type_t type); } -490 STD { int|sys||__acl_aclcheck_link(const char *path, acl_type_t type, struct acl *aclp); } -491 STD { int|sys||__acl_get_file(const char *path, acl_type_t type, struct acl *aclp); } -492 STD { int|sys||__acl_set_file(const char *path, acl_type_t type, struct acl *aclp); } -493 STD { int|sys||__acl_get_fd(int filedes, acl_type_t type, struct acl *aclp); } -494 STD { int|sys||__acl_set_fd(int filedes, acl_type_t type, struct acl *aclp); } -495 STD { int|sys||__acl_delete_file(const char *path, acl_type_t type); } -496 STD { int|sys||__acl_delete_fd(int filedes, acl_type_t type); } -497 STD { int|sys||__acl_aclcheck_file(const char *path, acl_type_t type, struct acl *aclp); } -498 STD { int|sys||__acl_aclcheck_fd(int filedes, acl_type_t type, struct acl *aclp); } -499 STD RUMP { long|sys||lpathconf(const char *path, int name); } diff --git a/libc/sysv/newconsts.py b/libc/sysv/newconsts.py index 10876a713..7285ef653 100644 --- a/libc/sysv/newconsts.py +++ b/libc/sysv/newconsts.py @@ -1,6 +1,6 @@ import sys -H = '/home/jart/vendor/netbsd/sys/sys/ioctl.h' +H = '/home/jart/vendor/netbsd/sys/sys/spawn.h' G = 'errno' MAGNUMS = {} diff --git a/libc/sysv/syscalls.sh b/libc/sysv/syscalls.sh index ab6f1dde9..ad66d09ed 100755 --- a/libc/sysv/syscalls.sh +++ b/libc/sysv/syscalls.sh @@ -43,16 +43,16 @@ scall __sys_fstat 0x1b80352272153005 globl hidden # needs __stat2linux() scall __sys_lstat 0x1b90280282154006 globl hidden # needs __stat2linux(); blocked on Android scall sys_poll 0x0d10fc0d120e6007 globl hidden scall sys_ppoll 0xfff06d221ffff10f globl hidden # consider INTON/INTOFF tutorial in examples/unbourne.c -scall __sys_lseek 0x0c70c71de20c7008 globl hidden # openbsd:evilpad -scall __sys_mmap 0x0c50c51dd20c5009 globl hidden # openbsd:pad +scall __sys_lseek 0x0c70c71de20c7008 globl hidden # netbsd+openbsd:evilpad +scall __sys_mmap 0x0c50c51dd20c5009 globl hidden # netbsd+openbsd:pad scall sys_msync 0x115100041204101a globl hidden scall sys_mprotect 0x04a04a04a204a00a globl hidden scall sys_munmap 0x049049049204900b globl hidden -scall sys_sigaction 0xfff02e1a0202e00d globl hidden # rt_sigaction on Lunix +scall sys_sigaction 0x15402e1a0202e00d globl hidden # rt_sigaction on Lunix; it's complicated on NetBSD scall sys_sigprocmask 0x125030154203000e globl hidden # a.k.a. rt_sigprocmask scall sys_ioctl 0x0360360362036010 globl hidden -scall __sys_pread 0x0ad0ad1db2099011 globl hidden # a.k.a. pread64; openbsd:pad -scall __sys_pwrite 0x0ae0ae1dc209a012 globl hidden # a.k.a. pwrite64; openbsd:pad +scall __sys_pread 0x0ad0ad1db2099011 globl hidden # a.k.a. pread64; netbsd+openbsd:pad +scall __sys_pwrite 0x0ae0ae1dc209a012 globl hidden # a.k.a. pwrite64; netbsd+openbsd:pad scall sys_readv 0x0780780782078013 globl hidden scall sys_writev 0x0790790792079014 globl hidden scall sys_access 0x0210210212021015 globl hidden @@ -74,7 +74,7 @@ scall sys_nanosleep 0x1ae05b0f0ffff023 globl hidden scall sys_getitimer 0x1aa0460562056024 globl hidden scall sys_setitimer 0x1a90450532053026 globl hidden scall sys_alarm 0xfffffffffffff025 globl hidden -scall sys_getpid 0xfff0140142014027 globl hidden +scall sys_getpid 0x0140140142014027 globl hidden # netbsd returns ppid in edx scall sys_sendfile 0xffffff1892151028 globl hidden # Linux vs. XNU/BSD ABIs very different scall __sys_socket 0x18a0610612061029 globl hidden scall __sys_connect 0x062062062206202a globl hidden @@ -116,9 +116,9 @@ scall sys_fcntl 0x05c05c05c205c048 globl hidden scall sys_flock 0x0830830832083049 globl hidden scall sys_fsync 0x05f05f05f205f04a globl hidden scall sys_fdatasync 0x0f105f22620bb04b globl hidden # fsync() on openbsd -scall __sys_truncate 0x0c80c81df20c804c globl hidden # openbsd:pad -scall __sys_ftruncate 0x0c90c91e020c904d globl hidden # openbsd:pad -scall sys_getcwd 0xfff130146ffff04f globl hidden +scall __sys_truncate 0x0c80c81df20c804c globl hidden # netbsd+openbsd:pad +scall __sys_ftruncate 0x0c90c91e020c904d globl hidden # netbsd+openbsd:pad +scall sys_getcwd 0x128130146ffff04f globl hidden scall sys_chdir 0x00c00c00c200c050 globl hidden scall sys_fchdir 0x00d00d00d200d051 globl hidden scall sys_rename 0x0800800802080052 globl hidden @@ -142,9 +142,9 @@ scall sys_sysinfo 0xfffffffffffff063 globl hidden scall sys_times 0xfffffffffffff064 globl hidden scall sys_ptrace 0x01a01a01a201a065 globl hidden scall syslog 0xfffffffffffff067 globl -scall sys_getuid 0xfff0180182018066 globl hidden -scall sys_getgid 0xfff02f02f202f068 globl hidden -scall sys_getppid 0xfff027027202706e globl hidden +scall sys_getuid 0x0180180182018066 globl hidden +scall sys_getgid 0x02f02f02f202f068 globl hidden +scall sys_getppid 0xfff027027202706e globl hidden # see sys_getpid()→edx for netbsd scall getpgrp 0x051051051205106f globl scall sys_setsid 0x0930930932093070 globl hidden scall sys_getsid 0x11e0ff136213607c globl hidden @@ -396,7 +396,7 @@ scall unmount 0x016016016209ffff globl scall issetugid 0xfff0fd0fd2147fff globl scall minherit 0x1110fa0fa20fafff globl scall pathconf 0x0bf0bf0bf20bffff globl -scall sysctl 0xfff0ca0ca20cafff globl +scall sysctl 0x0ca0ca0ca20cafff globl #───────────────────────XNU & FREEBSD──────────────────────── scall ntp_adjtime 0x0b0fff0b0220ffff globl scall ntp_gettime 0x1c0fff0f82210fff globl diff --git a/test/libc/calls/sigaction_test.c b/test/libc/calls/sigaction_test.c index 44c58b051..864da0744 100644 --- a/test/libc/calls/sigaction_test.c +++ b/test/libc/calls/sigaction_test.c @@ -32,6 +32,10 @@ void OnSigInt(int sig) { gotsigint = true; } +void SetUp(void) { + gotsigint = false; +} + TEST(sigaction, test) { /* TODO(jart): Why does RHEL5 behave differently? */ /* TODO(jart): Windows needs huge signal overhaul */ @@ -61,3 +65,12 @@ TEST(sigaction, test) { EXPECT_EQ(0, WTERMSIG(status)); EXPECT_NE(-1, sigprocmask(SIG_BLOCK, &oldmask, NULL)); } + +TEST(sigaction, raise) { + if (IsWindows()) return; + struct sigaction saint = {.sa_handler = OnSigInt}; + EXPECT_NE(-1, sigaction(SIGINT, &saint, NULL)); + ASSERT_FALSE(gotsigint); + EXPECT_NE(-1, raise(SIGINT)); + ASSERT_TRUE(gotsigint); +} diff --git a/tool/net/greenbean.c b/tool/net/greenbean.c index 2c0f11fb2..90b897ed5 100644 --- a/tool/net/greenbean.c +++ b/tool/net/greenbean.c @@ -147,7 +147,7 @@ struct Client { struct Client *next; int fd; int iovlen; - bool close; + bool closeit; uint32_t insize; uint32_t addrsize; uint8_t gzip_footer[8]; @@ -921,7 +921,7 @@ bool HandleRequest(struct Client *c) { content = ""; gzipped = false; contentlength = -1; - c->close = false; + c->closeit = false; if ((msgsize = ParseHttpRequest(&c->req, c->inbuf, c->insize)) != -1) { if (!msgsize) return false; if (logmessages) { @@ -929,13 +929,13 @@ bool HandleRequest(struct Client *c) { c->req.length - 4, c->inbuf); } version = GetHttpVersion(c); - if (version < 101) c->close = true, legacyhttp = true; + if (version < 101) c->closeit = true, legacyhttp = true; if (version <= 101) { - if (IsConnectionClose(c)) c->close = true; + if (IsConnectionClose(c)) c->closeit = true; path = c->inbuf + c->req.uri.a; pathlen = c->req.uri.b - c->req.uri.a; if (c->req.method == kHttpGet || c->req.method == kHttpHead) { - if (ParseContentLength(&c->req, c->inbuf)) c->close = true; + if (ParseContentLength(&c->req, c->inbuf)) c->closeit = true; VERBOSEF( "%s %s %.*s referer %.*s", c->addrstr, kHttpMethod[c->req.method], pathlen, path, @@ -1026,7 +1026,7 @@ bool HandleRequest(struct Client *c) { p = AppendStatus(p, 405, "method not allowed"); p = AppendContentTypeTextPlain(p); content = "Method Not Allowed\r\n"; - c->close = true; + c->closeit = true; } } else { WARNF("%s http version not supported %`'.*s", c->addrstr, @@ -1034,19 +1034,19 @@ bool HandleRequest(struct Client *c) { p = AppendStatus(p, 505, "HTTP Version Not Supported"); p = AppendContentTypeTextPlain(p); content = "HTTP Version Not Supported\r\n"; - c->close = true; + c->closeit = true; } } else { WARNF("%s parse error %s", c->addrstr, strerror(errno)); p = AppendStatus(p, 400, "Bad Request"); p = AppendContentTypeTextPlain(p); content = "Bad Request\r\n"; - c->close = true; + c->closeit = true; } p = AppendDate(p); p = AppendNosniff(p); p = AppendServer(p); - if (c->close) p = AppendConnectionClose(p); + if (c->closeit) p = AppendConnectionClose(p); if (contentlength == -1) contentlength = strlen(content); actualcontentlength = contentlength; if (gzipped) { @@ -1081,11 +1081,11 @@ bool HandleRequest(struct Client *c) { /* LogRequestLatency(); */ if (WriteSome(c->fd, c->iov, c->iovlen) == -1) { VERBOSEF("%s send error %s", c->addrstr, strerror(errno)); - c->close = true; + c->closeit = true; c->insize = 0; c->iovlen = 0; } - if (!c->close) { + if (!c->closeit) { memcpy(c->inbuf, c->inbuf + msgsize, c->insize - msgsize); c->insize -= msgsize; } @@ -1118,7 +1118,7 @@ static void ProcessInbuf(struct Client *c) { CHECK_NE(-1, epoll_ctl(epfd, EPOLL_CTL_MOD, c->fd, &(struct epoll_event){EPOLLOUT, {c}})); } else { - if (c->close && !c->insize) { + if (c->closeit && !c->insize) { DeleteClient(c); } else if (c->insize) { continue; @@ -1156,7 +1156,7 @@ static void ProcessRead(struct Client *c) { static void ProcessWrite(struct Client *c) { if (WriteSome(c->fd, c->iov, c->iovlen) != -1) { if (!GetIovSize(c->iov, c->iovlen)) { - if (!c->close) { + if (!c->closeit) { CHECK_NE(-1, epoll_ctl(epfd, EPOLL_CTL_MOD, c->fd, &(struct epoll_event){EPOLLIN, {c}})); ProcessInbuf(c); @@ -1181,7 +1181,7 @@ static void ProcessConnect(void) { c->next = clients; c->insize = 0; c->iovlen = 0; - c->close = false; + c->closeit = false; c->startconnection = nowl(); c->startrequest = c->startconnection; DescribeAddress(c->addrstr, &c->addr);