Skip to content

Commit 94ae66a

Browse files
authored
Implement FS.rmdir with WasmFS (#18952)
1 parent a90c5ab commit 94ae66a

File tree

6 files changed

+65
-0
lines changed

6 files changed

+65
-0
lines changed

emcc.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2325,6 +2325,7 @@ def phase_linker_setup(options, state, newargs):
23252325
'_wasmfs_mkdir',
23262326
'_wasmfs_unlink',
23272327
'_wasmfs_chdir',
2328+
'_wasmfs_rmdir',
23282329
'_wasmfs_symlink',
23292330
'_wasmfs_chmod',
23302331
'_wasmfs_identify',

emscripten.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,6 +885,8 @@ def create_wasm64_wrappers(metadata):
885885
'_emscripten_thread_free_data': '_p',
886886
'_emscripten_dlsync_self_async': '_p',
887887
'_emscripten_proxy_dlsync_async': '_pp',
888+
'_wasmfs_rmdir': '_p',
889+
'_wasmfs_unlink': '_p'
888890
}
889891

890892
wasm64_wrappers = '''

src/library_wasmfs.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,12 @@ mergeInto(LibraryManager.library, {
140140
},
141141
// TODO: mkdirTree
142142
// TDOO: rmdir
143+
rmdir: (path) => {
144+
return withStackSave(() => {
145+
var buffer = stringToUTF8OnStack(path);
146+
return __wasmfs_rmdir(buffer);
147+
})
148+
},
143149
// TODO: open
144150
open: (path, flags, mode) => {
145151
flags = typeof flags == 'string' ? FS.modeStringToFlags(flags) : flags;

system/lib/wasmfs/js_api.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ int _wasmfs_mkdir(char* path, int mode) {
100100
return __syscall_mkdirat(AT_FDCWD, (intptr_t)path, mode);
101101
}
102102

103+
int _wasmfs_rmdir(char* path){ return __syscall_unlinkat(AT_FDCWD, (intptr_t)path, AT_REMOVEDIR); }
104+
103105
int _wasmfs_open(char* path, int flags, mode_t mode) {
104106
return __syscall_openat(AT_FDCWD, (intptr_t)path, flags, mode);
105107
}

test/fs/test_dir.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright 2023 The Emscripten Authors. All rights reserved.
3+
* Emscripten is available under two separate licenses, the MIT license and the
4+
* University of Illinois/NCSA Open Source License. Both these licenses can be
5+
* found in the LICENSE file.
6+
*/
7+
8+
#include <assert.h>
9+
#include <emscripten/emscripten.h>
10+
#include <stdio.h>
11+
12+
int main() {
13+
EM_ASM(
14+
// Create multiple directories
15+
var err = FS.mkdir('/dir1');
16+
assert(!err);
17+
err = FS.mkdir('/dir2');
18+
assert(!err);
19+
20+
// Remove the multiple directories
21+
err = FS.rmdir('/dir1');
22+
assert(!err);
23+
err = FS.rmdir('/dir2');
24+
assert(!err);
25+
26+
// Create a directory with a file inside it
27+
var err = FS.mkdir('/test_dir');
28+
assert(!err);
29+
err = FS.writeFile('/test_dir/file.txt', 'Hello World!');
30+
assert(!err);
31+
32+
// Attempt to remove the directory (should fail)
33+
err = FS.rmdir('/test_dir');
34+
assert(err);
35+
36+
// Remove the file and then the directory
37+
err = FS.unlink('/test_dir/file.txt');
38+
assert(!err);
39+
err = FS.rmdir('/test_dir');
40+
assert(!err);
41+
42+
// Attempt to remove a non-existent directory (should fail)
43+
var err = FS.rmdir('/non_existent_dir');
44+
assert(err);
45+
);
46+
puts("success");
47+
48+
return 0;
49+
}

test/test_core.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5953,6 +5953,11 @@ def test_istream(self):
59535953
self.set_setting('LINKABLE', linkable)
59545954
self.do_core_test('test_istream.cpp')
59555955

5956+
def test_fs_dir_wasmfs(self):
5957+
self.emcc_args += ['-sWASMFS']
5958+
self.emcc_args += ['-sFORCE_FILESYSTEM']
5959+
self.do_runf(test_file('fs/test_dir.c'), 'success')
5960+
59565961
def test_fs_base(self):
59575962
self.set_setting('DEFAULT_LIBRARY_FUNCS_TO_INCLUDE', ['$FS'])
59585963
self.uses_es6 = True

0 commit comments

Comments
 (0)