diff --git a/src/lib/libfs.js b/src/lib/libfs.js index 84ce21a35b25d..e446b5791d060 100644 --- a/src/lib/libfs.js +++ b/src/lib/libfs.js @@ -965,6 +965,9 @@ FS.staticInit(); var getattr = FS.checkOpExists(node.node_ops.getattr, {{{ cDefs.EPERM }}}); return getattr(node); }, + fstat(fd) { + return FS.stat(FS.getStreamChecked(fd).path); + }, lstat(path) { return FS.stat(path, true); }, diff --git a/src/lib/libnoderawfs.js b/src/lib/libnoderawfs.js index 89151b47c0a55..4b831b065a155 100644 --- a/src/lib/libnoderawfs.js +++ b/src/lib/libnoderawfs.js @@ -80,6 +80,10 @@ addToLibrary({ } return stat; }, + fstat(fd) { + var stream = FS.getStreamChecked(fd); + return fs.fstatSync(stream.nfd); + }, statfsStream(stream) { return fs.statfsSync(stream.path); }, diff --git a/src/lib/libsyscall.js b/src/lib/libsyscall.js index 41d2dfc4e1550..89782ff13b4a2 100644 --- a/src/lib/libsyscall.js +++ b/src/lib/libsyscall.js @@ -690,8 +690,7 @@ var SyscallsLibrary = { return SYSCALLS.writeStat(buf, FS.lstat(path)); }, __syscall_fstat64: (fd, buf) => { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.writeStat(buf, FS.stat(stream.path)); + return SYSCALLS.writeStat(buf, FS.fstat(fd)); }, __syscall_fchown32: (fd, owner, group) => { FS.fchown(fd, owner, group); diff --git a/test/fs/test_stat_unnamed_file_descriptor.c b/test/fs/test_stat_unnamed_file_descriptor.c new file mode 100644 index 0000000000000..a1d92f5cbaba7 --- /dev/null +++ b/test/fs/test_stat_unnamed_file_descriptor.c @@ -0,0 +1,20 @@ +#include +#include +#include +#include +#include "stdio.h" + +int main() { + int fd = open("file.txt", O_RDWR | O_CREAT, 0666); + unlink("file.txt"); + int res; + struct stat buf; + res = fstat(fd, &buf); + assert(res == 0); + assert(buf.st_atime > 1000000000); + res = fchmod(fd, 0777); + assert(res == 0); + res = ftruncate(fd, 10); + assert(res == 0); + printf("success\n"); +} diff --git a/test/other/codesize/test_codesize_cxx_ctors1.size b/test/other/codesize/test_codesize_cxx_ctors1.size index 59ec2c640a663..a3b5de60e54aa 100644 --- a/test/other/codesize/test_codesize_cxx_ctors1.size +++ b/test/other/codesize/test_codesize_cxx_ctors1.size @@ -1 +1 @@ -129211 +129218 diff --git a/test/other/codesize/test_codesize_cxx_ctors2.size b/test/other/codesize/test_codesize_cxx_ctors2.size index 37ec3b55a7a82..0ee50d8f96ee0 100644 --- a/test/other/codesize/test_codesize_cxx_ctors2.size +++ b/test/other/codesize/test_codesize_cxx_ctors2.size @@ -1 +1 @@ -128623 +128630 diff --git a/test/other/codesize/test_codesize_cxx_except.size b/test/other/codesize/test_codesize_cxx_except.size index 5dab383a3c420..1bae0e2d633b9 100644 --- a/test/other/codesize/test_codesize_cxx_except.size +++ b/test/other/codesize/test_codesize_cxx_except.size @@ -1 +1 @@ -170879 +170886 diff --git a/test/other/codesize/test_codesize_cxx_except_wasm.size b/test/other/codesize/test_codesize_cxx_except_wasm.size index c7d57a3be3df7..b122612579300 100644 --- a/test/other/codesize/test_codesize_cxx_except_wasm.size +++ b/test/other/codesize/test_codesize_cxx_except_wasm.size @@ -1 +1 @@ -144708 +144715 diff --git a/test/other/codesize/test_codesize_cxx_except_wasm_legacy.size b/test/other/codesize/test_codesize_cxx_except_wasm_legacy.size index 28cf96ad77953..cdbcd17b502d1 100644 --- a/test/other/codesize/test_codesize_cxx_except_wasm_legacy.size +++ b/test/other/codesize/test_codesize_cxx_except_wasm_legacy.size @@ -1 +1 @@ -142162 +142169 diff --git a/test/other/codesize/test_codesize_cxx_mangle.size b/test/other/codesize/test_codesize_cxx_mangle.size index 004d7d333c79a..8e8b38b5c13b0 100644 --- a/test/other/codesize/test_codesize_cxx_mangle.size +++ b/test/other/codesize/test_codesize_cxx_mangle.size @@ -1 +1 @@ -232724 +232731 diff --git a/test/other/codesize/test_codesize_cxx_noexcept.size b/test/other/codesize/test_codesize_cxx_noexcept.size index c0e3f17ce269c..232be2fc5f578 100644 --- a/test/other/codesize/test_codesize_cxx_noexcept.size +++ b/test/other/codesize/test_codesize_cxx_noexcept.size @@ -1 +1 @@ -131774 +131781 diff --git a/test/other/codesize/test_codesize_cxx_wasmfs.size b/test/other/codesize/test_codesize_cxx_wasmfs.size index 3b73c05a4a345..b592a30c75210 100644 --- a/test/other/codesize/test_codesize_cxx_wasmfs.size +++ b/test/other/codesize/test_codesize_cxx_wasmfs.size @@ -1 +1 @@ -169181 +169188 diff --git a/test/other/codesize/test_codesize_hello_O0.size b/test/other/codesize/test_codesize_hello_O0.size index aa9255e00128e..96b0a1d19abf4 100644 --- a/test/other/codesize/test_codesize_hello_O0.size +++ b/test/other/codesize/test_codesize_hello_O0.size @@ -1 +1 @@ -15101 +15113 diff --git a/test/other/codesize/test_codesize_minimal_pthreads.size b/test/other/codesize/test_codesize_minimal_pthreads.size index 5f7ea76a0569f..0f60aa5d0b843 100644 --- a/test/other/codesize/test_codesize_minimal_pthreads.size +++ b/test/other/codesize/test_codesize_minimal_pthreads.size @@ -1 +1 @@ -19394 +19405 diff --git a/test/other/test_unoptimized_code_size.wasm.size b/test/other/test_unoptimized_code_size.wasm.size index aa9255e00128e..96b0a1d19abf4 100644 --- a/test/other/test_unoptimized_code_size.wasm.size +++ b/test/other/test_unoptimized_code_size.wasm.size @@ -1 +1 @@ -15101 +15113 diff --git a/test/other/test_unoptimized_code_size_no_asserts.wasm.size b/test/other/test_unoptimized_code_size_no_asserts.wasm.size index e15b709b7d237..59029a8227a5f 100644 --- a/test/other/test_unoptimized_code_size_no_asserts.wasm.size +++ b/test/other/test_unoptimized_code_size_no_asserts.wasm.size @@ -1 +1 @@ -12182 +12194 diff --git a/test/other/test_unoptimized_code_size_strict.wasm.size b/test/other/test_unoptimized_code_size_strict.wasm.size index aa9255e00128e..96b0a1d19abf4 100644 --- a/test/other/test_unoptimized_code_size_strict.wasm.size +++ b/test/other/test_unoptimized_code_size_strict.wasm.size @@ -1 +1 @@ -15101 +15113 diff --git a/test/test_core.py b/test/test_core.py index e1f42c0dd7f39..ad64bda589ce2 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -5842,6 +5842,15 @@ def test_fs_64bit(self): self.set_setting('FORCE_FILESYSTEM') self.do_runf('fs/test_64bit.c', 'success') + @crossplatform + @with_all_fs + def test_fs_stat_unnamed_file_descriptor(self): + noderawfs = '-DNODERAWFS' in self.emcc_args + wasmfs = self.get_setting('WASMFS') + if not (noderawfs or wasmfs): + self.skipTest('TODO: doesnt work in memfs or nodefs') + self.do_runf('fs/test_stat_unnamed_file_descriptor.c', 'success') + @requires_node @crossplatform @with_all_fs