Skip to content

Commit 7972c8e

Browse files
authored
WasmFS JS API: Implement mknod and create (#19536)
1 parent 09654a1 commit 7972c8e

File tree

4 files changed

+43
-7
lines changed

4 files changed

+43
-7
lines changed

emcc.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2324,6 +2324,7 @@ def phase_linker_setup(options, state, newargs):
23242324
'_wasmfs_mkdir',
23252325
'_wasmfs_unlink',
23262326
'_wasmfs_chdir',
2327+
'_wasmfs_mknod',
23272328
'_wasmfs_rmdir',
23282329
'_wasmfs_read',
23292330
'_wasmfs_pread',

src/library_wasmfs.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,12 @@ FS.createPreloadedFile = FS_createPreloadedFile;
108108
});
109109
},
110110
// TODO: mkdirTree
111-
// TDOO: rmdir
112111
rmdir: (path) => {
113112
return withStackSave(() => {
114113
var buffer = stringToUTF8OnStack(path);
115114
return __wasmfs_rmdir(buffer);
116115
})
117116
},
118-
// TODO: open
119117
open: (path, flags, mode) => {
120118
flags = typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags;
121119
mode = typeof mode == 'undefined' ? 438 /* 0666 */ : mode;
@@ -125,8 +123,13 @@ FS.createPreloadedFile = FS_createPreloadedFile;
125123
return { fd : fd };
126124
});
127125
},
128-
// TODO: create
129-
// TODO: close
126+
create: (path, mode) => {
127+
// Default settings copied from the legacy JS FS API.
128+
mode = mode !== undefined ? mode : 438 /* 0666 */;
129+
mode &= {{{ cDefs.S_IALLUGO }}};
130+
mode |= {{{ cDefs.S_IFREG }}};
131+
return FS.mknod(path, mode, 0);
132+
},
130133
close: (stream) => {
131134
return FS.handleError(-__wasmfs_close(stream.fd));
132135
},
@@ -261,14 +264,12 @@ FS.createPreloadedFile = FS_createPreloadedFile;
261264
return __wasmfs_chmod(buffer, mode);
262265
}));
263266
},
264-
// TODO: lchmod
265267
lchmod: (path, mode) => {
266268
return FS.handleError(withStackSave(() => {
267269
var buffer = stringToUTF8OnStack(path);
268270
return __wasmfs_lchmod(buffer, mode);
269271
}));
270272
},
271-
// TODO: fchmod
272273
fchmod: (fd, mode) => {
273274
return FS.handleError(__wasmfs_fchmod(fd, mode));
274275
},
@@ -308,7 +309,12 @@ FS.createPreloadedFile = FS_createPreloadedFile;
308309
// TODO: mount
309310
// TODO: unmount
310311
// TODO: lookup
311-
// TODO: mknod
312+
mknod: (path, mode, dev) => {
313+
return FS.handleError(withStackSave(() => {
314+
var pathBuffer = stringToUTF8OnStack(path);
315+
return __wasmfs_mknod(pathBuffer, mode, dev);
316+
}));
317+
},
312318
// TODO: mkdev
313319
rename: (oldPath, newPath) => {
314320
return FS.handleError(withStackSave(() => {

system/lib/wasmfs/js_api.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,14 @@ int _wasmfs_open(char* path, int flags, mode_t mode) {
133133
return err;
134134
}
135135

136+
int _wasmfs_mknod(char* path, mode_t mode, dev_t dev) {
137+
int err = __syscall_mknodat(AT_FDCWD, (intptr_t)path, mode, dev);
138+
if (err == -1) {
139+
return errno;
140+
}
141+
return err;
142+
}
143+
136144
int _wasmfs_unlink(char* path) {
137145
return __syscall_unlinkat(AT_FDCWD, (intptr_t)path, 0);
138146
}

test/fs/test_fs_js_api.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
#include <emscripten/emscripten.h>
22
#include <stdio.h>
3+
#include <sys/stat.h>
4+
#include <assert.h>
5+
#include <fcntl.h>
36

47
int main() {
58
/********** test FS.open() **********/
@@ -130,6 +133,24 @@ int main() {
130133
assert(ex.name === "ErrnoError" && ex.errno === 8 /* EBADF */)
131134
);
132135

136+
/********** test FS.mknod() **********/
137+
EM_ASM(
138+
FS.mknod("mknodtest", 0100000 | 0777); /* S_IFREG | S_RWXU | S_RWXG | S_RWXO */
139+
140+
FS.create("createtest", 0400); /* S_IRUSR */
141+
);
142+
struct stat stats;
143+
stat("mknodtest", &stats);
144+
145+
assert(S_ISREG(stats.st_mode));
146+
assert(stats.st_mode & 0777);
147+
148+
stat("createtest", &stats);
149+
assert(S_ISREG(stats.st_mode));
150+
assert(stats.st_mode & 0400);
151+
152+
remove("mknodtest");
153+
remove("createtest");
133154
remove("testfile");
134155
remove("renametestfile");
135156
remove("readtestfile");

0 commit comments

Comments
 (0)