diff --git a/internal/lib/syscall/env_unix.go b/internal/lib/syscall/env_unix.go index a195fcee..c06af284 100644 --- a/internal/lib/syscall/env_unix.go +++ b/internal/lib/syscall/env_unix.go @@ -14,6 +14,7 @@ import ( "github.com/goplus/llgo/c" "github.com/goplus/llgo/c/os" + "github.com/goplus/llgo/c/syscall" ) var ( @@ -116,18 +117,18 @@ func Getenv(key string) (value string, found bool) { func Setenv(key, value string) error { envOnce.Do(copyenv) if len(key) == 0 { - return EINVAL + return Errno(syscall.EINVAL) } for i := 0; i < len(key); i++ { if key[i] == '=' || key[i] == 0 { - return EINVAL + return Errno(syscall.EINVAL) } } // On Plan 9, null is used as a separator, eg in $path. if runtime.GOOS != "plan9" { for i := 0; i < len(value); i++ { if value[i] == 0 { - return EINVAL + return Errno(syscall.EINVAL) } } } diff --git a/internal/lib/syscall/forkpipe.go b/internal/lib/syscall/forkpipe.go new file mode 100644 index 00000000..d92ea9a3 --- /dev/null +++ b/internal/lib/syscall/forkpipe.go @@ -0,0 +1,39 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build aix || darwin + +package syscall + +import ( + "github.com/goplus/llgo/c" + "github.com/goplus/llgo/c/os" + "github.com/goplus/llgo/c/syscall" +) + +// forkExecPipe opens a pipe and non-atomically sets O_CLOEXEC on both file +// descriptors. +func forkExecPipe(p []int) error { + err := Pipe(p) + if err != nil { + return err + } + ret := os.Fcntl(c.Int(p[0]), syscall.F_SETFD, syscall.FD_CLOEXEC) + if ret != 0 { + return Errno(ret) + } + ret = os.Fcntl(c.Int(p[1]), syscall.F_SETFD, syscall.FD_CLOEXEC) + if ret != 0 { + return Errno(ret) + } + return nil +} + +func acquireForkLock() { + ForkLock.Lock() +} + +func releaseForkLock() { + ForkLock.Unlock() +} diff --git a/internal/lib/syscall/syscall.go b/internal/lib/syscall/syscall.go index 03138bbe..4877478c 100644 --- a/internal/lib/syscall/syscall.go +++ b/internal/lib/syscall/syscall.go @@ -137,7 +137,7 @@ func Stat(path string, stat *Stat_t) (err error) { func Pipe(p []int) (err error) { if len(p) != 2 { - return EINVAL + return Errno(syscall.EINVAL) } var q [2]c.Int ret := os.Pipe(&q) diff --git a/internal/lib/syscall/syscall_bsd.go b/internal/lib/syscall/syscall_bsd.go index 95bf5757..95eafe19 100644 --- a/internal/lib/syscall/syscall_bsd.go +++ b/internal/lib/syscall/syscall_bsd.go @@ -12,6 +12,10 @@ package syscall +import ( + "github.com/goplus/llgo/c/syscall" +) + func Getgroups() (gids []int, err error) { /* TODO(xsw): n, err := getgroups(0, nil) @@ -106,9 +110,13 @@ func (w WaitStatus) Signal() Signal { func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } -func (w WaitStatus) Stopped() bool { return w&mask == stopped && Signal(w>>shift) != SIGSTOP } +func (w WaitStatus) Stopped() bool { + return w&mask == stopped && Signal(w>>shift) != Signal(syscall.SIGSTOP) +} -func (w WaitStatus) Continued() bool { return w&mask == stopped && Signal(w>>shift) == SIGSTOP } +func (w WaitStatus) Continued() bool { + return w&mask == stopped && Signal(w>>shift) == Signal(syscall.SIGSTOP) +} func (w WaitStatus) StopSignal() Signal { if !w.Stopped() { diff --git a/internal/lib/syscall/syscall_unix.go b/internal/lib/syscall/syscall_unix.go index 73755270..a43ffb27 100644 --- a/internal/lib/syscall/syscall_unix.go +++ b/internal/lib/syscall/syscall_unix.go @@ -10,6 +10,7 @@ import ( "unsafe" "github.com/goplus/llgo/c" + "github.com/goplus/llgo/c/syscall" "github.com/goplus/llgo/internal/lib/internal/oserror" ) @@ -29,11 +30,11 @@ func (e Errno) Error() string { func (e Errno) Is(target error) bool { switch target { case oserror.ErrPermission: - return e == EACCES || e == EPERM + return e == Errno(syscall.EACCES) || e == Errno(syscall.EPERM) case oserror.ErrExist: - return e == EEXIST || e == ENOTEMPTY + return e == Errno(syscall.EEXIST) || e == Errno(syscall.ENOTEMPTY) case oserror.ErrNotExist: - return e == ENOENT + return e == Errno(syscall.ENOENT) // TODO(xsw): go1.21 // case errors.ErrUnsupported: // return e == ENOSYS || e == ENOTSUP || e == EOPNOTSUPP @@ -42,11 +43,12 @@ func (e Errno) Is(target error) bool { } func (e Errno) Temporary() bool { - return e == EINTR || e == EMFILE || e == ENFILE || e.Timeout() + return e == Errno(syscall.EINTR) || e == Errno(syscall.EMFILE) || + e == Errno(syscall.ENFILE) || e.Timeout() } func (e Errno) Timeout() bool { - return e == EAGAIN || e == EWOULDBLOCK || e == ETIMEDOUT + return e == Errno(syscall.EAGAIN) || e == Errno(syscall.EWOULDBLOCK) || e == Errno(syscall.ETIMEDOUT) } // A Signal is a number describing a process signal. diff --git a/internal/lib/syscall/zerrors_darwin.go b/internal/lib/syscall/zerrors_darwin.go deleted file mode 100644 index d86ca941..00000000 --- a/internal/lib/syscall/zerrors_darwin.go +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package syscall - -// Errors -const ( - E2BIG = Errno(0x7) - EACCES = Errno(0xd) - EADDRINUSE = Errno(0x30) - EADDRNOTAVAIL = Errno(0x31) - EAFNOSUPPORT = Errno(0x2f) - EAGAIN = Errno(0x23) - EALREADY = Errno(0x25) - EAUTH = Errno(0x50) - EBADARCH = Errno(0x56) - EBADEXEC = Errno(0x55) - EBADF = Errno(0x9) - EBADMACHO = Errno(0x58) - EBADMSG = Errno(0x5e) - EBADRPC = Errno(0x48) - EBUSY = Errno(0x10) - ECANCELED = Errno(0x59) - ECHILD = Errno(0xa) - ECONNABORTED = Errno(0x35) - ECONNREFUSED = Errno(0x3d) - ECONNRESET = Errno(0x36) - EDEADLK = Errno(0xb) - EDESTADDRREQ = Errno(0x27) - EDEVERR = Errno(0x53) - EDOM = Errno(0x21) - EDQUOT = Errno(0x45) - EEXIST = Errno(0x11) - EFAULT = Errno(0xe) - EFBIG = Errno(0x1b) - EFTYPE = Errno(0x4f) - EHOSTDOWN = Errno(0x40) - EHOSTUNREACH = Errno(0x41) - EIDRM = Errno(0x5a) - EILSEQ = Errno(0x5c) - EINPROGRESS = Errno(0x24) - EINTR = Errno(0x4) - EINVAL = Errno(0x16) - EIO = Errno(0x5) - EISCONN = Errno(0x38) - EISDIR = Errno(0x15) - ELAST = Errno(0x6a) - ELOOP = Errno(0x3e) - EMFILE = Errno(0x18) - EMLINK = Errno(0x1f) - EMSGSIZE = Errno(0x28) - EMULTIHOP = Errno(0x5f) - ENAMETOOLONG = Errno(0x3f) - ENEEDAUTH = Errno(0x51) - ENETDOWN = Errno(0x32) - ENETRESET = Errno(0x34) - ENETUNREACH = Errno(0x33) - ENFILE = Errno(0x17) - ENOATTR = Errno(0x5d) - ENOBUFS = Errno(0x37) - ENODATA = Errno(0x60) - ENODEV = Errno(0x13) - ENOENT = Errno(0x2) - ENOEXEC = Errno(0x8) - ENOLCK = Errno(0x4d) - ENOLINK = Errno(0x61) - ENOMEM = Errno(0xc) - ENOMSG = Errno(0x5b) - ENOPOLICY = Errno(0x67) - ENOPROTOOPT = Errno(0x2a) - ENOSPC = Errno(0x1c) - ENOSR = Errno(0x62) - ENOSTR = Errno(0x63) - ENOSYS = Errno(0x4e) - ENOTBLK = Errno(0xf) - ENOTCONN = Errno(0x39) - ENOTDIR = Errno(0x14) - ENOTEMPTY = Errno(0x42) - ENOTRECOVERABLE = Errno(0x68) - ENOTSOCK = Errno(0x26) - ENOTSUP = Errno(0x2d) - ENOTTY = Errno(0x19) - ENXIO = Errno(0x6) - EOPNOTSUPP = Errno(0x66) - EOVERFLOW = Errno(0x54) - EOWNERDEAD = Errno(0x69) - EPERM = Errno(0x1) - EPFNOSUPPORT = Errno(0x2e) - EPIPE = Errno(0x20) - EPROCLIM = Errno(0x43) - EPROCUNAVAIL = Errno(0x4c) - EPROGMISMATCH = Errno(0x4b) - EPROGUNAVAIL = Errno(0x4a) - EPROTO = Errno(0x64) - EPROTONOSUPPORT = Errno(0x2b) - EPROTOTYPE = Errno(0x29) - EPWROFF = Errno(0x52) - EQFULL = Errno(0x6a) - ERANGE = Errno(0x22) - EREMOTE = Errno(0x47) - EROFS = Errno(0x1e) - ERPCMISMATCH = Errno(0x49) - ESHLIBVERS = Errno(0x57) - ESHUTDOWN = Errno(0x3a) - ESOCKTNOSUPPORT = Errno(0x2c) - ESPIPE = Errno(0x1d) - ESRCH = Errno(0x3) - ESTALE = Errno(0x46) - ETIME = Errno(0x65) - ETIMEDOUT = Errno(0x3c) - ETOOMANYREFS = Errno(0x3b) - ETXTBSY = Errno(0x1a) - EUSERS = Errno(0x44) - EWOULDBLOCK = Errno(0x23) - EXDEV = Errno(0x12) -) - -// Signals -const ( - SIGABRT = Signal(0x6) - SIGALRM = Signal(0xe) - SIGBUS = Signal(0xa) - SIGCHLD = Signal(0x14) - SIGCONT = Signal(0x13) - SIGEMT = Signal(0x7) - SIGFPE = Signal(0x8) - SIGHUP = Signal(0x1) - SIGILL = Signal(0x4) - SIGINFO = Signal(0x1d) - SIGINT = Signal(0x2) - SIGIO = Signal(0x17) - SIGIOT = Signal(0x6) - SIGKILL = Signal(0x9) - SIGPIPE = Signal(0xd) - SIGPROF = Signal(0x1b) - SIGQUIT = Signal(0x3) - SIGSEGV = Signal(0xb) - SIGSTOP = Signal(0x11) - SIGSYS = Signal(0xc) - SIGTERM = Signal(0xf) - SIGTRAP = Signal(0x5) - SIGTSTP = Signal(0x12) - SIGTTIN = Signal(0x15) - SIGTTOU = Signal(0x16) - SIGURG = Signal(0x10) - SIGUSR1 = Signal(0x1e) - SIGUSR2 = Signal(0x1f) - SIGVTALRM = Signal(0x1a) - SIGWINCH = Signal(0x1c) - SIGXCPU = Signal(0x18) - SIGXFSZ = Signal(0x19) -) diff --git a/internal/lib/syscall/zerrors_linux.go b/internal/lib/syscall/zerrors_linux.go deleted file mode 100644 index 79ae5d45..00000000 --- a/internal/lib/syscall/zerrors_linux.go +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package syscall - -// Errors -const ( - E2BIG = Errno(0x7) - EACCES = Errno(0xd) - EADDRINUSE = Errno(0x62) - EADDRNOTAVAIL = Errno(0x63) - EADV = Errno(0x44) - EAFNOSUPPORT = Errno(0x61) - EAGAIN = Errno(0xb) - EALREADY = Errno(0x72) - EBADE = Errno(0x34) - EBADF = Errno(0x9) - EBADFD = Errno(0x4d) - EBADMSG = Errno(0x4a) - EBADR = Errno(0x35) - EBADRQC = Errno(0x38) - EBADSLT = Errno(0x39) - EBFONT = Errno(0x3b) - EBUSY = Errno(0x10) - ECANCELED = Errno(0x7d) - ECHILD = Errno(0xa) - ECHRNG = Errno(0x2c) - ECOMM = Errno(0x46) - ECONNABORTED = Errno(0x67) - ECONNREFUSED = Errno(0x6f) - ECONNRESET = Errno(0x68) - EDEADLK = Errno(0x23) - EDEADLOCK = Errno(0x23) - EDESTADDRREQ = Errno(0x59) - EDOM = Errno(0x21) - EDOTDOT = Errno(0x49) - EDQUOT = Errno(0x7a) - EEXIST = Errno(0x11) - EFAULT = Errno(0xe) - EFBIG = Errno(0x1b) - EHOSTDOWN = Errno(0x70) - EHOSTUNREACH = Errno(0x71) - EIDRM = Errno(0x2b) - EILSEQ = Errno(0x54) - EINPROGRESS = Errno(0x73) - EINTR = Errno(0x4) - EINVAL = Errno(0x16) - EIO = Errno(0x5) - EISCONN = Errno(0x6a) - EISDIR = Errno(0x15) - EISNAM = Errno(0x78) - EKEYEXPIRED = Errno(0x7f) - EKEYREJECTED = Errno(0x81) - EKEYREVOKED = Errno(0x80) - EL2HLT = Errno(0x33) - EL2NSYNC = Errno(0x2d) - EL3HLT = Errno(0x2e) - EL3RST = Errno(0x2f) - ELIBACC = Errno(0x4f) - ELIBBAD = Errno(0x50) - ELIBEXEC = Errno(0x53) - ELIBMAX = Errno(0x52) - ELIBSCN = Errno(0x51) - ELNRNG = Errno(0x30) - ELOOP = Errno(0x28) - EMEDIUMTYPE = Errno(0x7c) - EMFILE = Errno(0x18) - EMLINK = Errno(0x1f) - EMSGSIZE = Errno(0x5a) - EMULTIHOP = Errno(0x48) - ENAMETOOLONG = Errno(0x24) - ENAVAIL = Errno(0x77) - ENETDOWN = Errno(0x64) - ENETRESET = Errno(0x66) - ENETUNREACH = Errno(0x65) - ENFILE = Errno(0x17) - ENOANO = Errno(0x37) - ENOBUFS = Errno(0x69) - ENOCSI = Errno(0x32) - ENODATA = Errno(0x3d) - ENODEV = Errno(0x13) - ENOENT = Errno(0x2) - ENOEXEC = Errno(0x8) - ENOKEY = Errno(0x7e) - ENOLCK = Errno(0x25) - ENOLINK = Errno(0x43) - ENOMEDIUM = Errno(0x7b) - ENOMEM = Errno(0xc) - ENOMSG = Errno(0x2a) - ENONET = Errno(0x40) - ENOPKG = Errno(0x41) - ENOPROTOOPT = Errno(0x5c) - ENOSPC = Errno(0x1c) - ENOSR = Errno(0x3f) - ENOSTR = Errno(0x3c) - ENOSYS = Errno(0x26) - ENOTBLK = Errno(0xf) - ENOTCONN = Errno(0x6b) - ENOTDIR = Errno(0x14) - ENOTEMPTY = Errno(0x27) - ENOTNAM = Errno(0x76) - ENOTRECOVERABLE = Errno(0x83) - ENOTSOCK = Errno(0x58) - ENOTSUP = Errno(0x5f) - ENOTTY = Errno(0x19) - ENOTUNIQ = Errno(0x4c) - ENXIO = Errno(0x6) - EOPNOTSUPP = Errno(0x5f) - EOVERFLOW = Errno(0x4b) - EOWNERDEAD = Errno(0x82) - EPERM = Errno(0x1) - EPFNOSUPPORT = Errno(0x60) - EPIPE = Errno(0x20) - EPROTO = Errno(0x47) - EPROTONOSUPPORT = Errno(0x5d) - EPROTOTYPE = Errno(0x5b) - ERANGE = Errno(0x22) - EREMCHG = Errno(0x4e) - EREMOTE = Errno(0x42) - EREMOTEIO = Errno(0x79) - ERESTART = Errno(0x55) - ERFKILL = Errno(0x84) - EROFS = Errno(0x1e) - ESHUTDOWN = Errno(0x6c) - ESOCKTNOSUPPORT = Errno(0x5e) - ESPIPE = Errno(0x1d) - ESRCH = Errno(0x3) - ESRMNT = Errno(0x45) - ESTALE = Errno(0x74) - ESTRPIPE = Errno(0x56) - ETIME = Errno(0x3e) - ETIMEDOUT = Errno(0x6e) - ETOOMANYREFS = Errno(0x6d) - ETXTBSY = Errno(0x1a) - EUCLEAN = Errno(0x75) - EUNATCH = Errno(0x31) - EUSERS = Errno(0x57) - EWOULDBLOCK = Errno(0xb) - EXDEV = Errno(0x12) - EXFULL = Errno(0x36) -) - -// Signals -const ( - SIGABRT = Signal(0x6) - SIGALRM = Signal(0xe) - SIGBUS = Signal(0x7) - SIGCHLD = Signal(0x11) - SIGCLD = Signal(0x11) - SIGCONT = Signal(0x12) - SIGFPE = Signal(0x8) - SIGHUP = Signal(0x1) - SIGILL = Signal(0x4) - SIGINT = Signal(0x2) - SIGIO = Signal(0x1d) - SIGIOT = Signal(0x6) - SIGKILL = Signal(0x9) - SIGPIPE = Signal(0xd) - SIGPOLL = Signal(0x1d) - SIGPROF = Signal(0x1b) - SIGPWR = Signal(0x1e) - SIGQUIT = Signal(0x3) - SIGSEGV = Signal(0xb) - SIGSTKFLT = Signal(0x10) - SIGSTOP = Signal(0x13) - SIGSYS = Signal(0x1f) - SIGTERM = Signal(0xf) - SIGTRAP = Signal(0x5) - SIGTSTP = Signal(0x14) - SIGTTIN = Signal(0x15) - SIGTTOU = Signal(0x16) - SIGUNUSED = Signal(0x1f) - SIGURG = Signal(0x17) - SIGUSR1 = Signal(0xa) - SIGUSR2 = Signal(0xc) - SIGVTALRM = Signal(0x1a) - SIGWINCH = Signal(0x1c) - SIGXCPU = Signal(0x18) - SIGXFSZ = Signal(0x19) -)