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: