From 28bd9b142b348d193852c4c5bd7ebe7e7bd24f18 Mon Sep 17 00:00:00 2001 From: Tim Lander Date: Thu, 23 May 2019 13:58:45 +0800 Subject: [PATCH] Revert "Followup to #8438 - fix dependencies problems that PR created (#8464)" This reverts commit 6f080ae534c3c4e2ab0f9a51e313fa6508e9beca. --- src/library_async.js | 8 +- src/library_browser.js | 11 ++- src/library_fs.js | 18 ++--- src/library_lz4.js | 2 +- src/library_path.js | 12 ++- src/library_pipefs.js | 2 +- src/library_proxyfs.js | 2 +- src/library_sdl.js | 7 +- src/library_sockfs.js | 2 +- src/library_syscall.js | 168 ++++++++++++++++++++--------------------- tests/fs/test_mount.c | 8 +- tests/test_core.py | 4 - tests/test_other.py | 13 +--- 13 files changed, 118 insertions(+), 139 deletions(-) diff --git a/src/library_async.js b/src/library_async.js index 5e2e17bfc68a..eadc0eee16b0 100644 --- a/src/library_async.js +++ b/src/library_async.js @@ -196,11 +196,11 @@ mergeInto(LibraryManager.library, { ___async = 1; }, - emscripten_wget__deps: ['emscripten_async_resume', '$PATH_FS', '$Browser'], + emscripten_wget__deps: ['emscripten_async_resume', '$PATH', '$Browser'], emscripten_wget: function(url, file) { var _url = UTF8ToString(url); var _file = UTF8ToString(file); - _file = PATH_FS.resolve(FS.cwd(), _file); + _file = PATH.resolve(FS.cwd(), _file); Module['setAsync'](); Module['noExitRuntime'] = true; var destinationDirectory = PATH.dirname(_file); @@ -406,12 +406,12 @@ mergeInto(LibraryManager.library, { }, true); }, - emscripten_wget__deps: ['$EmterpreterAsync', '$PATH_FS', '$FS', '$Browser'], + emscripten_wget__deps: ['$EmterpreterAsync', '$PATH', '$FS', '$Browser'], emscripten_wget: function(url, file) { EmterpreterAsync.handle(function(resume) { var _url = UTF8ToString(url); var _file = UTF8ToString(file); - _file = PATH_FS.resolve(FS.cwd(), _file); + _file = PATH.resolve(FS.cwd(), _file); var destinationDirectory = PATH.dirname(_file); FS.createPreloadedFile( destinationDirectory, diff --git a/src/library_browser.js b/src/library_browser.js index 74a1dd069392..63f54beabf5f 100644 --- a/src/library_browser.js +++ b/src/library_browser.js @@ -816,7 +816,7 @@ var LibraryBrowser = { } }, - emscripten_async_wget__deps: ['$PATH_FS'], + emscripten_async_wget__deps: ['$PATH'], emscripten_async_wget__proxy: 'sync', emscripten_async_wget__sig: 'viiii', emscripten_async_wget: function(url, file, onload, onerror) { @@ -824,7 +824,7 @@ var LibraryBrowser = { var _url = UTF8ToString(url); var _file = UTF8ToString(file); - _file = PATH_FS.resolve(_file); + _file = PATH.resolve(FS.cwd(), _file); function doCallback(callback) { if (callback) { var stack = stackSave(); @@ -869,7 +869,6 @@ var LibraryBrowser = { }, true /* no need for run dependency, this is async but will not do any prepare etc. step */ ); }, - emscripten_async_wget2__deps: ['$PATH_FS'], emscripten_async_wget2__proxy: 'sync', emscripten_async_wget2__sig: 'iiiiiiiii', emscripten_async_wget2: function(url, file, request, param, arg, onload, onerror, onprogress) { @@ -877,7 +876,7 @@ var LibraryBrowser = { var _url = UTF8ToString(url); var _file = UTF8ToString(file); - _file = PATH_FS.resolve(_file); + _file = PATH.resolve(FS.cwd(), _file); var _request = UTF8ToString(request); var _param = UTF8ToString(param); var index = _file.lastIndexOf('/'); @@ -1514,13 +1513,13 @@ var LibraryBrowser = { return info.awaited; }, - emscripten_get_preloaded_image_data__deps: ['$PATH_FS'], + emscripten_get_preloaded_image_data__deps: ['$PATH'], emscripten_get_preloaded_image_data__proxy: 'sync', emscripten_get_preloaded_image_data__sig: 'iiii', emscripten_get_preloaded_image_data: function(path, w, h) { if ((path | 0) === path) path = UTF8ToString(path); - path = PATH_FS.resolve(path); + path = PATH.resolve(path); var canvas = Module["preloadedImages"][path]; if (canvas) { diff --git a/src/library_fs.js b/src/library_fs.js index 287a0945df52..379aa23dbba9 100644 --- a/src/library_fs.js +++ b/src/library_fs.js @@ -4,7 +4,7 @@ // found in the LICENSE file. mergeInto(LibraryManager.library, { - $FS__deps: ['__setErrNo', '$PATH', '$PATH_FS', '$TTY', '$MEMFS', + $FS__deps: ['__setErrNo', '$PATH', '$TTY', '$MEMFS', #if LibraryManager.has('library_idbfs.js') '$IDBFS', #endif @@ -65,7 +65,7 @@ mergeInto(LibraryManager.library, { // paths // lookupPath: function(path, opts) { - path = PATH_FS.resolve(FS.cwd(), path); + path = PATH.resolve(FS.cwd(), path); opts = opts || {}; if (!path) return { path: '', node: null }; @@ -116,7 +116,7 @@ mergeInto(LibraryManager.library, { var count = 0; while (FS.isLink(current.mode)) { var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); + current_path = PATH.resolve(PATH.dirname(current_path), link); var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); current = lookup.node; @@ -679,7 +679,7 @@ mergeInto(LibraryManager.library, { return FS.mknod(path, mode, dev); }, symlink: function(oldpath, newpath) { - if (!PATH_FS.resolve(oldpath)) { + if (!PATH.resolve(oldpath)) { throw new FS.ErrnoError({{{ cDefine('ENOENT') }}}); } var lookup = FS.lookupPath(newpath, { parent: true }); @@ -720,12 +720,12 @@ mergeInto(LibraryManager.library, { // source must exist var old_node = FS.lookupNode(old_dir, old_name); // old path should not be an ancestor of the new path - var relative = PATH_FS.relative(old_path, new_dirname); + var relative = PATH.relative(old_path, new_dirname); if (relative.charAt(0) !== '.') { throw new FS.ErrnoError({{{ cDefine('EINVAL') }}}); } // new path should not be an ancestor of the old path - relative = PATH_FS.relative(new_path, old_dirname); + relative = PATH.relative(new_path, old_dirname); if (relative.charAt(0) !== '.') { throw new FS.ErrnoError({{{ cDefine('ENOTEMPTY') }}}); } @@ -872,7 +872,7 @@ mergeInto(LibraryManager.library, { if (!link.node_ops.readlink) { throw new FS.ErrnoError({{{ cDefine('EINVAL') }}}); } - return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); + return PATH.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); }, stat: function(path, dontFollow) { var lookup = FS.lookupPath(path, { follow: !dontFollow }); @@ -1506,7 +1506,7 @@ mergeInto(LibraryManager.library, { return path; }, absolutePath: function(relative, base) { - return PATH_FS.resolve(base, relative); + return PATH.resolve(base, relative); }, standardizePath: function(path) { return PATH.normalize(path); @@ -1858,7 +1858,7 @@ mergeInto(LibraryManager.library, { Browser.init(); // XXX perhaps this method should move onto Browser? // TODO we should allow people to just pass in a complete filename instead // of parent and name being that we just join them anyways - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; + var fullname = name ? PATH.resolve(PATH.join2(parent, name)) : parent; var dep = getUniqueRunDependency('cp ' + fullname); // might have several active requests for the same fullname function processData(byteArray) { function finish(byteArray) { diff --git a/src/library_lz4.js b/src/library_lz4.js index b1e1bc676109..30537aabff44 100644 --- a/src/library_lz4.js +++ b/src/library_lz4.js @@ -5,7 +5,7 @@ #if LZ4 mergeInto(LibraryManager.library, { - $LZ4__deps: ['$FS', '$ERRNO_CODES'], + $LZ4__deps: ['$FS'], $LZ4: { DIR_MODE: {{{ cDefine('S_IFDIR') }}} | 511 /* 0777 */, FILE_MODE: {{{ cDefine('S_IFREG') }}} | 511 /* 0777 */, diff --git a/src/library_path.js b/src/library_path.js index 7d29793685a6..c2e750c65ecb 100644 --- a/src/library_path.js +++ b/src/library_path.js @@ -4,6 +4,9 @@ // found in the LICENSE file. mergeInto(LibraryManager.library, { +#if FILESYSTEM == 1 + $PATH__deps: ['$FS'], +#endif $PATH: { // split a filename into [root, dir, basename, ext], unix version // 'root' is just a slash, or nothing. @@ -80,11 +83,6 @@ mergeInto(LibraryManager.library, { join2: function(l, r) { return PATH.normalize(l + '/' + r); }, - }, - // The FS-using parts are split out into a separate object, so simple path - // usage does not require the FS. - $PATH_FS__deps: ['$PATH', '$FS'], - $PATH_FS: { resolve: function() { var resolvedPath = '', resolvedAbsolute = false; @@ -107,8 +105,8 @@ mergeInto(LibraryManager.library, { return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; }, relative: function(from, to) { - from = PATH_FS.resolve(from).substr(1); - to = PATH_FS.resolve(to).substr(1); + from = PATH.resolve(from).substr(1); + to = PATH.resolve(to).substr(1); function trim(arr) { var start = 0; for (; start < arr.length; start++) { diff --git a/src/library_pipefs.js b/src/library_pipefs.js index 55b762f6ed04..02ab6b32e5ac 100644 --- a/src/library_pipefs.js +++ b/src/library_pipefs.js @@ -7,7 +7,7 @@ mergeInto(LibraryManager.library, { $PIPEFS__postset: function() { addAtInit('PIPEFS.root = FS.mount(PIPEFS, {}, null);'); }, - $PIPEFS__deps: ['$FS', '$ERRNO_CODES'], + $PIPEFS__deps: ['$FS'], $PIPEFS: { BUCKET_BUFFER_SIZE: 1024 * 8, // 8KiB Buffer mount: function (mount) { diff --git a/src/library_proxyfs.js b/src/library_proxyfs.js index ed525bf6e779..9528e8a4b80c 100644 --- a/src/library_proxyfs.js +++ b/src/library_proxyfs.js @@ -4,7 +4,7 @@ // found in the LICENSE file. mergeInto(LibraryManager.library, { - $PROXYFS__deps: ['$FS', '$PATH', '$ERRNO_CODES'], + $PROXYFS__deps: ['$FS', '$PATH'], $PROXYFS: { mount: function (mount) { return PROXYFS.createNode(null, '/', mount.opts.fs.lstat(mount.opts.root).mode, 0); diff --git a/src/library_sdl.js b/src/library_sdl.js index 55f5b250a1ca..fa04ab4f6dd0 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -2225,7 +2225,7 @@ var LibrarySDL = { return flags; // We support JPG, PNG, TIF because browsers do }, - IMG_Load_RW__deps: ['SDL_LockSurface', 'SDL_FreeRW', '$PATH_FS'], + IMG_Load_RW__deps: ['SDL_LockSurface', 'SDL_FreeRW'], IMG_Load_RW__proxy: 'sync', IMG_Load_RW__sig: 'iii', IMG_Load_RW: function(rwopsID, freeSrc) { @@ -2280,7 +2280,7 @@ var LibrarySDL = { } if (!raw) { - filename = PATH_FS.resolve(filename); + filename = PATH.resolve(filename); var raw = Module["preloadedImages"][filename]; if (!raw) { if (raw === null) err('Trying to reuse preloaded image, but freePreloadedMediaOnUse is set!'); @@ -2739,7 +2739,6 @@ var LibrarySDL = { return 1; }, - Mix_LoadWAV_RW__deps: ['PATH_FS'], Mix_LoadWAV_RW__proxy: 'sync', Mix_LoadWAV_RW__sig: 'iii', Mix_LoadWAV_RW: function(rwopsID, freesrc) { @@ -2775,7 +2774,7 @@ var LibrarySDL = { var bytes; if (rwops.filename !== undefined) { - filename = PATH_FS.resolve(rwops.filename); + filename = PATH.resolve(rwops.filename); var raw = Module["preloadedAudios"][filename]; if (!raw) { if (raw === null) err('Trying to reuse preloaded audio, but freePreloadedMediaOnUse is set!'); diff --git a/src/library_sockfs.js b/src/library_sockfs.js index 00c66779e6f0..012ac8786abc 100644 --- a/src/library_sockfs.js +++ b/src/library_sockfs.js @@ -7,7 +7,7 @@ mergeInto(LibraryManager.library, { $SOCKFS__postset: function() { addAtInit('SOCKFS.root = FS.mount(SOCKFS, {}, null);'); }, - $SOCKFS__deps: ['$FS', '$ERRNO_CODES'], // TODO: avoid ERRNO_CODES + $SOCKFS__deps: ['$FS'], $SOCKFS: { mount: function(mount) { // If Module['websocket'] has already been defined (e.g. for configuring diff --git a/src/library_syscall.js b/src/library_syscall.js index 1c788a639935..99750de870fc 100644 --- a/src/library_syscall.js +++ b/src/library_syscall.js @@ -4,9 +4,9 @@ // found in the LICENSE file. var SyscallsLibrary = { - $SYSCALLS__deps: ['$PATH', -#if FILESYSTEM && SYSCALLS_REQUIRE_FILESYSTEM - '$FS', + $SYSCALLS__deps: [ +#if SYSCALLS_REQUIRE_FILESYSTEM + '$FS', '$ERRNO_CODES', '$PATH', #endif #if SYSCALL_DEBUG '$ERRNO_MESSAGES' @@ -30,7 +30,7 @@ var SyscallsLibrary = { dir = FS.cwd(); } else { var dirstream = FS.getStream(dirfd); - if (!dirstream) throw new FS.ErrnoError({{{ cDefine('EBADF') }}}); + if (!dirstream) throw new FS.ErrnoError(ERRNO_CODES.EBADF); dir = dirstream.path; } path = PATH.join2(dir, path); @@ -44,7 +44,7 @@ var SyscallsLibrary = { } catch (e) { if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { // an error occurred while trying to look up the path; we should just report ENOTDIR - return -{{{ cDefine('ENOTDIR') }}}; + return -ERRNO_CODES.ENOTDIR; } throw e; } @@ -90,13 +90,13 @@ var SyscallsLibrary = { case {{{ cDefine('S_IFIFO') }}}: case {{{ cDefine('S_IFSOCK') }}}: break; - default: return -{{{ cDefine('EINVAL') }}}; + default: return -ERRNO_CODES.EINVAL; } FS.mknod(path, mode, dev); return 0; }, doReadlink: function(path, buf, bufsize) { - if (bufsize <= 0) return -{{{ cDefine('EINVAL') }}}; + if (bufsize <= 0) return -ERRNO_CODES.EINVAL; var ret = FS.readlink(path); var len = Math.min(bufsize, lengthBytesUTF8(ret)); @@ -111,7 +111,7 @@ var SyscallsLibrary = { doAccess: function(path, amode) { if (amode & ~{{{ cDefine('S_IRWXO') }}}) { // need a valid mode - return -{{{ cDefine('EINVAL') }}}; + return -ERRNO_CODES.EINVAL; } var node; var lookup = FS.lookupPath(path, { follow: true }); @@ -121,7 +121,7 @@ var SyscallsLibrary = { if (amode & {{{ cDefine('W_OK') }}}) perms += 'w'; if (amode & {{{ cDefine('X_OK') }}}) perms += 'x'; if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { - return -{{{ cDefine('EACCES') }}}; + return -ERRNO_CODES.EACCES; } return 0; }, @@ -192,12 +192,31 @@ var SyscallsLibrary = { #if SYSCALLS_REQUIRE_FILESYSTEM getStreamFromFD: function() { var stream = FS.getStream(SYSCALLS.get()); - if (!stream) throw new FS.ErrnoError({{{ cDefine('EBADF') }}}); + if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF); #if SYSCALL_DEBUG err(' (stream: "' + stream.path + '")'); #endif return stream; }, + getSocketFromFD: function() { + var socket = SOCKFS.getSocket(SYSCALLS.get()); + if (!socket) throw new FS.ErrnoError(ERRNO_CODES.EBADF); +#if SYSCALL_DEBUG + err(' (socket: "' + socket.path + '")'); +#endif + return socket; + }, + getSocketAddress: function(allowNull) { + var addrp = SYSCALLS.get(), addrlen = SYSCALLS.get(); + if (allowNull && addrp === 0) return null; + var info = __read_sockaddr(addrp, addrlen); + if (info.errno) throw new FS.ErrnoError(info.errno); + info.addr = DNS.lookup_addr(info.addr) || info.addr; +#if SYSCALL_DEBUG + err(' (socketaddress: "' + [info.addr, info.port] + '")'); +#endif + return info; + }, #endif // SYSCALLS_REQUIRE_FILESYSTEM get64: function() { var low = SYSCALLS.get(), high = SYSCALLS.get(); @@ -259,7 +278,7 @@ var SyscallsLibrary = { }, __syscall9: function(which, varargs) { // link var oldpath = SYSCALLS.get(), newpath = SYSCALLS.get(); - return -{{{ cDefine('EMLINK') }}}; // no hardlinks for us + return -ERRNO_CODES.EMLINK; // no hardlinks for us }, __syscall10: function(which, varargs) { // unlink var path = SYSCALLS.getStr(); @@ -285,7 +304,7 @@ var SyscallsLibrary = { return PROCINFO.pid; }, __syscall29: function(which, varargs) { // pause - return -{{{ cDefine('EINTR') }}}; // we can't pause + return -ERRNO_CODES.EINTR; // we can't pause }, __syscall33: function(which, varargs) { // access var path = SYSCALLS.getStr(), amode = SYSCALLS.get(); @@ -293,7 +312,7 @@ var SyscallsLibrary = { }, __syscall34: function(which, varargs) { // nice var inc = SYSCALLS.get(); - return -{{{ cDefine('EPERM') }}}; // no meaning to nice for our single-process environment + return -ERRNO_CODES.EPERM; // no meaning to nice for our single-process environment }, __syscall36: function(which, varargs) { // sync return 0; @@ -321,7 +340,7 @@ var SyscallsLibrary = { var fdPtr = SYSCALLS.get(); if (fdPtr == 0) { - throw new FS.ErrnoError({{{ cDefine('EFAULT') }}}); + throw new FS.ErrnoError(ERRNO_CODES.EFAULT); } var res = PIPEFS.createPipe(); @@ -332,7 +351,7 @@ var SyscallsLibrary = { return 0; }, __syscall51: function(which, varargs) { // acct - return -{{{ cDefine('ENOSYS') }}}; // unsupported features + return -ERRNO_CODES.ENOSYS; // unsupported features }, __syscall54: function(which, varargs) { // ioctl #if SYSCALLS_REQUIRE_FILESYSTEM == 0 @@ -345,7 +364,7 @@ var SyscallsLibrary = { switch (op) { case {{{ cDefine('TCGETA') }}}: case {{{ cDefine('TCGETS') }}}: { - if (!stream.tty) return -{{{ cDefine('ENOTTY') }}}; + if (!stream.tty) return -ERRNO_CODES.ENOTTY; #if SYSCALL_DEBUG err('warning: not filling tio struct'); #endif @@ -357,18 +376,18 @@ var SyscallsLibrary = { case {{{ cDefine('TCSETS') }}}: case {{{ cDefine('TCSETSW') }}}: case {{{ cDefine('TCSETSF') }}}: { - if (!stream.tty) return -{{{ cDefine('ENOTTY') }}}; + if (!stream.tty) return -ERRNO_CODES.ENOTTY; return 0; // no-op, not actually adjusting terminal settings } case {{{ cDefine('TIOCGPGRP') }}}: { - if (!stream.tty) return -{{{ cDefine('ENOTTY') }}}; + if (!stream.tty) return -ERRNO_CODES.ENOTTY; var argp = SYSCALLS.get(); {{{ makeSetValue('argp', 0, 0, 'i32') }}}; return 0; } case {{{ cDefine('TIOCSPGRP') }}}: { - if (!stream.tty) return -{{{ cDefine('ENOTTY') }}}; - return -{{{ cDefine('EINVAL') }}}; // not supported + if (!stream.tty) return -ERRNO_CODES.ENOTTY; + return -ERRNO_CODES.EINVAL; // not supported } case {{{ cDefine('FIONREAD') }}}: { var argp = SYSCALLS.get(); @@ -377,14 +396,14 @@ var SyscallsLibrary = { case {{{ cDefine('TIOCGWINSZ') }}}: { // TODO: in theory we should write to the winsize struct that gets // passed in, but for now musl doesn't read anything on it - if (!stream.tty) return -{{{ cDefine('ENOTTY') }}}; + if (!stream.tty) return -ERRNO_CODES.ENOTTY; return 0; } case {{{ cDefine('TIOCSWINSZ') }}}: { // TODO: technically, this ioctl call should change the window size. // but, since emscripten doesn't have any concept of a terminal window // yet, we'll just silently throw it away as we do TIOCGWINSZ - if (!stream.tty) return -{{{ cDefine('ENOTTY') }}}; + if (!stream.tty) return -ERRNO_CODES.ENOTTY; return 0; } default: abort('bad ioctl syscall ' + op); @@ -394,8 +413,8 @@ var SyscallsLibrary = { __syscall57__deps: ['$PROCINFO'], __syscall57: function(which, varargs) { // setpgid var pid = SYSCALLS.get(), pgid = SYSCALLS.get(); - if (pid && pid !== PROCINFO.pid) return -{{{ cDefine('ESRCH') }}}; - if (pgid && pgid !== PROCINFO.pgid) return -{{{ cDefine('EPERM') }}}; + if (pid && pid !== PROCINFO.pid) return -ERRNO_CODES.ESRCH; + if (pgid && pgid !== PROCINFO.pgid) return -ERRNO_CODES.EPERM; return 0; }, __syscall60: function(which, varargs) { // umask @@ -469,34 +488,13 @@ var SyscallsLibrary = { return 0; }, __syscall97: function(which, varargs) { // setpriority - return -{{{ cDefine('EPERM') }}}; + return -ERRNO_CODES.EPERM; }, __syscall102__deps: ['$SOCKFS', '$DNS', '_read_sockaddr', '_write_sockaddr'], __syscall102: function(which, varargs) { // socketcall var call = SYSCALLS.get(), socketvararg = SYSCALLS.get(); // socketcalls pass the rest of the arguments in a struct SYSCALLS.varargs = socketvararg; - - var getSocketFromFD = function() { - var socket = SOCKFS.getSocket(SYSCALLS.get()); - if (!socket) throw new FS.ErrnoError({{{ cDefine('EBADF') }}}); -#if SYSCALL_DEBUG - err(' (socket: "' + socket.path + '")'); -#endif - return socket; - }; - var getSocketAddress = function(allowNull) { - var addrp = SYSCALLS.get(), addrlen = SYSCALLS.get(); - if (allowNull && addrp === 0) return null; - var info = __read_sockaddr(addrp, addrlen); - if (info.errno) throw new FS.ErrnoError(info.errno); - info.addr = DNS.lookup_addr(info.addr) || info.addr; -#if SYSCALL_DEBUG - err(' (socketaddress: "' + [info.addr, info.port] + '")'); -#endif - return info; - }; - switch (call) { case 1: { // socket var domain = SYSCALLS.get(), type = SYSCALLS.get(), protocol = SYSCALLS.get(); @@ -507,22 +505,22 @@ var SyscallsLibrary = { return sock.stream.fd; } case 2: { // bind - var sock = getSocketFromFD(), info = getSocketAddress(); + var sock = SYSCALLS.getSocketFromFD(), info = SYSCALLS.getSocketAddress(); sock.sock_ops.bind(sock, info.addr, info.port); return 0; } case 3: { // connect - var sock = getSocketFromFD(), info = getSocketAddress(); + var sock = SYSCALLS.getSocketFromFD(), info = SYSCALLS.getSocketAddress(); sock.sock_ops.connect(sock, info.addr, info.port); return 0; } case 4: { // listen - var sock = getSocketFromFD(), backlog = SYSCALLS.get(); + var sock = SYSCALLS.getSocketFromFD(), backlog = SYSCALLS.get(); sock.sock_ops.listen(sock, backlog); return 0; } case 5: { // accept - var sock = getSocketFromFD(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); + var sock = SYSCALLS.getSocketFromFD(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); var newsock = sock.sock_ops.accept(sock); if (addr) { var res = __write_sockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport); @@ -533,7 +531,7 @@ var SyscallsLibrary = { return newsock.stream.fd; } case 6: { // getsockname - var sock = getSocketFromFD(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); + var sock = SYSCALLS.getSocketFromFD(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); // TODO: sock.saddr should never be undefined, see TODO in websocket_sock_ops.getname var res = __write_sockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || '0.0.0.0'), sock.sport); #if ASSERTIONS @@ -542,9 +540,9 @@ var SyscallsLibrary = { return 0; } case 7: { // getpeername - var sock = getSocketFromFD(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); + var sock = SYSCALLS.getSocketFromFD(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); if (!sock.daddr) { - return -{{{ cDefine('ENOTCONN') }}}; // The socket is not connected. + return -ERRNO_CODES.ENOTCONN; // The socket is not connected. } var res = __write_sockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport); #if ASSERTIONS @@ -553,7 +551,7 @@ var SyscallsLibrary = { return 0; } case 11: { // sendto - var sock = getSocketFromFD(), message = SYSCALLS.get(), length = SYSCALLS.get(), flags = SYSCALLS.get(), dest = getSocketAddress(true); + var sock = SYSCALLS.getSocketFromFD(), message = SYSCALLS.get(), length = SYSCALLS.get(), flags = SYSCALLS.get(), dest = SYSCALLS.getSocketAddress(true); if (!dest) { // send, no address provided return FS.write(sock.stream, {{{ heapAndOffset('HEAP8', 'message') }}}, length); @@ -563,7 +561,7 @@ var SyscallsLibrary = { } } case 12: { // recvfrom - var sock = getSocketFromFD(), buf = SYSCALLS.get(), len = SYSCALLS.get(), flags = SYSCALLS.get(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); + var sock = SYSCALLS.getSocketFromFD(), buf = SYSCALLS.get(), len = SYSCALLS.get(), flags = SYSCALLS.get(), addr = SYSCALLS.get(), addrlen = SYSCALLS.get(); var msg = sock.sock_ops.recvmsg(sock, len); if (!msg) return 0; // socket is closed if (addr) { @@ -576,10 +574,10 @@ var SyscallsLibrary = { return msg.buffer.byteLength; } case 14: { // setsockopt - return -{{{ cDefine('ENOPROTOOPT') }}}; // The option is unknown at the level indicated. + return -ERRNO_CODES.ENOPROTOOPT; // The option is unknown at the level indicated. } case 15: { // getsockopt - var sock = getSocketFromFD(), level = SYSCALLS.get(), optname = SYSCALLS.get(), optval = SYSCALLS.get(), optlen = SYSCALLS.get(); + var sock = SYSCALLS.getSocketFromFD(), level = SYSCALLS.get(), optname = SYSCALLS.get(), optval = SYSCALLS.get(), optlen = SYSCALLS.get(); // Minimal getsockopt aimed at resolving https://github.com/emscripten-core/emscripten/issues/2211 // so only supports SOL_SOCKET with SO_ERROR. if (level === {{{ cDefine('SOL_SOCKET') }}}) { @@ -590,10 +588,10 @@ var SyscallsLibrary = { return 0; } } - return -{{{ cDefine('ENOPROTOOPT') }}}; // The option is unknown at the level indicated. + return -ERRNO_CODES.ENOPROTOOPT; // The option is unknown at the level indicated. } case 16: { // sendmsg - var sock = getSocketFromFD(), message = SYSCALLS.get(), flags = SYSCALLS.get(); + var sock = SYSCALLS.getSocketFromFD(), message = SYSCALLS.get(), flags = SYSCALLS.get(); var iov = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iov, '*') }}}; var num = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iovlen, 'i32') }}}; // read the address and port to send to @@ -624,7 +622,7 @@ var SyscallsLibrary = { return sock.sock_ops.sendmsg(sock, view, 0, total, addr, port); } case 17: { // recvmsg - var sock = getSocketFromFD(), message = SYSCALLS.get(), flags = SYSCALLS.get(); + var sock = SYSCALLS.getSocketFromFD(), message = SYSCALLS.get(), flags = SYSCALLS.get(); var iov = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iov, 'i8*') }}}; var num = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iovlen, 'i32') }}}; // get the total amount of data we can read across all arrays @@ -683,7 +681,7 @@ var SyscallsLibrary = { } }, __syscall104: function(which, varargs) { // setitimer - return -{{{ cDefine('ENOSYS') }}}; // unsupported feature + return -ERRNO_CODES.ENOSYS; // unsupported feature }, __syscall114: function(which, varargs) { // wait4 abort('cannot wait on child processes'); @@ -703,7 +701,7 @@ var SyscallsLibrary = { } mount.type.syncfs(mount, false, function(err) { if (err) { - resume(function() { return -{{{ cDefine('EIO') }}} }); + resume(function() { return -ERRNO_CODES.EIO }); return; } resume(function() { return 0 }); @@ -714,11 +712,11 @@ var SyscallsLibrary = { #endif }, __syscall121: function(which, varargs) { // setdomainname - return -{{{ cDefine('EPERM') }}}; + return -ERRNO_CODES.EPERM; }, __syscall122: function(which, varargs) { // uname var buf = SYSCALLS.get(); - if (!buf) return -{{{ cDefine('EFAULT') }}} + if (!buf) return -ERRNO_CODES.EFAULT var layout = {{{ JSON.stringify(C_STRUCTS.utsname) }}}; var copyString = function(element, value) { var offset = layout[element]; @@ -737,7 +735,7 @@ var SyscallsLibrary = { __syscall132__deps: ['$PROCINFO'], __syscall132: function(which, varargs) { // getpgid var pid = SYSCALLS.get(); - if (pid && pid !== PROCINFO.pid) return -{{{ cDefine('ESRCH') }}}; + if (pid && pid !== PROCINFO.pid) return -ERRNO_CODES.ESRCH; return PROCINFO.pgid; }, __syscall133: function(which, varargs) { // fchdir @@ -751,7 +749,7 @@ var SyscallsLibrary = { // Can't handle 64-bit integers if (!(offset_high == -1 && offset_low < 0) && !(offset_high == 0 && offset_low >= 0)) { - return -{{{ cDefine('EOVERFLOW') }}}; + return -ERRNO_CODES.EOVERFLOW; } var offset = offset_low; FS.llseek(stream, offset, whence); @@ -810,7 +808,7 @@ var SyscallsLibrary = { } var stream = FS.getStream(fd); - if (!stream) throw new FS.ErrnoError({{{ cDefine('EBADF') }}}); + if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF); var flags = SYSCALLS.DEFAULT_POLLMASK; @@ -894,7 +892,7 @@ var SyscallsLibrary = { __syscall147__deps: ['$PROCINFO'], __syscall147: function(which, varargs) { // getsid var pid = SYSCALLS.get(); - if (pid && pid !== PROCINFO.pid) return -{{{ cDefine('ESRCH') }}}; + if (pid && pid !== PROCINFO.pid) return -ERRNO_CODES.ESRCH; return PROCINFO.sid; }, __syscall148: function(which, varargs) { // fdatasync @@ -911,7 +909,7 @@ var SyscallsLibrary = { return 0; }, __syscall163: function(which, varargs) { // mremap - return -{{{ cDefine('ENOMEM') }}}; // never succeed + return -ERRNO_CODES.ENOMEM; // never succeed }, __syscall168: function(which, varargs) { // poll var fds = SYSCALLS.get(), nfds = SYSCALLS.get(), timeout = SYSCALLS.get(); @@ -950,10 +948,10 @@ var SyscallsLibrary = { }, __syscall183: function(which, varargs) { // getcwd var buf = SYSCALLS.get(), size = SYSCALLS.get(); - if (size === 0) return -{{{ cDefine('EINVAL') }}}; + if (size === 0) return -ERRNO_CODES.EINVAL; var cwd = FS.cwd(); var cwdLengthInBytes = lengthBytesUTF8(cwd); - if (size < cwdLengthInBytes + 1) return -{{{ cDefine('ERANGE') }}}; + if (size < cwdLengthInBytes + 1) return -ERRNO_CODES.ERANGE; stringToUTF8(cwd, buf, size); return buf; }, @@ -975,12 +973,12 @@ var SyscallsLibrary = { var allocated = false; if (fd === -1) { ptr = _memalign(PAGE_SIZE, len); - if (!ptr) return -{{{ cDefine('ENOMEM') }}}; + if (!ptr) return -ERRNO_CODES.ENOMEM; _memset(ptr, 0, len); allocated = true; } else { var info = FS.getStream(fd); - if (!info) return -{{{ cDefine('EBADF') }}}; + if (!info) return -ERRNO_CODES.EBADF; var res = FS.mmap(info, HEAPU8, addr, len, off, prot, flags); ptr = res.ptr; allocated = res.allocated; @@ -1042,12 +1040,12 @@ var SyscallsLibrary = { __syscall213: '__syscall214', // setuid32 __syscall214: function(which, varargs) { // setgid32 var uid = SYSCALLS.get(); - if (uid !== 0) return -{{{ cDefine('EPERM') }}}; + if (uid !== 0) return -ERRNO_CODES.EPERM; return 0; }, __syscall205: function(which, varargs) { // getgroups32 var size = SYSCALLS.get(), list = SYSCALLS.get(); - if (size < 1) return -{{{ cDefine('EINVAL') }}}; + if (size < 1) return -ERRNO_CODES.EINVAL; {{{ makeSetValue('list', '0', '0', 'i32') }}}; return 1; }, @@ -1055,7 +1053,7 @@ var SyscallsLibrary = { __syscall208: '__syscall210', // setresuid32 __syscall210: function(which, varargs) { // setresgid32 var ruid = SYSCALLS.get(), euid = SYSCALLS.get(), suid = SYSCALLS.get(); - if (euid !== 0) return -{{{ cDefine('EPERM') }}}; + if (euid !== 0) return -ERRNO_CODES.EPERM; return 0; }, __syscall209__sig: 'iii', @@ -1071,7 +1069,7 @@ var SyscallsLibrary = { return 0; }, __syscall218: function(which, varargs) { // mincore - return -{{{ cDefine('ENOSYS') }}}; // unsupported feature + return -ERRNO_CODES.ENOSYS; // unsupported feature }, __syscall219: function(which, varargs) { // madvise return 0; // advice is welcome, but ignored @@ -1119,7 +1117,7 @@ var SyscallsLibrary = { case {{{ cDefine('F_DUPFD') }}}: { var arg = SYSCALLS.get(); if (arg < 0) { - return -{{{ cDefine('EINVAL') }}}; + return -ERRNO_CODES.EINVAL; } var newStream; newStream = FS.open(stream.path, stream.flags, 0, arg); @@ -1153,16 +1151,16 @@ var SyscallsLibrary = { return 0; // Pretend that the locking is successful. case {{{ cDefine('F_GETOWN_EX') }}}: case {{{ cDefine('F_SETOWN') }}}: - return -{{{ cDefine('EINVAL') }}}; // These are for sockets. We don't have them fully implemented yet. + return -ERRNO_CODES.EINVAL; // These are for sockets. We don't have them fully implemented yet. case {{{ cDefine('F_GETOWN') }}}: // musl trusts getown return values, due to a bug where they must be, as they overlap with errors. just return -1 here, so fnctl() returns that, and we set errno ourselves. - ___setErrNo({{{ cDefine('EINVAL') }}}); + ___setErrNo(ERRNO_CODES.EINVAL); return -1; default: { #if SYSCALL_DEBUG err('warning: fctl64 unrecognized command ' + cmd); #endif - return -{{{ cDefine('EINVAL') }}}; + return -ERRNO_CODES.EINVAL; } } #endif // SYSCALLS_REQUIRE_FILESYSTEM @@ -1271,7 +1269,7 @@ var SyscallsLibrary = { return 0; }, __syscall303: function(which, varargs) { // linkat - return -{{{ cDefine('EMLINK') }}}; // no hardlinks for us + return -ERRNO_CODES.EMLINK; // no hardlinks for us }, __syscall304: function(which, varargs) { // symlinkat #if SYSCALL_DEBUG @@ -1314,7 +1312,7 @@ var SyscallsLibrary = { return SYSCALLS.doAccess(path, amode); }, __syscall308: function(which, varargs) { // pselect - return -{{{ cDefine('ENOSYS') }}}; // unsupported feature + return -ERRNO_CODES.ENOSYS; // unsupported feature }, __syscall320: function(which, varargs) { // utimensat #if SYSCALL_DEBUG @@ -1351,11 +1349,11 @@ var SyscallsLibrary = { #if ASSERTIONS assert(!flags); #endif - if (old.fd === suggestFD) return -{{{ cDefine('EINVAL') }}}; + if (old.fd === suggestFD) return -ERRNO_CODES.EINVAL; return SYSCALLS.doDup(old.path, old.flags, suggestFD); }, __syscall331: function(which, varargs) { // pipe2 - return -{{{ cDefine('ENOSYS') }}}; // unsupported feature + return -ERRNO_CODES.ENOSYS; // unsupported feature }, __syscall333: function(which, varargs) { // preadv #if SYSCALL_DEBUG diff --git a/tests/fs/test_mount.c b/tests/fs/test_mount.c index 6cbc9668483f..8ad52fbfcbac 100644 --- a/tests/fs/test_mount.c +++ b/tests/fs/test_mount.c @@ -27,7 +27,7 @@ int main() { } catch (e) { ex = e; } - assert(ex instanceof FS.ErrnoError && ex.errno === 2); // ENOENT + assert(ex instanceof FS.ErrnoError && ex.errno === ERRNO_CODES.ENOENT); // mount to an existing mountpoint try { @@ -35,7 +35,7 @@ int main() { } catch (e) { ex = e; } - assert(ex instanceof FS.ErrnoError && ex.errno === 16); // EBUSY + assert(ex instanceof FS.ErrnoError && ex.errno === ERRNO_CODES.EBUSY); // unmount FS.unmount('/working'); @@ -46,7 +46,7 @@ int main() { } catch (e) { ex = e; } - assert(ex instanceof FS.ErrnoError && ex.errno === 22); // EINVAL + assert(ex instanceof FS.ErrnoError && ex.errno === ERRNO_CODES.EINVAL); // try to read the file from the old mount try { @@ -54,7 +54,7 @@ int main() { } catch (e) { ex = e; } - assert(ex instanceof FS.ErrnoError && ex.errno === 2); // ENOENT + assert(ex instanceof FS.ErrnoError && ex.errno === ERRNO_CODES.ENOENT); // check the safe file var contents = FS.readFile('/safe.txt', { encoding: 'utf8' }); diff --git a/tests/test_core.py b/tests/test_core.py index 889b2c401f69..92d45b172956 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -5006,8 +5006,6 @@ def test_unistd_sleep(self): self.do_run(src, expected) def test_unistd_io(self): - self.set_setting('INCLUDE_FULL_LIBRARY', 1) # uses constants from ERRNO_CODES - self.set_setting('ERROR_ON_UNDEFINED_SYMBOLS', 0) # avoid errors when linking in full library self.clear() orig_compiler_opts = Building.COMPILER_TEST_OPTS[:] src = open(path_from_root('tests', 'unistd', 'io.c')).read() @@ -7520,8 +7518,6 @@ def test_no_declare_asm_module_exports(self): @no_emterpreter @no_wasm_backend('MINIMAL_RUNTIME not yet available in Wasm backend') def test_minimal_runtime_no_declare_asm_module_exports(self): - if self.get_setting('SAFE_HEAP'): - return self.skipTest('TODO: SAFE_HEAP in minimal runtime') self.banned_js_engines = [V8_ENGINE, SPIDERMONKEY_ENGINE] # TODO: Support for non-Node.js shells has not yet been added to MINIMAL_RUNTIME self.set_setting('DECLARE_ASM_MODULE_EXPORTS', 0) self.set_setting('BINARYEN_ASYNC_COMPILATION', 0) diff --git a/tests/test_other.py b/tests/test_other.py index 49f72fe6eb70..f87572220615 100644 --- a/tests/test_other.py +++ b/tests/test_other.py @@ -4547,17 +4547,6 @@ def test_libc_files_without_syscalls(self): }''') run_process([PYTHON, EMCC, 'src.cpp']) - def test_syscall_without_filesystem(self): - # a program which includes a non-trivial syscall, but disables the filesystem. - create_test_file('src.c', r''' -#include -#include -extern int __syscall295(int); -int main() { - return __syscall295(0); -}''') - run_process([PYTHON, EMCC, 'src.c', '-s', 'NO_FILESYSTEM=1']) - def test_dashE(self): create_test_file('src.cpp', r'''#include __EMSCRIPTEN_major__ __EMSCRIPTEN_minor__ __EMSCRIPTEN_tiny__ EMSCRIPTEN_KEEPALIVE @@ -8040,7 +8029,7 @@ def run(*args): 0, [], [], 8, 0, 0, 0) # noqa; totally empty! # we don't metadce with linkable code! other modules may want stuff run(['-O3', '-s', 'MAIN_MODULE=1'], - 1542, [], [], 226403, 30, 95, None) # noqa; don't compare the # of functions in a main module, which changes a lot + 1541, [], [], 226403, 30, 95, None) # noqa; don't compare the # of functions in a main module, which changes a lot # ensures runtime exports work, even with metadce def test_extra_runtime_exports(self):