From e0d56a1fd67be768e38b40942a0e2472779b01a2 Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Fri, 2 Jun 2023 12:39:29 -0400 Subject: [PATCH 01/20] implement truncate and ftruncate with tests --- emcc.py | 2 + src/library_wasmfs.js | 9 ++++ system/lib/wasmfs/js_api.cpp | 16 +++++++ test/fs/test_fs_js_api.c | 83 ++++++++++++++++++++++++++++++++++++ test/test_core.py | 1 + 5 files changed, 111 insertions(+) diff --git a/emcc.py b/emcc.py index b96183df5df10..e638b3f6f5e65 100755 --- a/emcc.py +++ b/emcc.py @@ -2319,6 +2319,8 @@ def phase_linker_setup(options, state, newargs): '_wasmfs_open', '_wasmfs_close', '_wasmfs_mkdir', + '_wasmfs_truncate', + '_wasmfs_ftruncate', '_wasmfs_unlink', '_wasmfs_chdir', '_wasmfs_rmdir', diff --git a/src/library_wasmfs.js b/src/library_wasmfs.js index 30b4ef98f8558..36445d8773d93 100644 --- a/src/library_wasmfs.js +++ b/src/library_wasmfs.js @@ -199,7 +199,16 @@ FS.createPreloadedFile = FS_createPreloadedFile; // TODO: lchown // TODO: fchown // TODO: truncate + truncate: (path, len) => { + return FS.handleError(withStackSave(() => { + var pathBuffer = stringToUTF8OnStack(path); + return __wasmfs_truncate(pathBuffer, len); + })); + }, // TODO: ftruncate + ftruncate: (fd, len) => { + return FS.handleError(__wasmfs_ftruncate(fd, len)); + }, // TODO: utime findObject: (path) => { var result = __wasmfs_identify(path); diff --git a/system/lib/wasmfs/js_api.cpp b/system/lib/wasmfs/js_api.cpp index b6fb0ce0f05fe..ee15e58757ef8 100644 --- a/system/lib/wasmfs/js_api.cpp +++ b/system/lib/wasmfs/js_api.cpp @@ -127,6 +127,22 @@ int _wasmfs_unlink(char* path) { return __syscall_unlinkat(AT_FDCWD, (intptr_t)path, 0); } +int _wasmfs_truncate(char *path, off_t size) { + int err = __syscall_truncate64((intptr_t)path, size); + if (err == -1) { + return errno; + } + return err; +} + +int _wasmfs_ftruncate(int fd, off_t size) { + int err = __syscall_ftruncate64(fd, size); + if (err == -1) { + return errno; + } + return err; +} + int _wasmfs_chdir(char* path) { return __syscall_chdir((intptr_t)path); } int _wasmfs_symlink(char* old_path, char* new_path) { diff --git a/test/fs/test_fs_js_api.c b/test/fs/test_fs_js_api.c index 5627a73d2a5a3..c0ff11476d971 100644 --- a/test/fs/test_fs_js_api.c +++ b/test/fs/test_fs_js_api.c @@ -1,5 +1,7 @@ #include #include +#include +#include int main() { /********** test FS.open() **********/ @@ -37,6 +39,85 @@ int main() { #endif ); + /********** test FS.truncate() **********/ + EM_ASM( + FS.writeFile('truncatetest', 'a=1\nb=2\n'); + ); + + struct stat s; + stat("truncatetest", &s); + assert(s.st_size == 8); + + EM_ASM( + FS.truncate('truncatetest', 2); + ); + stat("truncatetest", &s); + assert(s.st_size == 2); + + EM_ASM( + FS.truncate('truncatetest', 10); + ); + stat("truncatetest", &s); + assert(s.st_size == 10); + + EM_ASM( + var truncateStream = FS.open('truncatetest', 'w'); +#if WASMFS + FS.ftruncate(truncateStream, 4); +#else + FS.ftruncate(truncateStream.fd, 4); +#endif + ); + stat("truncatetest", &s); + assert(s.st_size == 4); + + // EM_ASM( + // var ex; + // try { + // FS.truncate('truncatetest', -10); + // } catch(err) { + // ex = err; + // } + // console.log(ex); + + // // assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); + // ); + +// EM_ASM( +// var ex; +// try { +// var truncateStream = FS.open('truncatetest', 'w'); +// #if WASMFS +// FS.ftruncate(truncateStream, -10); +// #else +// FS.ftruncate(truncateStream.fd, -10); +// #endif +// } catch(err) { +// ex = err; +// } + +// assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); +// ); + + EM_ASM( + var ex; + try { + FS.truncate('nonexistent', 10); + } catch(err) { + ex = err; + } + assert(ex.name === "ErrnoError" && ex.errno === 44 /* ENOENT */); + + var ex; + try { + FS.ftruncate(99, 10); + } catch(err) { + ex = err; + } + + assert(ex.name === "ErrnoError" && ex.errno === 8 /* EBADF */); + ); + /********** test FS.close() **********/ EM_ASM( FS.writeFile("closetestfile", 'a=1\nb=2\n'); @@ -59,5 +140,7 @@ int main() { assert(ex.name === "ErrnoError" && ex.errno === 8 /* EBADF */) ); + remove("truncatetest"); + puts("success"); } diff --git a/test/test_core.py b/test/test_core.py index 6bf57e5b470a8..4c07cda6b5a08 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -6013,6 +6013,7 @@ def test_fs_writeFile(self): def test_fs_js_api(self): self.set_setting("FORCE_FILESYSTEM") + self.emcc_args += ['--profiling'] self.do_runf(test_file('fs/test_fs_js_api.c'), 'success') def test_fs_write(self): From f305495c749164913a9dd9df7fcc6025a52a85b8 Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Fri, 2 Jun 2023 13:54:14 -0400 Subject: [PATCH 02/20] handle negative size --- src/library_wasmfs.js | 6 ++++ system/lib/wasmfs/js_api.cpp | 4 +-- test/fs/test_fs_js_api.c | 53 ++++++++++++++++++------------------ 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/src/library_wasmfs.js b/src/library_wasmfs.js index 36445d8773d93..29de62e3fe952 100644 --- a/src/library_wasmfs.js +++ b/src/library_wasmfs.js @@ -200,6 +200,9 @@ FS.createPreloadedFile = FS_createPreloadedFile; // TODO: fchown // TODO: truncate truncate: (path, len) => { + if (len < 0) { + throw new FS.ErrnoError({{{ cDefs.EINVAL }}}); + } return FS.handleError(withStackSave(() => { var pathBuffer = stringToUTF8OnStack(path); return __wasmfs_truncate(pathBuffer, len); @@ -207,6 +210,9 @@ FS.createPreloadedFile = FS_createPreloadedFile; }, // TODO: ftruncate ftruncate: (fd, len) => { + if (len < 0) { + throw new FS.ErrnoError({{{ cDefs.EINVAL }}}); + } return FS.handleError(__wasmfs_ftruncate(fd, len)); }, // TODO: utime diff --git a/system/lib/wasmfs/js_api.cpp b/system/lib/wasmfs/js_api.cpp index ee15e58757ef8..6350b1f0b7e0d 100644 --- a/system/lib/wasmfs/js_api.cpp +++ b/system/lib/wasmfs/js_api.cpp @@ -127,8 +127,8 @@ int _wasmfs_unlink(char* path) { return __syscall_unlinkat(AT_FDCWD, (intptr_t)path, 0); } -int _wasmfs_truncate(char *path, off_t size) { - int err = __syscall_truncate64((intptr_t)path, size); +int _wasmfs_truncate(char *path, off_t length) { + int err = __syscall_truncate64((intptr_t)path, length); if (err == -1) { return errno; } diff --git a/test/fs/test_fs_js_api.c b/test/fs/test_fs_js_api.c index c0ff11476d971..17c8f1d950782 100644 --- a/test/fs/test_fs_js_api.c +++ b/test/fs/test_fs_js_api.c @@ -71,33 +71,32 @@ int main() { stat("truncatetest", &s); assert(s.st_size == 4); - // EM_ASM( - // var ex; - // try { - // FS.truncate('truncatetest', -10); - // } catch(err) { - // ex = err; - // } - // console.log(ex); - - // // assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); - // ); - -// EM_ASM( -// var ex; -// try { -// var truncateStream = FS.open('truncatetest', 'w'); -// #if WASMFS -// FS.ftruncate(truncateStream, -10); -// #else -// FS.ftruncate(truncateStream.fd, -10); -// #endif -// } catch(err) { -// ex = err; -// } - -// assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); -// ); + EM_ASM( + var ex; + try { + FS.truncate('truncatetest', -10); + } catch(err) { + ex = err; + } + + assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); + ); + + EM_ASM( + var ex; + try { + var truncateStream = FS.open('truncatetest', 'w'); +#if WASMFS + FS.ftruncate(truncateStream, -10); +#else + FS.ftruncate(truncateStream.fd, -10); +#endif + } catch(err) { + ex = err; + } + + assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); + ); EM_ASM( var ex; From 408fcc38f12f596ac0b8923a4f7bbb0e70dd6d53 Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Tue, 6 Jun 2023 17:49:59 -0400 Subject: [PATCH 03/20] clean up --- src/library_wasmfs.js | 2 -- test/test_core.py | 1 - 2 files changed, 3 deletions(-) diff --git a/src/library_wasmfs.js b/src/library_wasmfs.js index d0594185df68d..71bec1d908a3d 100644 --- a/src/library_wasmfs.js +++ b/src/library_wasmfs.js @@ -255,7 +255,6 @@ FS.createPreloadedFile = FS_createPreloadedFile; // TDOO: chown // TODO: lchown // TODO: fchown - // TODO: truncate truncate: (path, len) => { if (len < 0) { throw new FS.ErrnoError({{{ cDefs.EINVAL }}}); @@ -265,7 +264,6 @@ FS.createPreloadedFile = FS_createPreloadedFile; return __wasmfs_truncate(pathBuffer, len); })); }, - // TODO: ftruncate ftruncate: (fd, len) => { if (len < 0) { throw new FS.ErrnoError({{{ cDefs.EINVAL }}}); diff --git a/test/test_core.py b/test/test_core.py index 729718eeb4c73..dbac8fb3b3cd4 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -6019,7 +6019,6 @@ def test_fs_writeFile(self): def test_fs_js_api(self): self.set_setting("FORCE_FILESYSTEM") - self.emcc_args += ['--profiling'] self.do_runf(test_file('fs/test_fs_js_api.c'), 'success') def test_fs_write(self): From 08773f50e510990bdebee0b6c3e35e73ca21d481 Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Wed, 7 Jun 2023 15:01:11 -0400 Subject: [PATCH 04/20] loggin --- src/library_wasmfs.js | 11 +---- system/lib/wasmfs/js_api.cpp | 1 + system/lib/wasmfs/syscalls.cpp | 3 ++ test/fs/test_fs_js_api.c | 75 ++++++++++++++++------------------ 4 files changed, 41 insertions(+), 49 deletions(-) diff --git a/src/library_wasmfs.js b/src/library_wasmfs.js index 04f25233daffd..a4724c3c989d4 100644 --- a/src/library_wasmfs.js +++ b/src/library_wasmfs.js @@ -276,18 +276,9 @@ FS.createPreloadedFile = FS_createPreloadedFile; // TODO: lchown // TODO: fchown truncate: (path, len) => { - if (len < 0) { - throw new FS.ErrnoError({{{ cDefs.EINVAL }}}); - } - return FS.handleError(withStackSave(() => { - var pathBuffer = stringToUTF8OnStack(path); - return __wasmfs_truncate(pathBuffer, len); - })); + return FS.handleError(withStackSave(() => (__wasmfs_truncate(stringToUTF8OnStack(path), len)))); }, ftruncate: (fd, len) => { - if (len < 0) { - throw new FS.ErrnoError({{{ cDefs.EINVAL }}}); - } return FS.handleError(__wasmfs_ftruncate(fd, len)); }, // TODO: utime diff --git a/system/lib/wasmfs/js_api.cpp b/system/lib/wasmfs/js_api.cpp index df462046e55e6..f07043b48842e 100644 --- a/system/lib/wasmfs/js_api.cpp +++ b/system/lib/wasmfs/js_api.cpp @@ -138,6 +138,7 @@ int _wasmfs_unlink(char* path) { } int _wasmfs_truncate(char *path, off_t length) { + printf("js_api: path: %p, size: %lld\n", path, length); int err = __syscall_truncate64((intptr_t)path, length); if (err == -1) { return errno; diff --git a/system/lib/wasmfs/syscalls.cpp b/system/lib/wasmfs/syscalls.cpp index 13fd784e2139f..9320e2bf44155 100644 --- a/system/lib/wasmfs/syscalls.cpp +++ b/system/lib/wasmfs/syscalls.cpp @@ -25,6 +25,8 @@ #include #include +#include + #include "backend.h" #include "file.h" #include "file_table.h" @@ -1235,6 +1237,7 @@ static int doTruncate(std::shared_ptr& file, off_t size) { } int __syscall_truncate64(intptr_t path, uint64_t size) { + printf("sys: path: %ld, size: %llu\n", path, size); auto parsed = path::parseFile((char*)path); if (auto err = parsed.getError()) { return err; diff --git a/test/fs/test_fs_js_api.c b/test/fs/test_fs_js_api.c index 507aaeb7d1042..bfae9143f56f3 100644 --- a/test/fs/test_fs_js_api.c +++ b/test/fs/test_fs_js_api.c @@ -53,11 +53,7 @@ int main() { EM_ASM( var truncateStream = FS.open('truncatetest', 'w'); -#if WASMFS - FS.ftruncate(truncateStream, 4); -#else FS.ftruncate(truncateStream.fd, 4); -#endif ); stat("truncatetest", &s); assert(s.st_size == 4); @@ -68,45 +64,46 @@ int main() { FS.truncate('truncatetest', -10); } catch(err) { ex = err; + console.log(ex); } - assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); + // assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); ); - EM_ASM( - var ex; - try { - var truncateStream = FS.open('truncatetest', 'w'); -#if WASMFS - FS.ftruncate(truncateStream, -10); -#else - FS.ftruncate(truncateStream.fd, -10); -#endif - } catch(err) { - ex = err; - } - - assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); - ); - - EM_ASM( - var ex; - try { - FS.truncate('nonexistent', 10); - } catch(err) { - ex = err; - } - assert(ex.name === "ErrnoError" && ex.errno === 44 /* ENOENT */); - - var ex; - try { - FS.ftruncate(99, 10); - } catch(err) { - ex = err; - } - - assert(ex.name === "ErrnoError" && ex.errno === 8 /* EBADF */); - ); +// EM_ASM( +// var ex; +// try { +// var truncateStream = FS.open('truncatetest', 'w'); +// #if WASMFS +// FS.ftruncate(truncateStream, -10); +// #else +// FS.ftruncate(truncateStream.fd, -10); +// #endif +// } catch(err) { +// ex = err; +// } + +// assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); +// ); + + // EM_ASM( + // var ex; + // try { + // FS.truncate('nonexistent', 10); + // } catch(err) { + // ex = err; + // } + // assert(ex.name === "ErrnoError" && ex.errno === 44 /* ENOENT */); + + // var ex; + // try { + // FS.ftruncate(99, 10); + // } catch(err) { + // ex = err; + // } + + // assert(ex.name === "ErrnoError" && ex.errno === 8 /* EBADF */); + // ); /********** test FS.rename() **********/ EM_ASM( From 044e8e451f214d51f44812c487f44a493c29c158 Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Thu, 8 Jun 2023 09:50:03 -0400 Subject: [PATCH 05/20] passing tests with logging --- system/lib/wasmfs/js_api.cpp | 10 +++-- system/lib/wasmfs/syscalls.cpp | 5 ++- test/fs/test_fs_js_api.c | 67 ++++++++++++++++------------------ test/test_core.py | 1 + 4 files changed, 42 insertions(+), 41 deletions(-) diff --git a/system/lib/wasmfs/js_api.cpp b/system/lib/wasmfs/js_api.cpp index f07043b48842e..f02f7b7b420a0 100644 --- a/system/lib/wasmfs/js_api.cpp +++ b/system/lib/wasmfs/js_api.cpp @@ -137,16 +137,18 @@ int _wasmfs_unlink(char* path) { return __syscall_unlinkat(AT_FDCWD, (intptr_t)path, 0); } -int _wasmfs_truncate(char *path, off_t length) { - printf("js_api: path: %p, size: %lld\n", path, length); - int err = __syscall_truncate64((intptr_t)path, length); +int _wasmfs_truncate(char *path, long size) { + printf("js_api truncate: path: %p, size: %ld\n", path, size); + int err = __syscall_truncate64((intptr_t)path, size); + printf("js_api: err: %d\n", err); if (err == -1) { return errno; } return err; } -int _wasmfs_ftruncate(int fd, off_t size) { +int _wasmfs_ftruncate(int fd, long size) { + printf("js_api ftruncate: path: %d, size: %ld\n", fd, size); int err = __syscall_ftruncate64(fd, size); if (err == -1) { return errno; diff --git a/system/lib/wasmfs/syscalls.cpp b/system/lib/wasmfs/syscalls.cpp index 9320e2bf44155..196bbf45263d1 100644 --- a/system/lib/wasmfs/syscalls.cpp +++ b/system/lib/wasmfs/syscalls.cpp @@ -1237,7 +1237,8 @@ static int doTruncate(std::shared_ptr& file, off_t size) { } int __syscall_truncate64(intptr_t path, uint64_t size) { - printf("sys: path: %ld, size: %llu\n", path, size); + printf("sys truncate: path: %ld, size: %lld\n", path, size); + printf("sys truncate: path: %ld, size: %llu\n", path, size); auto parsed = path::parseFile((char*)path); if (auto err = parsed.getError()) { return err; @@ -1246,6 +1247,8 @@ int __syscall_truncate64(intptr_t path, uint64_t size) { } int __syscall_ftruncate64(int fd, uint64_t size) { + printf("sys ftruncate: path: %d, size: %lld\n", fd, size); + printf("sys ftruncate: path: %d, size: %llu\n", fd, size); auto openFile = wasmFS.getFileTable().locked().getEntry(fd); if (!openFile) { return -EBADF; diff --git a/test/fs/test_fs_js_api.c b/test/fs/test_fs_js_api.c index bfae9143f56f3..96fe9fbff676a 100644 --- a/test/fs/test_fs_js_api.c +++ b/test/fs/test_fs_js_api.c @@ -64,46 +64,41 @@ int main() { FS.truncate('truncatetest', -10); } catch(err) { ex = err; - console.log(ex); } - // assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); + assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); ); -// EM_ASM( -// var ex; -// try { -// var truncateStream = FS.open('truncatetest', 'w'); -// #if WASMFS -// FS.ftruncate(truncateStream, -10); -// #else -// FS.ftruncate(truncateStream.fd, -10); -// #endif -// } catch(err) { -// ex = err; -// } - -// assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); -// ); - - // EM_ASM( - // var ex; - // try { - // FS.truncate('nonexistent', 10); - // } catch(err) { - // ex = err; - // } - // assert(ex.name === "ErrnoError" && ex.errno === 44 /* ENOENT */); - - // var ex; - // try { - // FS.ftruncate(99, 10); - // } catch(err) { - // ex = err; - // } - - // assert(ex.name === "ErrnoError" && ex.errno === 8 /* EBADF */); - // ); + EM_ASM( + var ex; + try { + var truncateStream = FS.open('truncatetest', 'w'); + FS.ftruncate(truncateStream.fd, -10); + } catch(err) { + ex = err; + } + + assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); + ); + + EM_ASM( + var ex; + try { + FS.truncate('nonexistent', 10); + } catch(err) { + ex = err; + } + assert(ex.name === "ErrnoError" && ex.errno === 44 /* ENOENT */); + + var ex; + try { + FS.ftruncate(99, 10); + } catch(err) { + ex = err; + } + + assert(ex.name === "ErrnoError" && ex.errno === 8 /* EBADF */); + ); /********** test FS.rename() **********/ EM_ASM( diff --git a/test/test_core.py b/test/test_core.py index 4eb9c8393df73..e08a9ab76ec34 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -6019,6 +6019,7 @@ def test_fs_writeFile(self): def test_fs_js_api(self): self.set_setting("FORCE_FILESYSTEM") + self.emcc_args += ['--profiling'] self.do_runf(test_file('fs/test_fs_js_api.c'), 'success') def test_fs_write(self): From a0a3aa6f82c2c6df1e269bea58b07f231b8265de Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Thu, 8 Jun 2023 09:59:58 -0400 Subject: [PATCH 06/20] clean up --- system/lib/wasmfs/js_api.cpp | 3 --- system/lib/wasmfs/syscalls.cpp | 6 ------ 2 files changed, 9 deletions(-) diff --git a/system/lib/wasmfs/js_api.cpp b/system/lib/wasmfs/js_api.cpp index f02f7b7b420a0..0fe0efd27b598 100644 --- a/system/lib/wasmfs/js_api.cpp +++ b/system/lib/wasmfs/js_api.cpp @@ -138,9 +138,7 @@ int _wasmfs_unlink(char* path) { } int _wasmfs_truncate(char *path, long size) { - printf("js_api truncate: path: %p, size: %ld\n", path, size); int err = __syscall_truncate64((intptr_t)path, size); - printf("js_api: err: %d\n", err); if (err == -1) { return errno; } @@ -148,7 +146,6 @@ int _wasmfs_truncate(char *path, long size) { } int _wasmfs_ftruncate(int fd, long size) { - printf("js_api ftruncate: path: %d, size: %ld\n", fd, size); int err = __syscall_ftruncate64(fd, size); if (err == -1) { return errno; diff --git a/system/lib/wasmfs/syscalls.cpp b/system/lib/wasmfs/syscalls.cpp index 196bbf45263d1..13fd784e2139f 100644 --- a/system/lib/wasmfs/syscalls.cpp +++ b/system/lib/wasmfs/syscalls.cpp @@ -25,8 +25,6 @@ #include #include -#include - #include "backend.h" #include "file.h" #include "file_table.h" @@ -1237,8 +1235,6 @@ static int doTruncate(std::shared_ptr& file, off_t size) { } int __syscall_truncate64(intptr_t path, uint64_t size) { - printf("sys truncate: path: %ld, size: %lld\n", path, size); - printf("sys truncate: path: %ld, size: %llu\n", path, size); auto parsed = path::parseFile((char*)path); if (auto err = parsed.getError()) { return err; @@ -1247,8 +1243,6 @@ int __syscall_truncate64(intptr_t path, uint64_t size) { } int __syscall_ftruncate64(int fd, uint64_t size) { - printf("sys ftruncate: path: %d, size: %lld\n", fd, size); - printf("sys ftruncate: path: %d, size: %llu\n", fd, size); auto openFile = wasmFS.getFileTable().locked().getEntry(fd); if (!openFile) { return -EBADF; From 23c432668f82b07ae9ab975b8e48b84d9aaed755 Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Thu, 8 Jun 2023 14:37:44 -0400 Subject: [PATCH 07/20] fix js_api returns --- system/lib/wasmfs/js_api.cpp | 42 ++++++------------------------------ 1 file changed, 7 insertions(+), 35 deletions(-) diff --git a/system/lib/wasmfs/js_api.cpp b/system/lib/wasmfs/js_api.cpp index 2fcac33a0a203..0358ba7e3c0c6 100644 --- a/system/lib/wasmfs/js_api.cpp +++ b/system/lib/wasmfs/js_api.cpp @@ -126,19 +126,11 @@ int _wasmfs_mkdir(char* path, int mode) { int _wasmfs_rmdir(char* path){ return __syscall_unlinkat(AT_FDCWD, (intptr_t)path, AT_REMOVEDIR); } int _wasmfs_open(char* path, int flags, mode_t mode) { - int err = __syscall_openat(AT_FDCWD, (intptr_t)path, flags, mode); - if (err == -1) { - return -errno; - } - return err; + return __syscall_openat(AT_FDCWD, (intptr_t)path, flags, mode); } int _wasmfs_mknod(char* path, mode_t mode, dev_t dev) { - int err = __syscall_mknodat(AT_FDCWD, (intptr_t)path, mode, dev); - if (err == -1) { - return errno; - } - return err; + return __syscall_mknodat(AT_FDCWD, (intptr_t)path, mode, dev); } int _wasmfs_unlink(char* path) { @@ -146,19 +138,11 @@ int _wasmfs_unlink(char* path) { } int _wasmfs_truncate(char *path, long size) { - int err = __syscall_truncate64((intptr_t)path, size); - if (err == -1) { - return errno; - } - return err; + return __syscall_truncate64((intptr_t)path, size); } int _wasmfs_ftruncate(int fd, long size) { - int err = __syscall_ftruncate64(fd, size); - if (err == -1) { - return errno; - } - return err; + return __syscall_ftruncate64(fd, size); } int _wasmfs_chdir(char* path) { return __syscall_chdir((intptr_t)path); } @@ -206,11 +190,7 @@ int _wasmfs_lchmod(char* path, mode_t mode) { } int _wasmfs_rename(char* oldpath, char* newpath) { - int err = __syscall_renameat(AT_FDCWD, (intptr_t)oldpath, AT_FDCWD, (intptr_t)newpath); - if (err == -1) { - return errno; - } - return err; + return __syscall_renameat(AT_FDCWD, (intptr_t)oldpath, AT_FDCWD, (intptr_t)newpath); }; int _wasmfs_read(int fd, void *buf, size_t count) { @@ -244,19 +224,11 @@ int _wasmfs_close(int fd) { } int _wasmfs_stat(char* path, struct stat* statBuf) { - int err = __syscall_stat64((intptr_t)path, (intptr_t)statBuf); - if (err == -1) { - return errno; - } - return err; + return __syscall_stat64((intptr_t)path, (intptr_t)statBuf); } int _wasmfs_lstat(char* path, struct stat* statBuf) { - int err = __syscall_lstat64((intptr_t)path, (intptr_t)statBuf); - if (err == -1) { - return errno; - } - return err; + return __syscall_lstat64((intptr_t)path, (intptr_t)statBuf); } // Helper method that identifies what a path is: From e8576992d3e83dc7e2b44dcd563d15e945651b69 Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Thu, 8 Jun 2023 14:39:38 -0400 Subject: [PATCH 08/20] clean up test --- test/test_core.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/test_core.py b/test/test_core.py index e08a9ab76ec34..4eb9c8393df73 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -6019,7 +6019,6 @@ def test_fs_writeFile(self): def test_fs_js_api(self): self.set_setting("FORCE_FILESYSTEM") - self.emcc_args += ['--profiling'] self.do_runf(test_file('fs/test_fs_js_api.c'), 'success') def test_fs_write(self): From c1b3f46f209b99a25ffe1c7477f02ada3703e49c Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Thu, 8 Jun 2023 14:40:12 -0400 Subject: [PATCH 09/20] remove extra line --- test/fs/test_fs_js_api.c | 1 - 1 file changed, 1 deletion(-) diff --git a/test/fs/test_fs_js_api.c b/test/fs/test_fs_js_api.c index bac8abe10d087..4a53b33b38d88 100644 --- a/test/fs/test_fs_js_api.c +++ b/test/fs/test_fs_js_api.c @@ -203,7 +203,6 @@ int main() { assert(ex.name === "ErrnoError" && ex.errno === 8 /* EBADF */) ); - /********** test FS.mknod() **********/ EM_ASM( FS.mknod("mknodtest", 0100000 | 0777); /* S_IFREG | S_RWXU | S_RWXG | S_RWXO */ From d3a8326b55d1a8130edfd8c476797a4d7597edbd Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Thu, 8 Jun 2023 16:48:06 -0400 Subject: [PATCH 10/20] call syscall from js --- emcc.py | 1 + src/library_wasmfs.js | 4 +++- system/lib/wasmfs/syscalls.cpp | 2 ++ test/fs/test_fs_js_api.c | 25 +++++++++++++------------ test/test_core.py | 2 ++ 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/emcc.py b/emcc.py index bf027b8579367..7dc4e8f28d6e5 100755 --- a/emcc.py +++ b/emcc.py @@ -2334,6 +2334,7 @@ def phase_linker_setup(options, state, newargs): '_wasmfs_read', '_wasmfs_pread', '_wasmfs_symlink', + '__syscall_truncate64', '_wasmfs_stat', '_wasmfs_lstat', '_wasmfs_chmod', diff --git a/src/library_wasmfs.js b/src/library_wasmfs.js index 8c93fa343c850..5b2fac301f2ac 100644 --- a/src/library_wasmfs.js +++ b/src/library_wasmfs.js @@ -277,7 +277,9 @@ FS.createPreloadedFile = FS_createPreloadedFile; // TODO: lchown // TODO: fchown truncate: (path, len) => { - return FS.handleError(withStackSave(() => (__wasmfs_truncate(stringToUTF8OnStack(path), len)))); + console.log("HI ", path, len); + console.log("Type: ", typeof len); + return FS.handleError(withStackSave(() => (___syscall_truncate64(stringToUTF8OnStack(path), len)))); }, ftruncate: (fd, len) => { return FS.handleError(__wasmfs_ftruncate(fd, len)); diff --git a/system/lib/wasmfs/syscalls.cpp b/system/lib/wasmfs/syscalls.cpp index 13fd784e2139f..06b25eefa2268 100644 --- a/system/lib/wasmfs/syscalls.cpp +++ b/system/lib/wasmfs/syscalls.cpp @@ -1235,6 +1235,8 @@ static int doTruncate(std::shared_ptr& file, off_t size) { } int __syscall_truncate64(intptr_t path, uint64_t size) { + printf("sys: %ld, %llu\n", path, size); + printf("sys: %ld, %lld\n", path, size); auto parsed = path::parseFile((char*)path); if (auto err = parsed.getError()) { return err; diff --git a/test/fs/test_fs_js_api.c b/test/fs/test_fs_js_api.c index 4a53b33b38d88..0a36ca14d5d35 100644 --- a/test/fs/test_fs_js_api.c +++ b/test/fs/test_fs_js_api.c @@ -65,22 +65,23 @@ int main() { FS.truncate('truncatetest', -10); } catch(err) { ex = err; + console.log(ex); } - assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); + // assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); ); - EM_ASM( - var ex; - try { - var truncateStream = FS.open('truncatetest', 'w'); - FS.ftruncate(truncateStream.fd, -10); - } catch(err) { - ex = err; - } - - assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); - ); + // EM_ASM( + // var ex; + // try { + // var truncateStream = FS.open('truncatetest', 'w'); + // FS.ftruncate(truncateStream.fd, -10); + // } catch(err) { + // ex = err; + // } + + // assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); + // ); EM_ASM( var ex; diff --git a/test/test_core.py b/test/test_core.py index 4eb9c8393df73..30bb21cba46bc 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -6019,6 +6019,8 @@ def test_fs_writeFile(self): def test_fs_js_api(self): self.set_setting("FORCE_FILESYSTEM") + self.emcc_args += ['--profiling-funcs'] + self.emcc_args += ['--profiling'] self.do_runf(test_file('fs/test_fs_js_api.c'), 'success') def test_fs_write(self): From 279f9a5b612f5352166efb0132303f1c81058df1 Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Fri, 9 Jun 2023 14:35:33 -0400 Subject: [PATCH 11/20] working with int32_t --- .../libc/musl/arch/emscripten/syscall_arch.h | 2 +- system/lib/wasmfs/syscalls.cpp | 8 ++++--- test/fs/test_fs_js_api.c | 23 ++++++++++--------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/system/lib/libc/musl/arch/emscripten/syscall_arch.h b/system/lib/libc/musl/arch/emscripten/syscall_arch.h index bad86ad4e98df..0f5731251c4f3 100644 --- a/system/lib/libc/musl/arch/emscripten/syscall_arch.h +++ b/system/lib/libc/musl/arch/emscripten/syscall_arch.h @@ -56,7 +56,7 @@ int __syscall_poll(intptr_t fds, int nfds, int timeout); int __syscall_getcwd(intptr_t buf, size_t size); int __syscall_ugetrlimit(int resource, intptr_t rlim); intptr_t __syscall_mmap2(intptr_t addr, size_t len, int prot, int flags, int fd, size_t off); -int __syscall_truncate64(intptr_t path, uint64_t length); +int __syscall_truncate64(intptr_t path, int32_t length); int __syscall_ftruncate64(int fd, uint64_t length); int __syscall_stat64(intptr_t path, intptr_t buf); int __syscall_lstat64(intptr_t path, intptr_t buf); diff --git a/system/lib/wasmfs/syscalls.cpp b/system/lib/wasmfs/syscalls.cpp index 06b25eefa2268..ea2a645262cee 100644 --- a/system/lib/wasmfs/syscalls.cpp +++ b/system/lib/wasmfs/syscalls.cpp @@ -1234,9 +1234,9 @@ static int doTruncate(std::shared_ptr& file, off_t size) { return ret; } -int __syscall_truncate64(intptr_t path, uint64_t size) { - printf("sys: %ld, %llu\n", path, size); - printf("sys: %ld, %lld\n", path, size); +int __syscall_truncate64(intptr_t path, int32_t size) { + printf("sys: %ld, %d\n", path, size); + printf("sys: %ld, %u\n", path, size); auto parsed = path::parseFile((char*)path); if (auto err = parsed.getError()) { return err; @@ -1245,6 +1245,8 @@ int __syscall_truncate64(intptr_t path, uint64_t size) { } int __syscall_ftruncate64(int fd, uint64_t size) { + printf("ftrunc sys u: %d, %llu\n", fd, size); + printf("ftrunc sys d: %d, %lld\n", fd, size); auto openFile = wasmFS.getFileTable().locked().getEntry(fd); if (!openFile) { return -EBADF; diff --git a/test/fs/test_fs_js_api.c b/test/fs/test_fs_js_api.c index 0a36ca14d5d35..ee7b06b5ce1a2 100644 --- a/test/fs/test_fs_js_api.c +++ b/test/fs/test_fs_js_api.c @@ -71,17 +71,18 @@ int main() { // assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); ); - // EM_ASM( - // var ex; - // try { - // var truncateStream = FS.open('truncatetest', 'w'); - // FS.ftruncate(truncateStream.fd, -10); - // } catch(err) { - // ex = err; - // } - - // assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); - // ); + EM_ASM( + var ex; + try { + var truncateStream = FS.open('truncatetest', 'w'); + FS.ftruncate(truncateStream.fd, -10); + } catch(err) { + ex = err; + console.log(ex); + } + + // assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); + ); EM_ASM( var ex; From c9242027f2ec1c52df85ade7438ccaa6539dfb8d Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Fri, 9 Jun 2023 15:49:26 -0400 Subject: [PATCH 12/20] int64_t not working --- system/lib/libc/musl/arch/emscripten/syscall_arch.h | 2 +- system/lib/wasmfs/syscalls.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/system/lib/libc/musl/arch/emscripten/syscall_arch.h b/system/lib/libc/musl/arch/emscripten/syscall_arch.h index 0f5731251c4f3..bad86ad4e98df 100644 --- a/system/lib/libc/musl/arch/emscripten/syscall_arch.h +++ b/system/lib/libc/musl/arch/emscripten/syscall_arch.h @@ -56,7 +56,7 @@ int __syscall_poll(intptr_t fds, int nfds, int timeout); int __syscall_getcwd(intptr_t buf, size_t size); int __syscall_ugetrlimit(int resource, intptr_t rlim); intptr_t __syscall_mmap2(intptr_t addr, size_t len, int prot, int flags, int fd, size_t off); -int __syscall_truncate64(intptr_t path, int32_t length); +int __syscall_truncate64(intptr_t path, uint64_t length); int __syscall_ftruncate64(int fd, uint64_t length); int __syscall_stat64(intptr_t path, intptr_t buf); int __syscall_lstat64(intptr_t path, intptr_t buf); diff --git a/system/lib/wasmfs/syscalls.cpp b/system/lib/wasmfs/syscalls.cpp index ea2a645262cee..cbcde21c540e2 100644 --- a/system/lib/wasmfs/syscalls.cpp +++ b/system/lib/wasmfs/syscalls.cpp @@ -1234,9 +1234,9 @@ static int doTruncate(std::shared_ptr& file, off_t size) { return ret; } -int __syscall_truncate64(intptr_t path, int32_t size) { - printf("sys: %ld, %d\n", path, size); - printf("sys: %ld, %u\n", path, size); +int __syscall_truncate64(intptr_t path, uint64_t size) { + printf("sys unsigned: %ld, %llu\n", path, size); + printf("sys signed: %ld, %lld\n", path, size); auto parsed = path::parseFile((char*)path); if (auto err = parsed.getError()) { return err; From 750a978cc719c7048dca2a2271c06e7245d46c08 Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Sat, 10 Jun 2023 11:47:46 -0400 Subject: [PATCH 13/20] working u53toi64 --- src/library_wasmfs.js | 9 ++++++--- src/parseTools.js | 12 +++++++++--- system/lib/wasmfs/syscalls.cpp | 1 + test/core/js_library_i64_params.c | 8 ++++++++ test/core/js_library_i64_params.js | 4 ++++ test/core/js_library_i64_params.out | 5 +++++ test/fs/test_fs_js_api.c | 10 ++++++---- 7 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/library_wasmfs.js b/src/library_wasmfs.js index 5b2fac301f2ac..a839a3263d2a1 100644 --- a/src/library_wasmfs.js +++ b/src/library_wasmfs.js @@ -20,6 +20,8 @@ FS.createPreloadedFile = FS_createPreloadedFile; '$readI53FromI64', '$readI53FromU64', '$FS_createPreloadedFile', + '$convertI32PairToI53Checked', + '$convertI32PairToI53', '$FS_getMode', // For FS.readFile '$UTF8ArrayToString', @@ -28,7 +30,7 @@ FS.createPreloadedFile = FS_createPreloadedFile; 'malloc', 'free', #endif - ], + ].concat(i53ConversionDeps), $FS : { init: () => { FS.ensureErrnoError(); @@ -277,9 +279,10 @@ FS.createPreloadedFile = FS_createPreloadedFile; // TODO: lchown // TODO: fchown truncate: (path, len) => { - console.log("HI ", path, len); + console.log("We send: ", path, len); console.log("Type: ", typeof len); - return FS.handleError(withStackSave(() => (___syscall_truncate64(stringToUTF8OnStack(path), len)))); + console.log("After to 64: ", {{{ sendU53ToI64Param('len')}}}); + return FS.handleError(withStackSave(() => (___syscall_truncate64(stringToUTF8OnStack(path), {{{ sendU53ToI64Param('len')}}})))); }, ftruncate: (fd, len) => { return FS.handleError(__wasmfs_ftruncate(fd, len)); diff --git a/src/parseTools.js b/src/parseTools.js index 1f562108d8e9c..24bead460a74d 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -885,11 +885,17 @@ function receiveI64ParamAsI53Unchecked(name) { return `var ${name} = convertI32PairToI53(${name}_low, ${name}_high);`; } -function sendI64Argument(low, high) { +// Given the name of a variable containing an unsigned 53-bit integer in a JS +// Number or BigInt, send it as a 64-bit argument in a call to wasm. This will +// legalize the argument if necessary (i.e., split it into two i32 arguments, +// if legalization is used). +function sendU53ToI64Param(name) { + // TODO: In ASSERTIONS mode add range checks here. if (WASM_BIGINT) { - return 'BigInt(low) | (BigInt(high) << 32n)'; + return `BigInt(${name})`; } - return low + ', ' + high; + + return `(${name} | 0), (Math.floor(${name} / (2**32)))`; } // Any function called from wasm64 may have bigint args, this function takes diff --git a/system/lib/wasmfs/syscalls.cpp b/system/lib/wasmfs/syscalls.cpp index cbcde21c540e2..ce1283b63d286 100644 --- a/system/lib/wasmfs/syscalls.cpp +++ b/system/lib/wasmfs/syscalls.cpp @@ -1234,6 +1234,7 @@ static int doTruncate(std::shared_ptr& file, off_t size) { return ret; } +EMSCRIPTEN_KEEPALIVE int __syscall_truncate64(intptr_t path, uint64_t size) { printf("sys unsigned: %ld, %llu\n", path, size); printf("sys signed: %ld, %lld\n", path, size); diff --git a/test/core/js_library_i64_params.c b/test/core/js_library_i64_params.c index 4f0cc33ad98a5..77d53b999abdd 100644 --- a/test/core/js_library_i64_params.c +++ b/test/core/js_library_i64_params.c @@ -1,4 +1,5 @@ #include +#include #include #define MAX_SAFE_INTEGER (1ll<<53) @@ -8,6 +9,11 @@ int64_t jscall(int64_t arg); +EMSCRIPTEN_KEEPALIVE +void called_from_js(uint64_t arg) { + printf("called_from_js with: %lld\n", arg); +} + void check_ok(int64_t val) { printf("checking: %lld\n", val); int64_t rtn = jscall(val); @@ -26,6 +32,8 @@ void check_invalid(int64_t val) { int main() { check_ok(42); + // check_ok(-42); + // check_ok(-4294967301); // 2^32 + 5 check_ok(MAX_SAFE_INTEGER/2); check_ok(MIN_SAFE_INTEGER/2); check_ok(MAX_SAFE_INTEGER); diff --git a/test/core/js_library_i64_params.js b/test/core/js_library_i64_params.js index 28a00cf1174df..a05f6ed13b2e9 100644 --- a/test/core/js_library_i64_params.js +++ b/test/core/js_library_i64_params.js @@ -4,6 +4,10 @@ TestLibrary = { jscall: function({{{ defineI64Param('foo') }}}) { {{{ receiveI64ParamAsI53('foo', `(err('overflow'), ${makeReturn64('42')})`) }}} err('js:got: ' + foo); + + // console.log("This param: ", {{{ sendU53ToI64Param("foo") }}}); + _called_from_js({{{ sendU53ToI64Param("foo") }}}); + if (foo < 0) var rtn = Math.ceil(foo / 2); else diff --git a/test/core/js_library_i64_params.out b/test/core/js_library_i64_params.out index 8f1d9b62dcc6b..893cc6da220ac 100644 --- a/test/core/js_library_i64_params.out +++ b/test/core/js_library_i64_params.out @@ -1,25 +1,30 @@ checking: 42 js:got: 42 +called_from_js with: 42 js:returning: 21 got: 21 expected: 21 checking: 4503599627370496 js:got: 4503599627370496 +called_from_js with: 4503599627370496 js:returning: 2251799813685248 got: 2251799813685248 expected: 2251799813685248 checking: -4503599627370496 js:got: -4503599627370496 +called_from_js with: -4503599627370496 js:returning: -2251799813685248 got: -2251799813685248 expected: -2251799813685248 checking: 9007199254740992 js:got: 9007199254740992 +called_from_js with: 9007199254740992 js:returning: 4503599627370496 got: 4503599627370496 expected: 4503599627370496 checking: -9007199254740992 js:got: -9007199254740992 +called_from_js with: -9007199254740992 js:returning: -4503599627370496 got: -4503599627370496 expected: -4503599627370496 diff --git a/test/fs/test_fs_js_api.c b/test/fs/test_fs_js_api.c index ee7b06b5ce1a2..47c62fd9f0a0b 100644 --- a/test/fs/test_fs_js_api.c +++ b/test/fs/test_fs_js_api.c @@ -65,10 +65,10 @@ int main() { FS.truncate('truncatetest', -10); } catch(err) { ex = err; - console.log(ex); + // console.log(ex); } - // assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); + assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); ); EM_ASM( @@ -78,10 +78,10 @@ int main() { FS.ftruncate(truncateStream.fd, -10); } catch(err) { ex = err; - console.log(ex); + // console.log(ex); } - // assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); + assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); ); EM_ASM( @@ -90,6 +90,7 @@ int main() { FS.truncate('nonexistent', 10); } catch(err) { ex = err; + // console.log(ex); } assert(ex.name === "ErrnoError" && ex.errno === 44 /* ENOENT */); @@ -98,6 +99,7 @@ int main() { FS.ftruncate(99, 10); } catch(err) { ex = err; + // console.log(ex); } assert(ex.name === "ErrnoError" && ex.errno === 8 /* EBADF */); From a0e4ca5325da9a4ce899bfcec635d08d60a0b78b Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Sat, 10 Jun 2023 11:52:55 -0400 Subject: [PATCH 14/20] clean up --- src/library_wasmfs.js | 5 +---- system/lib/wasmfs/syscalls.cpp | 4 ---- test/fs/test_fs_js_api.c | 4 ---- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/src/library_wasmfs.js b/src/library_wasmfs.js index a839a3263d2a1..87fce5c568b2d 100644 --- a/src/library_wasmfs.js +++ b/src/library_wasmfs.js @@ -279,13 +279,10 @@ FS.createPreloadedFile = FS_createPreloadedFile; // TODO: lchown // TODO: fchown truncate: (path, len) => { - console.log("We send: ", path, len); - console.log("Type: ", typeof len); - console.log("After to 64: ", {{{ sendU53ToI64Param('len')}}}); return FS.handleError(withStackSave(() => (___syscall_truncate64(stringToUTF8OnStack(path), {{{ sendU53ToI64Param('len')}}})))); }, ftruncate: (fd, len) => { - return FS.handleError(__wasmfs_ftruncate(fd, len)); + return FS.handleError(__wasmfs_ftruncate(fd, {{{ sendU53ToI64Param('len') }}})); }, // TODO: utime findObject: (path) => { diff --git a/system/lib/wasmfs/syscalls.cpp b/system/lib/wasmfs/syscalls.cpp index ce1283b63d286..2482cf151802d 100644 --- a/system/lib/wasmfs/syscalls.cpp +++ b/system/lib/wasmfs/syscalls.cpp @@ -1236,8 +1236,6 @@ static int doTruncate(std::shared_ptr& file, off_t size) { EMSCRIPTEN_KEEPALIVE int __syscall_truncate64(intptr_t path, uint64_t size) { - printf("sys unsigned: %ld, %llu\n", path, size); - printf("sys signed: %ld, %lld\n", path, size); auto parsed = path::parseFile((char*)path); if (auto err = parsed.getError()) { return err; @@ -1246,8 +1244,6 @@ int __syscall_truncate64(intptr_t path, uint64_t size) { } int __syscall_ftruncate64(int fd, uint64_t size) { - printf("ftrunc sys u: %d, %llu\n", fd, size); - printf("ftrunc sys d: %d, %lld\n", fd, size); auto openFile = wasmFS.getFileTable().locked().getEntry(fd); if (!openFile) { return -EBADF; diff --git a/test/fs/test_fs_js_api.c b/test/fs/test_fs_js_api.c index 47c62fd9f0a0b..4a53b33b38d88 100644 --- a/test/fs/test_fs_js_api.c +++ b/test/fs/test_fs_js_api.c @@ -65,7 +65,6 @@ int main() { FS.truncate('truncatetest', -10); } catch(err) { ex = err; - // console.log(ex); } assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); @@ -78,7 +77,6 @@ int main() { FS.ftruncate(truncateStream.fd, -10); } catch(err) { ex = err; - // console.log(ex); } assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); @@ -90,7 +88,6 @@ int main() { FS.truncate('nonexistent', 10); } catch(err) { ex = err; - // console.log(ex); } assert(ex.name === "ErrnoError" && ex.errno === 44 /* ENOENT */); @@ -99,7 +96,6 @@ int main() { FS.ftruncate(99, 10); } catch(err) { ex = err; - // console.log(ex); } assert(ex.name === "ErrnoError" && ex.errno === 8 /* EBADF */); From b1703ff46f3a82a3348a9cf65b7c8552a0682cb7 Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Mon, 12 Jun 2023 09:23:10 -0400 Subject: [PATCH 15/20] clean up test --- test/fs/test_fs_js_api.c | 71 +++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/test/fs/test_fs_js_api.c b/test/fs/test_fs_js_api.c index 4a53b33b38d88..af82cbed796bf 100644 --- a/test/fs/test_fs_js_api.c +++ b/test/fs/test_fs_js_api.c @@ -4,34 +4,7 @@ #include #include -int main() { - /********** test FS.open() **********/ - EM_ASM( - FS.writeFile('testfile', 'a=1\nb=2\n'); - var readStream = FS.open('testfile', 'r'); - var writeStream = FS.open('testfile', 'w'); - var writePlusStream = FS.open('testfile', 'w+'); - var appendStream = FS.open('testfile', 'a'); - - assert(readStream && readStream.fd >= 0); - assert(writeStream && writeStream.fd >= 0); - assert(writePlusStream && writePlusStream.fd >= 0); - assert(appendStream && appendStream.fd >= 0); - - var ex; - try { - FS.open('filenothere', 'r'); - } catch(err) { - ex = err; - } - assert(ex.name === "ErrnoError" && ex.errno === 44 /* ENOENT */); - - var createFileNotHere = FS.open('filenothere', 'w+'); - - assert(createFileNotHere && createFileNotHere.fd >= 0); - ); - - /********** test FS.truncate() **********/ +void test_fs_truncate() { EM_ASM( FS.writeFile('truncatetest', 'a=1\nb=2\n'); ); @@ -66,24 +39,16 @@ int main() { } catch(err) { ex = err; } - assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); - ); - EM_ASM( - var ex; try { var truncateStream = FS.open('truncatetest', 'w'); FS.ftruncate(truncateStream.fd, -10); } catch(err) { ex = err; } - assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */); - ); - EM_ASM( - var ex; try { FS.truncate('nonexistent', 10); } catch(err) { @@ -97,9 +62,39 @@ int main() { } catch(err) { ex = err; } - assert(ex.name === "ErrnoError" && ex.errno === 8 /* EBADF */); ); + + remove("truncatetest"); +} + +int main() { + /********** test FS.open() **********/ + EM_ASM( + FS.writeFile('testfile', 'a=1\nb=2\n'); + var readStream = FS.open('testfile', 'r'); + var writeStream = FS.open('testfile', 'w'); + var writePlusStream = FS.open('testfile', 'w+'); + var appendStream = FS.open('testfile', 'a'); + + assert(readStream && readStream.fd >= 0); + assert(writeStream && writeStream.fd >= 0); + assert(writePlusStream && writePlusStream.fd >= 0); + assert(appendStream && appendStream.fd >= 0); + + var ex; + try { + FS.open('filenothere', 'r'); + } catch(err) { + ex = err; + } + assert(ex.name === "ErrnoError" && ex.errno === 44 /* ENOENT */); + + var createFileNotHere = FS.open('filenothere', 'w+'); + + assert(createFileNotHere && createFileNotHere.fd >= 0); + ); + /********** test FS.rename() **********/ EM_ASM( @@ -219,6 +214,8 @@ int main() { assert(S_ISREG(stats.st_mode)); assert(stats.st_mode & 0400); + test_fs_truncate(); + remove("mknodtest"); remove("createtest"); remove("truncatetest"); From 0cabd039b05a0ec2815801550efb22abf441e409 Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Mon, 12 Jun 2023 09:40:13 -0400 Subject: [PATCH 16/20] clean up --- test/core/js_library_i64_params.c | 3 +-- test/core/js_library_i64_params.js | 1 - test/core/js_library_i64_params.out | 6 ++++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/test/core/js_library_i64_params.c b/test/core/js_library_i64_params.c index 77d53b999abdd..134309d93b56f 100644 --- a/test/core/js_library_i64_params.c +++ b/test/core/js_library_i64_params.c @@ -32,8 +32,7 @@ void check_invalid(int64_t val) { int main() { check_ok(42); - // check_ok(-42); - // check_ok(-4294967301); // 2^32 + 5 + check_ok(-42); check_ok(MAX_SAFE_INTEGER/2); check_ok(MIN_SAFE_INTEGER/2); check_ok(MAX_SAFE_INTEGER); diff --git a/test/core/js_library_i64_params.js b/test/core/js_library_i64_params.js index a05f6ed13b2e9..bafe1ff03d521 100644 --- a/test/core/js_library_i64_params.js +++ b/test/core/js_library_i64_params.js @@ -5,7 +5,6 @@ TestLibrary = { {{{ receiveI64ParamAsI53('foo', `(err('overflow'), ${makeReturn64('42')})`) }}} err('js:got: ' + foo); - // console.log("This param: ", {{{ sendU53ToI64Param("foo") }}}); _called_from_js({{{ sendU53ToI64Param("foo") }}}); if (foo < 0) diff --git a/test/core/js_library_i64_params.out b/test/core/js_library_i64_params.out index 893cc6da220ac..0867645450a01 100644 --- a/test/core/js_library_i64_params.out +++ b/test/core/js_library_i64_params.out @@ -4,6 +4,12 @@ called_from_js with: 42 js:returning: 21 got: 21 expected: 21 +checking: -42 +js:got: -42 +called_from_js with: -42 +js:returning: -21 +got: -21 +expected: -21 checking: 4503599627370496 js:got: 4503599627370496 called_from_js with: 4503599627370496 From 058dfa6b7912bdc4783ec3a68d64c132bf0ff8be Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Tue, 13 Jun 2023 10:04:33 -0400 Subject: [PATCH 17/20] clean up --- emcc.py | 3 +-- src/library_wasmfs.js | 11 ++++++----- test/fs/test_fs_js_api.c | 2 -- test/test_core.py | 2 -- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/emcc.py b/emcc.py index 2f9dbba4d764d..1b03276a79fe1 100755 --- a/emcc.py +++ b/emcc.py @@ -2331,8 +2331,6 @@ def phase_linker_setup(options, state, newargs): '_wasmfs_pwrite', '_wasmfs_rename', '_wasmfs_mkdir', - '_wasmfs_truncate', - '_wasmfs_ftruncate', '_wasmfs_unlink', '_wasmfs_chdir', '_wasmfs_mknod', @@ -2341,6 +2339,7 @@ def phase_linker_setup(options, state, newargs): '_wasmfs_pread', '_wasmfs_symlink', '__syscall_truncate64', + '__syscall_ftruncate64', '_wasmfs_stat', '_wasmfs_lstat', '_wasmfs_chmod', diff --git a/src/library_wasmfs.js b/src/library_wasmfs.js index 31b550b99d69e..dbf9f6588e8b1 100644 --- a/src/library_wasmfs.js +++ b/src/library_wasmfs.js @@ -20,8 +20,8 @@ FS.createPreloadedFile = FS_createPreloadedFile; '$readI53FromI64', '$readI53FromU64', '$FS_createPreloadedFile', - '$convertI32PairToI53Checked', - '$convertI32PairToI53', + // '$convertI32PairToI53Checked', + // '$convertI32PairToI53', '$FS_getMode', // For FS.readFile '$UTF8ArrayToString', @@ -30,7 +30,8 @@ FS.createPreloadedFile = FS_createPreloadedFile; 'malloc', 'free', #endif - ].concat(i53ConversionDeps), + ], + // .concat(i53ConversionDeps), $FS : { init: () => { FS.ensureErrnoError(); @@ -282,10 +283,10 @@ FS.createPreloadedFile = FS_createPreloadedFile; // TODO: lchown // TODO: fchown truncate: (path, len) => { - return FS.handleError(withStackSave(() => (___syscall_truncate64(stringToUTF8OnStack(path), {{{ splitI64('len')}}})))); + return FS.handleError(withStackSave(() => (___syscall_truncate64(stringToUTF8OnStack(path), {{{ splitI64('len') }}})))); }, ftruncate: (fd, len) => { - return FS.handleError(__wasmfs_ftruncate(fd, {{{ splitI64('len') }}})); + return FS.handleError(___syscall_ftruncate64(fd, {{{ splitI64('len') }}})); }, // TODO: utime findObject: (path) => { diff --git a/test/fs/test_fs_js_api.c b/test/fs/test_fs_js_api.c index f0f091cab8ed8..ae9fa0a8b111e 100644 --- a/test/fs/test_fs_js_api.c +++ b/test/fs/test_fs_js_api.c @@ -95,7 +95,6 @@ int main() { assert(createFileNotHere && createFileNotHere.fd >= 0); ); - /********** test FS.rename() **********/ EM_ASM( FS.mkdir('renamedir'); @@ -270,7 +269,6 @@ int main() { remove("mknodtest"); remove("createtest"); - remove("truncatetest"); remove("testfile"); remove("renametestfile"); remove("readtestfile"); diff --git a/test/test_core.py b/test/test_core.py index 6bc8076e540de..0b7a2be160584 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -6017,8 +6017,6 @@ def test_fs_writeFile(self): def test_fs_js_api(self): self.set_setting("FORCE_FILESYSTEM") - self.emcc_args += ['--profiling-funcs'] - self.emcc_args += ['--profiling'] self.do_runf(test_file('fs/test_fs_js_api.c'), 'success') def test_fs_write(self): From f057bc4adb0caeac5381f6a4294710f06188e4fa Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Tue, 13 Jun 2023 10:06:08 -0400 Subject: [PATCH 18/20] remove unused import --- src/library_wasmfs.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/library_wasmfs.js b/src/library_wasmfs.js index dbf9f6588e8b1..e2808ec9baf98 100644 --- a/src/library_wasmfs.js +++ b/src/library_wasmfs.js @@ -20,8 +20,6 @@ FS.createPreloadedFile = FS_createPreloadedFile; '$readI53FromI64', '$readI53FromU64', '$FS_createPreloadedFile', - // '$convertI32PairToI53Checked', - // '$convertI32PairToI53', '$FS_getMode', // For FS.readFile '$UTF8ArrayToString', @@ -31,7 +29,6 @@ FS.createPreloadedFile = FS_createPreloadedFile; 'free', #endif ], - // .concat(i53ConversionDeps), $FS : { init: () => { FS.ensureErrnoError(); From 1d18411b58c70dba3a0391935929d22651d4b417 Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Tue, 13 Jun 2023 10:06:42 -0400 Subject: [PATCH 19/20] remove white space --- test/fs/test_fs_js_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fs/test_fs_js_api.c b/test/fs/test_fs_js_api.c index ae9fa0a8b111e..dae0daa0875ad 100644 --- a/test/fs/test_fs_js_api.c +++ b/test/fs/test_fs_js_api.c @@ -94,7 +94,7 @@ int main() { assert(createFileNotHere && createFileNotHere.fd >= 0); ); - + /********** test FS.rename() **********/ EM_ASM( FS.mkdir('renamedir'); From bce26138af0104f7eb0e6eed1e9df976fe4f2a3b Mon Sep 17 00:00:00 2001 From: jameshu15869 Date: Tue, 13 Jun 2023 14:30:59 -0400 Subject: [PATCH 20/20] use wrapper calls instead of raw syscals --- emcc.py | 4 ++-- src/library_wasmfs.js | 4 ++-- system/lib/wasmfs/js_api.cpp | 38 +++++++++++++++++++++++++++++++----- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/emcc.py b/emcc.py index 1b03276a79fe1..4c1c1836e011b 100755 --- a/emcc.py +++ b/emcc.py @@ -2338,8 +2338,8 @@ def phase_linker_setup(options, state, newargs): '_wasmfs_read', '_wasmfs_pread', '_wasmfs_symlink', - '__syscall_truncate64', - '__syscall_ftruncate64', + '_wasmfs_truncate', + '_wasmfs_ftruncate', '_wasmfs_stat', '_wasmfs_lstat', '_wasmfs_chmod', diff --git a/src/library_wasmfs.js b/src/library_wasmfs.js index e2808ec9baf98..ee881ded62155 100644 --- a/src/library_wasmfs.js +++ b/src/library_wasmfs.js @@ -280,10 +280,10 @@ FS.createPreloadedFile = FS_createPreloadedFile; // TODO: lchown // TODO: fchown truncate: (path, len) => { - return FS.handleError(withStackSave(() => (___syscall_truncate64(stringToUTF8OnStack(path), {{{ splitI64('len') }}})))); + return FS.handleError(withStackSave(() => (__wasmfs_truncate(stringToUTF8OnStack(path), {{{ splitI64('len') }}})))); }, ftruncate: (fd, len) => { - return FS.handleError(___syscall_ftruncate64(fd, {{{ splitI64('len') }}})); + return FS.handleError(__wasmfs_ftruncate(fd, {{{ splitI64('len') }}})); }, // TODO: utime findObject: (path) => { diff --git a/system/lib/wasmfs/js_api.cpp b/system/lib/wasmfs/js_api.cpp index b3524567b6032..5fdc8545ddde3 100644 --- a/system/lib/wasmfs/js_api.cpp +++ b/system/lib/wasmfs/js_api.cpp @@ -126,11 +126,19 @@ int _wasmfs_mkdir(char* path, int mode) { int _wasmfs_rmdir(char* path){ return __syscall_unlinkat(AT_FDCWD, (intptr_t)path, AT_REMOVEDIR); } int _wasmfs_open(char* path, int flags, mode_t mode) { - return __syscall_openat(AT_FDCWD, (intptr_t)path, flags, mode); + int err = __syscall_openat(AT_FDCWD, (intptr_t)path, flags, mode); + if (err == -1) { + return -errno; + } + return err; } int _wasmfs_mknod(char* path, mode_t mode, dev_t dev) { - return __syscall_mknodat(AT_FDCWD, (intptr_t)path, mode, dev); + int err = __syscall_mknodat(AT_FDCWD, (intptr_t)path, mode, dev); + if (err == -1) { + return errno; + } + return err; } int _wasmfs_unlink(char* path) { @@ -182,7 +190,11 @@ int _wasmfs_lchmod(char* path, mode_t mode) { } int _wasmfs_rename(char* oldpath, char* newpath) { - return __syscall_renameat(AT_FDCWD, (intptr_t)oldpath, AT_FDCWD, (intptr_t)newpath); + int err = __syscall_renameat(AT_FDCWD, (intptr_t)oldpath, AT_FDCWD, (intptr_t)newpath); + if (err == -1) { + return errno; + } + return err; }; int _wasmfs_read(int fd, void *buf, size_t count) { @@ -211,16 +223,32 @@ int _wasmfs_pread(int fd, void *buf, size_t count, off_t offset) { return numBytes; } +int _wasmfs_truncate(char* path, off_t length) { + return __syscall_truncate64((intptr_t)path, length); +} + +int _wasmfs_ftruncate(int fd, off_t length) { + return __syscall_ftruncate64(fd, length); +} + int _wasmfs_close(int fd) { return __wasi_fd_close(fd); } int _wasmfs_stat(char* path, struct stat* statBuf) { - return __syscall_stat64((intptr_t)path, (intptr_t)statBuf); + int err = __syscall_stat64((intptr_t)path, (intptr_t)statBuf); + if (err == -1) { + return errno; + } + return err; } int _wasmfs_lstat(char* path, struct stat* statBuf) { - return __syscall_lstat64((intptr_t)path, (intptr_t)statBuf); + int err = __syscall_lstat64((intptr_t)path, (intptr_t)statBuf); + if (err == -1) { + return errno; + } + return err; } // Helper method that identifies what a path is: