Skip to content

Commit d4cca9f

Browse files
authored
WasmFS JS API: Implement rename (#19535)
1 parent f55f018 commit d4cca9f

File tree

4 files changed

+57
-2
lines changed

4 files changed

+57
-2
lines changed

emcc.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2318,6 +2318,7 @@ def phase_linker_setup(options, state, newargs):
23182318
'_wasmfs_write_file',
23192319
'_wasmfs_open',
23202320
'_wasmfs_close',
2321+
'_wasmfs_rename',
23212322
'_wasmfs_mkdir',
23222323
'_wasmfs_unlink',
23232324
'_wasmfs_chdir',

src/library_wasmfs.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,13 +284,19 @@ FS.createPreloadedFile = FS_createPreloadedFile;
284284
__wasmfs_readdir_finish(state);
285285
return entries;
286286
});
287-
}
287+
},
288288
// TODO: mount
289289
// TODO: unmount
290290
// TODO: lookup
291291
// TODO: mknod
292292
// TODO: mkdev
293-
// TODO: rename
293+
rename: (oldPath, newPath) => {
294+
return FS.handleError(withStackSave(() => {
295+
var oldPathBuffer = stringToUTF8OnStack(oldPath);
296+
var newPathBuffer = stringToUTF8OnStack(newPath);
297+
return __wasmfs_rename(oldPathBuffer, newPathBuffer);
298+
}));
299+
},
294300
// TODO: syncfs
295301
// TODO: llseek
296302
// TODO: ioctl

system/lib/wasmfs/js_api.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,14 @@ int _wasmfs_lchmod(char* path, mode_t mode) {
155155
return __syscall_fchmodat(AT_FDCWD, (intptr_t)path, mode, AT_SYMLINK_NOFOLLOW);
156156
}
157157

158+
int _wasmfs_rename(char* oldpath, char* newpath) {
159+
int err = __syscall_renameat(AT_FDCWD, (intptr_t)oldpath, AT_FDCWD, (intptr_t)newpath);
160+
if (err == -1) {
161+
return errno;
162+
}
163+
return err;
164+
};
165+
158166
int _wasmfs_read(int fd, void *buf, size_t count) {
159167
__wasi_iovec_t iovs[1];
160168
iovs[0].buf = (uint8_t *)buf;

test/fs/test_fs_js_api.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,41 @@ int main() {
3737
#endif
3838
);
3939

40+
/********** test FS.rename() **********/
41+
EM_ASM(
42+
FS.mkdir('renamedir');
43+
FS.writeFile('renamedir/renametestfile', "");
44+
45+
FS.rename('renamedir/renametestfile', 'renamedir/newname');
46+
var newnameStream = FS.open('renamedir/newname', 'r');
47+
assert(newnameStream);
48+
49+
var ex;
50+
try {
51+
FS.open('renamedir/renametestfile', 'r');
52+
} catch (err) {
53+
ex = err;
54+
}
55+
assert(ex.name === "ErrnoError" && ex.errno === 44 /* ENOENT */);
56+
57+
58+
try {
59+
FS.rename('renamedir', 'renamedir/newdirname');
60+
} catch (err) {
61+
ex = err;
62+
}
63+
// The old path should not be an ancestor of the new path.
64+
assert(ex.name === "ErrnoError" && ex.errno === 28 /* EINVAL */);
65+
66+
FS.writeFile('toplevelfile', "");
67+
try {
68+
FS.rename('renamedir', 'toplevelfile');
69+
} catch (err) {
70+
ex = err;
71+
}
72+
assert(ex.name === "ErrnoError" && ex.errno === 54 /* ENOTDIR */);
73+
);
74+
4075
/********** test FS.read() **********/
4176
EM_ASM(
4277
FS.writeFile("readtestfile", 'a=1_b=2_');
@@ -104,5 +139,10 @@ int main() {
104139
assert(ex.name === "ErrnoError" && ex.errno === 8 /* EBADF */)
105140
);
106141

142+
remove("testfile");
143+
remove("renametestfile");
144+
remove("readtestfile");
145+
remove("closetestfile");
146+
107147
puts("success");
108148
}

0 commit comments

Comments
 (0)