diff --git a/src/lib/libsigs.js b/src/lib/libsigs.js index 49358dbb2a6e2..bb990b3f9c142 100644 --- a/src/lib/libsigs.js +++ b/src/lib/libsigs.js @@ -261,7 +261,7 @@ sigs = { __syscall_mknodat__sig: 'iipii', __syscall_newfstatat__sig: 'iippi', __syscall_openat__sig: 'iipip', - __syscall_pipe__sig: 'ip', + __syscall_pipe2__sig: 'ipi', __syscall_poll__sig: 'ipii', __syscall_readlinkat__sig: 'iippp', __syscall_recvfrom__sig: 'iippipp', diff --git a/src/lib/libsyscall.js b/src/lib/libsyscall.js index d7cf372e7e3ef..1e1976cf41875 100644 --- a/src/lib/libsyscall.js +++ b/src/lib/libsyscall.js @@ -194,11 +194,14 @@ var SyscallsLibrary = { var old = SYSCALLS.getStreamFromFD(fd); return FS.dupStream(old).fd; }, - __syscall_pipe__deps: ['$PIPEFS'], - __syscall_pipe: (fdPtr) => { + __syscall_pipe2__deps: ['$PIPEFS'], + __syscall_pipe2: (fdPtr, flags) => { if (fdPtr == 0) { throw new FS.ErrnoError({{{ cDefs.EFAULT }}}); } + if (flags && flags != {{{ cDefs.O_CLOEXEC }}}) { + throw new FS.ErrnoError({{{ cDefs.ENOTSUP }}}); + } var res = PIPEFS.createPipe(); diff --git a/src/struct_info.json b/src/struct_info.json index 32408d2b4ae7e..e08fd14e3283e 100644 --- a/src/struct_info.json +++ b/src/struct_info.json @@ -102,6 +102,7 @@ "F_SETLKW", "F_GETLK", "S_ISVTX", + "O_CLOEXEC", "O_RDONLY", "O_ACCMODE", "F_DUPFD", diff --git a/system/lib/libc/emscripten_syscall_stubs.c b/system/lib/libc/emscripten_syscall_stubs.c index ff0e70b86d1b7..1240f7d5e3541 100644 --- a/system/lib/libc/emscripten_syscall_stubs.c +++ b/system/lib/libc/emscripten_syscall_stubs.c @@ -262,7 +262,6 @@ weak int __syscall_setsockopt(int sockfd, int level, int optname, intptr_t optva UNIMPLEMENTED(acct, (intptr_t filename)) UNIMPLEMENTED(mincore, (intptr_t addr, size_t length, intptr_t vec)) -UNIMPLEMENTED(pipe2, (intptr_t fds, int flags)) UNIMPLEMENTED(pselect6, (int nfds, intptr_t readfds, intptr_t writefds, intptr_t exceptfds, intptr_t timeout, intptr_t sigmaks)) UNIMPLEMENTED(ppoll, (intptr_t fds, int nfds, intptr_t timeout, intptr_t sigmask, int size)) UNIMPLEMENTED(recvmmsg, (int sockfd, intptr_t msgvec, size_t vlen, int flags, ...)) diff --git a/system/lib/libc/musl/arch/emscripten/bits/syscall.h b/system/lib/libc/musl/arch/emscripten/bits/syscall.h index e4194e9aa0804..db679242a8028 100644 --- a/system/lib/libc/musl/arch/emscripten/bits/syscall.h +++ b/system/lib/libc/musl/arch/emscripten/bits/syscall.h @@ -5,7 +5,6 @@ #define SYS_sync __syscall_sync #define SYS_rmdir __syscall_rmdir #define SYS_dup __syscall_dup -#define SYS_pipe __syscall_pipe #define SYS_acct __syscall_acct #define SYS_ioctl __syscall_ioctl #define SYS_setpgid __syscall_setpgid diff --git a/system/lib/libc/musl/arch/emscripten/syscall_arch.h b/system/lib/libc/musl/arch/emscripten/syscall_arch.h index 64e6cea850d81..0a2e506b23659 100644 --- a/system/lib/libc/musl/arch/emscripten/syscall_arch.h +++ b/system/lib/libc/musl/arch/emscripten/syscall_arch.h @@ -21,7 +21,6 @@ int __syscall_access(intptr_t path, int amode); int __syscall_sync(void); int __syscall_rmdir(intptr_t path); int __syscall_dup(int fd); -int __syscall_pipe(intptr_t fd); int __syscall_acct(intptr_t filename); int __syscall_ioctl(int fd, int request, ...); int __syscall_setpgid(int pid, int gpid); diff --git a/system/lib/wasmfs/syscalls.cpp b/system/lib/wasmfs/syscalls.cpp index 9e5ea3ca6ef42..53edc1fa95a8e 100644 --- a/system/lib/wasmfs/syscalls.cpp +++ b/system/lib/wasmfs/syscalls.cpp @@ -1331,8 +1331,11 @@ int __syscall_ioctl(int fd, int request, ...) { } } -int __syscall_pipe(intptr_t fd) { +int __syscall_pipe2(intptr_t fd, int flags) { auto* fds = (__wasi_fd_t*)fd; + if (flags && flags != O_CLOEXEC) { + return -ENOTSUP; + } // Make a pipe: Two PipeFiles that share a single data source between them, so // that writing to one can be read in the other. diff --git a/test/codesize/test_codesize_hello_dylink_all.json b/test/codesize/test_codesize_hello_dylink_all.json index 3b9bbdbbea24c..861acd79a8904 100644 --- a/test/codesize/test_codesize_hello_dylink_all.json +++ b/test/codesize/test_codesize_hello_dylink_all.json @@ -1,7 +1,7 @@ { - "a.out.js": 244330, - "a.out.nodebug.wasm": 577696, - "total": 822026, + "a.out.js": 244367, + "a.out.nodebug.wasm": 577720, + "total": 822087, "sent": [ "IMG_Init", "IMG_Load", @@ -247,7 +247,7 @@ "__syscall_mknodat", "__syscall_newfstatat", "__syscall_openat", - "__syscall_pipe", + "__syscall_pipe2", "__syscall_poll", "__syscall_readlinkat", "__syscall_recvfrom", @@ -1436,7 +1436,7 @@ "env.__syscall_mknodat", "env.__syscall_newfstatat", "env.__syscall_openat", - "env.__syscall_pipe", + "env.__syscall_pipe2", "env.__syscall_poll", "env.__syscall_readlinkat", "env.__syscall_recvfrom", @@ -1889,7 +1889,6 @@ "__syscall_munlockall", "__syscall_munmap", "__syscall_pause", - "__syscall_pipe2", "__syscall_ppoll", "__syscall_prlimit64", "__syscall_pselect6", @@ -3752,7 +3751,6 @@ "$__syscall_msync", "$__syscall_munmap", "$__syscall_pause", - "$__syscall_pipe2", "$__syscall_ppoll", "$__syscall_prlimit64", "$__syscall_pselect6", diff --git a/test/unistd/misc.c b/test/unistd/misc.c index 76c35c1776a84..3efcbad477a63 100644 --- a/test/unistd/misc.c +++ b/test/unistd/misc.c @@ -80,6 +80,13 @@ int main() { printf(", errno: %d\n", errno); errno = 0; + printf("pipe2(good): %d", pipe2(pipe_arg, 0)); + printf(", errno: %d\n", errno); + errno = 0; + printf("pipe2(bad): %d", pipe2(0, 0)); + printf(", errno: %d\n", errno); + errno = 0; + char* exec_argv[] = {"arg", 0}; char* exec_env[] = {"a=b", 0}; printf("execl: %d", execl("working/program", "arg", 0)); diff --git a/test/unistd/misc.out b/test/unistd/misc.out index 2d415490dbcb7..17e5b17ffa0e5 100644 --- a/test/unistd/misc.out +++ b/test/unistd/misc.out @@ -13,6 +13,8 @@ nice: -1, errno: 63 pause: -1, errno: 27 pipe(good): 0, errno: 0 pipe(bad): -1, errno: 21 +pipe2(good): 0, errno: 0 +pipe2(bad): -1, errno: 21 execl: -1, errno: 45 execle: -1, errno: 45 execlp: -1, errno: 45