Implement a few more WASI APIs
Followup to #12704.
diff --git a/src/library_wasi.js b/src/library_wasi.js
index c506cbb..bfd2917 100644
--- a/src/library_wasi.js
+++ b/src/library_wasi.js
@@ -381,6 +381,31 @@
#endif
},
+ fd_tell: function(fd, offset_addr) {
+#if SYSCALLS_REQUIRE_FILESYSTEM
+ var stream = SYSCALLS.getStreamFromFD(fd);
+ var offset = FS.llseek(stream, 0, {{{ cDefs.SEEK_CUR }}});
+ {{{ makeSetValue('offset_addr', '0', 'offset', 'i64') }}};
+ return 0;
+#else
+ return {{{ cDefs.ESPIPE }}};
+#endif
+ },
+
+ fd_renumber: function(fd, to) {
+#if SYSCALLS_REQUIRE_FILESYSTEM
+ var oldStream = SYSCALLS.getStreamFromFD(fd);
+ var newStream = SYSCALLS.getStreamFromFD(fd);
+ if (!oldStream || !newStream) return -{{{ cDefs.EINVAL }}};
+ var newfd = newStream.fd;
+ FS.close(newStream);
+ oldStream.fd = newfd;
+ return 0;
+#else
+ return {{{ cDefs.ESPIPE }}};
+#endif
+ },
+
$wasiRightsToMuslOFlags: function(rights) {
#if SYSCALL_DEBUG
err('wasiRightsToMuslOFlags: ' + rights);
diff --git a/test/common.py b/test/common.py
index 676738a..d82d329 100644
--- a/test/common.py
+++ b/test/common.py
@@ -892,6 +892,7 @@
return '\n'.join(lines)
def run_js(self, filename, engine=None, args=None,
+ input=None,
output_nicerizer=None,
assert_returncode=0,
interleaved_output=True):
@@ -916,6 +917,7 @@
jsrun.run_js(filename, engine, args,
stdout=stdout,
stderr=stderr,
+ input=input,
assert_returncode=assert_returncode)
except subprocess.TimeoutExpired as e:
timeout_error = e
diff --git a/test/jsrun.py b/test/jsrun.py
index eb75b16..12878c5 100644
--- a/test/jsrun.py
+++ b/test/jsrun.py
@@ -83,7 +83,7 @@
sys.exit(1)
-def run_js(filename, engine, args=None,
+def run_js(filename, engine, args=None, input=None,
stdin=None, stdout=PIPE, stderr=None, cwd=None,
full_output=False, assert_returncode=0, skip_check=False,
timeout=DEFAULT_TIMEOUT):
@@ -104,6 +104,7 @@
stdin=stdin,
stdout=stdout,
stderr=stderr,
+ input=input,
cwd=cwd,
timeout=timeout,
universal_newlines=True)
diff --git a/test/test_other.py b/test/test_other.py
index fb88902..b578519 100644
--- a/test/test_other.py
+++ b/test/test_other.py
@@ -13343,7 +13343,8 @@
config = json.load(f)
exit_code = config.get('exitCode', 0)
args = config.get('args', [])
- env = config.get('env', [])
+ env = config.get('env')
+ stdin = config.get('stdin')
if env:
env = [f'ENV["{key}"] = "{value}";' for key, value in env.items()]
env = '\n'.join(env)
@@ -13353,7 +13354,7 @@
'-sPURE_WASI', '-lnodefs.js', '-lnoderawfs.js',
wasm, '-o', name + '.js'] + self.get_emcc_args(main_file=True))
- output = self.run_js(name + '.js', args=args, assert_returncode=exit_code)
+ output = self.run_js(name + '.js', args=args, assert_returncode=exit_code, input=stdin)
if 'stdout' in config:
self.assertContained(config['stdout'], output)
@@ -13368,14 +13369,26 @@
self.run_wasi_test_suite_test('std_env_vars')
@requires_node
- def test_wasi_std_io_stdout(self):
- self.run_wasi_test_suite_test('std_io_stdout')
+ def test_wasi_std_fs_write(self):
+ self.run_wasi_test_suite_test('std_fs_write')
@requires_node
def test_wasi_std_io_stderr(self):
self.run_wasi_test_suite_test('std_io_stderr')
@requires_node
+ def test_wasi_std_io_stdin(self):
+ self.run_wasi_test_suite_test('std_io_stdin')
+
+ @requires_node
+ def test_wasi_std_io_stdout(self):
+ self.run_wasi_test_suite_test('std_io_stdout')
+
+ @requires_node
+ def test_wasi_std_process_exit(self):
+ self.run_wasi_test_suite_test('std_process_exit')
+
+ @requires_node
def test_wasi_clock_res_get(self):
self.run_wasi_test_suite_test('wasi_clock_res_get')
@@ -13388,6 +13401,14 @@
self.run_wasi_test_suite_test('wasi_fd_fdstat_get')
@requires_node
+ def test_wasi_wasi_fd_renumber(self):
+ self.run_wasi_test_suite_test('wasi_fd_renumber')
+
+ @requires_node
+ def test_wasi_wasi_fd_tell_file(self):
+ self.run_wasi_test_suite_test('wasi_fd_tell_file')
+
+ @requires_node
def test_wasi_wasi_fd_write_file(self):
self.run_wasi_test_suite_test('wasi_fd_write_file')
with open('new_file') as f: