| var SYSCALLS = { | |
| DEFAULT_POLLMASK: 5, | |
| calculateAt(dirfd, path, allowEmpty) { | |
| if (PATH.isAbs(path)) { | |
| return path | |
| } | |
| var dir; | |
| if (dirfd === -100) { | |
| dir = FS.cwd() | |
| } else { | |
| var dirstream = SYSCALLS.getStreamFromFD(dirfd); | |
| dir = dirstream.path | |
| } | |
| if (path.length == 0) { | |
| if (!allowEmpty) { | |
| throw new FS.ErrnoError(44) | |
| } | |
| return dir | |
| } | |
| return dir + "/" + path | |
| }, | |
| writeStat(buf, stat) { | |
| HEAPU32[buf >> 2] = stat.dev; | |
| HEAPU32[buf + 4 >> 2] = stat.mode; | |
| HEAPU32[buf + 8 >> 2] = stat.nlink; | |
| HEAPU32[buf + 12 >> 2] = stat.uid; | |
| HEAPU32[buf + 16 >> 2] = stat.gid; | |
| HEAPU32[buf + 20 >> 2] = stat.rdev; | |
| HEAP64[buf + 24 >> 3] = BigInt(stat.size); | |
| HEAP32[buf + 32 >> 2] = 4096; | |
| HEAP32[buf + 36 >> 2] = stat.blocks; | |
| var atime = stat.atime.getTime(); | |
| var mtime = stat.mtime.getTime(); | |
| var ctime = stat.ctime.getTime(); | |
| HEAP64[buf + 40 >> 3] = BigInt(Math.floor(atime / 1e3)); | |
| HEAPU32[buf + 48 >> 2] = atime % 1e3 * 1e3 * 1e3; | |
| HEAP64[buf + 56 >> 3] = BigInt(Math.floor(mtime / 1e3)); | |
| HEAPU32[buf + 64 >> 2] = mtime % 1e3 * 1e3 * 1e3; | |
| HEAP64[buf + 72 >> 3] = BigInt(Math.floor(ctime / 1e3)); | |
| HEAPU32[buf + 80 >> 2] = ctime % 1e3 * 1e3 * 1e3; | |
| HEAP64[buf + 88 >> 3] = BigInt(stat.ino); | |
| return 0 | |
| }, | |
| writeStatFs(buf, stats) { | |
| HEAPU32[buf + 4 >> 2] = stats.bsize; | |
| HEAPU32[buf + 60 >> 2] = stats.bsize; | |
| HEAP64[buf + 8 >> 3] = BigInt(stats.blocks); | |
| HEAP64[buf + 16 >> 3] = BigInt(stats.bfree); | |
| HEAP64[buf + 24 >> 3] = BigInt(stats.bavail); | |
| HEAP64[buf + 32 >> 3] = BigInt(stats.files); | |
| HEAP64[buf + 40 >> 3] = BigInt(stats.ffree); | |
| HEAPU32[buf + 48 >> 2] = stats.fsid; | |
| HEAPU32[buf + 64 >> 2] = stats.flags; | |
| HEAPU32[buf + 56 >> 2] = stats.namelen | |
| }, | |
| doMsync(addr, stream, len, flags, offset) { | |
| if (!FS.isFile(stream.node.mode)) { | |
| throw new FS.ErrnoError(43) | |
| } | |
| if (flags & 2) { | |
| return 0 | |
| } | |
| var buffer = HEAPU8.slice(addr, addr + len); | |
| FS.msync(stream, buffer, offset, len, flags) | |
| }, | |
| getStreamFromFD(fd) { | |
| var stream = FS.getStreamChecked(fd); | |
| return stream | |
| }, | |
| varargs: undefined, | |
| getStr(ptr) { | |
| var ret = UTF8ToString(ptr); | |
| return ret | |
| } | |
| }; | |
| var ___syscall__newselect = function(nfds, readfds, writefds, exceptfds, timeout) { | |
| try { | |
| var total = 0; | |
| var srcReadLow = readfds ? HEAP32[readfds >> 2] : 0, | |
| srcReadHigh = readfds ? HEAP32[readfds + 4 >> 2] : 0; | |
| var srcWriteLow = writefds ? HEAP32[writefds >> 2] : 0, | |
| srcWriteHigh = writefds ? HEAP32[writefds + 4 >> 2] : 0; | |
| var srcExceptLow = exceptfds ? HEAP32[exceptfds >> 2] : 0, | |
| srcExceptHigh = exceptfds ? HEAP32[exceptfds + 4 >> 2] : 0; | |
| var dstReadLow = 0, | |
| dstReadHigh = 0; | |
| var dstWriteLow = 0, | |
| dstWriteHigh = 0; | |
| var dstExceptLow = 0, | |
| dstExceptHigh = 0; | |
| var allLow = (readfds ? HEAP32[readfds >> 2] : 0) | (writefds ? HEAP32[writefds >> 2] : 0) | (exceptfds ? HEAP32[exceptfds >> 2] : 0); | |
| var allHigh = (readfds ? HEAP32[readfds + 4 >> 2] : 0) | (writefds ? HEAP32[writefds + 4 >> 2] : 0) | (exceptfds ? HEAP32[exceptfds + 4 >> 2] : 0); | |
| var check = (fd, low, high, val) => fd < 32 ? low & val : high & val; | |
| for (var fd = 0; fd < nfds; fd++) { | |
| var mask = 1 << fd % 32; | |
| if (!check(fd, allLow, allHigh, mask)) { | |
| continue | |
| } | |
| var stream = SYSCALLS.getStreamFromFD(fd); | |
| var flags = SYSCALLS.DEFAULT_POLLMASK; | |
| if (stream.stream_ops.poll) { | |
| var timeoutInMillis = -1; | |
| if (timeout) { | |
| var tv_sec = readfds ? HEAP32[timeout >> 2] : 0, | |
| tv_usec = readfds ? HEAP32[timeout + 4 >> 2] : 0; | |
| timeoutInMillis = (tv_sec + tv_usec / 1e6) * 1e3 | |
| } | |
| flags = stream.stream_ops.poll(stream, timeoutInMillis) | |
| } | |
| if (flags & 1 && check(fd, srcReadLow, srcReadHigh, mask)) { | |
| fd < 32 ? dstReadLow = dstReadLow | mask : dstReadHigh = dstReadHigh | mask; | |
| total++ | |
| } | |
| if (flags & 4 && check(fd, srcWriteLow, srcWriteHigh, mask)) { | |
| fd < 32 ? dstWriteLow = dstWriteLow | mask : dstWriteHigh = dstWriteHigh | mask; | |
| total++ | |
| } | |
| if (flags & 2 && check(fd, srcExceptLow, srcExceptHigh, mask)) { | |
| fd < 32 ? dstExceptLow = dstExceptLow | mask : dstExceptHigh = dstExceptHigh | mask; | |
| total++ | |
| } | |
| } | |
| if (readfds) { | |
| HEAP32[readfds >> 2] = dstReadLow; | |
| HEAP32[readfds + 4 >> 2] = dstReadHigh | |
| } | |
| if (writefds) { | |
| HEAP32[writefds >> 2] = dstWriteLow; | |
| HEAP32[writefds + 4 >> 2] = dstWriteHigh | |
| } | |
| if (exceptfds) { | |
| HEAP32[exceptfds >> 2] = dstExceptLow; | |
| HEAP32[exceptfds + 4 >> 2] = dstExceptHigh | |
| } | |
| return total | |
| } catch (e) { | |
| if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; | |
| return -e.errno | |
| } | |
| }; | |
| function ___syscall_chdir(path) { | |
| try { | |
| path = SYSCALLS.getStr(path); | |
| FS.chdir(path); | |
| return 0 | |
| } catch (e) { | |
| if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; | |
| return -e.errno | |
| } | |
| } | |
| function ___syscall_faccessat(dirfd, path, amode, flags) { | |
| try { | |
| path = SYSCALLS.getStr(path); | |
| path = SYSCALLS.calculateAt(dirfd, path); | |
| if (amode & ~7) { | |
| return -28 | |
| } | |
| var lookup = FS.lookupPath(path, { | |
| follow: true | |
| }); | |
| var node = lookup.node; | |
| if (!node) { | |
| return -44 | |
| } | |
| var perms = ""; | |
| if (amode & 4) perms += "r"; | |
| if (amode & 2) perms += "w"; | |
| if (amode & 1) perms += "x"; | |
| if (perms && FS.nodePermissions(node, perms)) { | |
| return -2 | |
| } | |
| return 0 | |
| } catch (e) { | |
| if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; | |
| return -e.errno | |
| } | |
| } | |
| var syscallGetVarargI = () => { | |
| var ret = HEAP32[+SYSCALLS.varargs >> 2]; | |
| SYSCALLS.varargs += 4; | |
| return ret | |
| }; | |
| var syscallGetVarargP = syscallGetVarargI; | |
| function ___syscall_fcntl64(fd, cmd, varargs) { | |
| SYSCALLS.varargs = varargs; | |
| try { | |
| var stream = SYSCALLS.getStreamFromFD(fd); | |
| switch (cmd) { | |
| case 0: { | |
| var arg = syscallGetVarargI(); | |
| if (arg < 0) { | |
| return -28 | |
| } | |
| while (FS.streams[arg]) { | |
| arg++ | |
| } | |
| var newStream; | |
| newStream = FS.dupStream(stream, arg); | |
| return newStream.fd | |
| } | |
| case 1: | |
| case 2: | |
| return 0; | |
| case 3: | |
| return stream.flags; | |
| case 4: { | |
| var arg = syscallGetVarargI(); | |
| stream.flags |= arg; | |
| return 0 | |
| } | |
| case 12: { | |
| var arg = syscallGetVarargP(); | |
| var offset = 0; | |
| HEAP16[arg + offset >> 1] = 2; | |
| return 0 | |
| } | |
| case 13: | |
| case 14: | |
| return 0 | |
| } | |
| return -28 | |
| } catch (e) { | |
| if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; | |
| return -e.errno | |
| } | |
| } | |
| var stringToUTF8 = (str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); | |
| function ___syscall_getcwd(buf, size) { | |
| try { | |
| if (size === 0) return -28; | |
| var cwd = FS.cwd(); | |
| var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; | |
| if (size < cwdLengthInBytes) return -68; | |
| stringToUTF8(cwd, buf, size); | |
| return cwdLengthInBytes | |
| } catch (e) { | |
| if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; | |
| return -e.errno | |
| } | |
| } | |
| function ___syscall_getdents64(fd, dirp, count) { | |
| try { | |
| var stream = SYSCALLS.getStreamFromFD(fd); | |
| stream.getdents ||= FS.readdir(stream.path); | |
| var struct_size = 280; | |
| var pos = 0; | |
| var off = FS.llseek(stream, 0, 1); | |
| var startIdx = Math.floor(off / struct_size); | |
| var endIdx = Math.min(stream.getdents.length, startIdx + Math.floor(count / struct_size)); | |
| for (var idx = startIdx; idx < endIdx; idx++) { | |
| var id; | |
| var type; | |
| var name = stream.getdents[idx]; | |
| if (name === ".") { | |
| id = stream.node.id; | |
| type = 4 | |
| } else if (name === "..") { | |
| var lookup = FS.lookupPath(stream.path, { | |
| parent: true | |
| }); | |
| id = lookup.node.id; | |
| type = 4 | |
| } else { | |
| var child; | |
| try { | |
| child = FS.lookupNode(stream.node, name) | |
| } catch (e) { | |
| if (e?.errno === 28) { | |
| continue | |
| } | |
| throw e | |
| } | |
| id = child.id; | |
| type = FS.isChrdev(child.mode) ? 2 : FS.isDir(child.mode) ? 4 : FS.isLink(child.mode) ? 10 : 8 | |
| } | |
| HEAP64[dirp + pos >> 3] = BigInt(id); | |
| HEAP64[dirp + pos + 8 >> 3] = BigInt((idx + 1) * struct_size); | |
| HEAP16[dirp + pos + 16 >> 1] = 280; | |
| HEAP8[dirp + pos + 18] = type; | |
| stringToUTF8(name, dirp + pos + 19, 256); | |
| pos += struct_size | |
| } | |
| FS.llseek(stream, idx * struct_size, 0); | |
| return pos | |
| } catch (e) { | |
| if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; | |
| return -e.errno | |
| } | |
| } | |
| function ___syscall_ioctl(fd, op, varargs) { | |
| SYSCALLS.varargs = varargs; | |
| try { | |
| var stream = SYSCALLS.getStreamFromFD(fd); | |
| switch (op) { | |
| case 21509: { | |
| if (!stream.tty) return -59; | |
| return 0 | |
| } | |
| case 21505: { | |
| if (!stream.tty) return -59; | |
| if (stream.tty.ops.ioctl_tcgets) { | |
| var termios = stream.tty.ops.ioctl_tcgets(stream); | |
| var argp = syscallGetVarargP(); | |
| HEAP32[argp >> 2] = termios.c_iflag || 0; | |
| HEAP32[argp + 4 >> 2] = termios.c_oflag || 0; | |
| HEAP32[argp + 8 >> 2] = termios.c_cflag || 0; | |
| HEAP32[argp + 12 >> 2] = termios.c_lflag || 0; | |
| for (var i = 0; i < 32; i++) { | |
| HEAP8[argp + i + 17] = termios.c_cc[i] || 0 | |
| } | |
| return 0 | |
| } | |
| return 0 | |
| } | |
| case 21510: | |
| case 21511: | |
| case 21512: { | |
| if (!stream.tty) return -59; | |
| return 0 | |
| } | |
| case 21506: | |
| case 21507: | |
| case 21508: { | |
| if (!stream.tty) return -59; | |
| if (stream.tty.ops.ioctl_tcsets) { | |
| var argp = syscallGetVarargP(); | |
| var c_iflag = HEAP32[argp >> 2]; | |
| var c_oflag = HEAP32[argp + 4 >> 2]; | |
| var c_cflag = HEAP32[argp + 8 >> 2]; | |
| var c_lflag = HEAP32[argp + 12 >> 2]; | |
| var c_cc = []; | |
| for (var i = 0; i < 32; i++) { | |
| c_cc.push(HEAP8[argp + i + 17]) | |
| } | |
| return stream.tty.ops.ioctl_tcsets(stream.tty, op, { | |
| c_iflag, | |
| c_oflag, | |
| c_cflag, | |
| c_lflag, | |
| c_cc | |
| }) | |
| } | |
| return 0 | |
| } | |
| case 21519: { | |
| if (!stream.tty) return -59; | |
| var argp = syscallGetVarargP(); | |
| HEAP32[argp >> 2] = 0; | |
| return 0 | |
| } | |
| case 21520: { | |
| if (!stream.tty) return -59; | |
| return -28 | |
| } | |
| case 21537: | |
| case 21531: { | |
| var argp = syscallGetVarargP(); | |
| return FS.ioctl(stream, op, argp) | |
| } | |
| case 21523: { | |
| if (!stream.tty) return -59; | |
| if (stream.tty.ops.ioctl_tiocgwinsz) { | |
| var winsize = stream.tty.ops.ioctl_tiocgwinsz(stream.tty); | |
| var argp = syscallGetVarargP(); | |
| HEAP16[argp >> 1] = winsize[0]; | |
| HEAP16[argp + 2 >> 1] = winsize[1] | |
| } | |
| return 0 | |
| } | |
| case 21524: { | |
| if (!stream.tty) return -59; | |
| return 0 | |
| } | |
| case 21515: { | |
| if (!stream.tty) return -59; | |
| return 0 | |
| } | |
| default: | |
| return -28 | |
| } | |
| } catch (e) { | |
| if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; | |
| return -e.errno | |
| } | |
| } | |
| function ___syscall_lstat64(path, buf) { | |
| try { | |
| path = SYSCALLS.getStr(path); | |
| return SYSCALLS.writeStat(buf, FS.lstat(path)) | |
| } catch (e) { | |
| if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; | |
| return -e.errno | |
| } | |
| } | |
| function ___syscall_mkdirat(dirfd, path, mode) { | |
| try { | |
| path = SYSCALLS.getStr(path); | |
| path = SYSCALLS.calculateAt(dirfd, path); | |
| FS.mkdir(path, mode, 0); | |
| return 0 | |
| } catch (e) { | |
| if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; | |
| return -e.errno | |
| } | |
| } | |
| function ___syscall_newfstatat(dirfd, path, buf, flags) { | |
| try { | |
| path = SYSCALLS.getStr(path); | |
| var nofollow = flags & 256; | |
| var allowEmpty = flags & 4096; | |
| flags = flags & ~6400; | |
| path = SYSCALLS.calculateAt(dirfd, path, allowEmpty); | |
| return SYSCALLS.writeStat(buf, nofollow ? FS.lstat(path) : FS.stat(path)) | |
| } catch (e) { | |
| if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; | |
| return -e.errno | |
| } | |
| } | |
| function ___syscall_openat(dirfd, path, flags, varargs) { | |
| SYSCALLS.varargs = varargs; | |
| try { | |
| path = SYSCALLS.getStr(path); | |
| path = SYSCALLS.calculateAt(dirfd, path); | |
| var mode = varargs ? syscallGetVarargI() : 0; | |
| return FS.open(path, flags, mode).fd | |
| } catch (e) { | |
| if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; | |
| return -e.errno | |
| } | |
| } | |
| function ___syscall_readlinkat(dirfd, path, buf, bufsize) { | |
| try { | |
| path = SYSCALLS.getStr(path); | |
| path = SYSCALLS.calculateAt(dirfd, path); | |
| if (bufsize <= 0) return -28; | |
| var ret = FS.readlink(path); | |
| var len = Math.min(bufsize, lengthBytesUTF8(ret)); | |
| var endChar = HEAP8[buf + len]; | |
| stringToUTF8(ret, buf, bufsize + 1); | |
| HEAP8[buf + len] = endChar; | |
| return len | |
| } catch (e) { | |
| if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; | |
| return -e.errno | |
| } | |
| } | |
| function ___syscall_stat64(path, buf) { | |
| try { | |
| path = SYSCALLS.getStr(path); | |
| return SYSCALLS.writeStat(buf, FS.stat(path)) | |
| } catch (e) { | |
| if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; | |
| return -e.errno | |
| } | |
| } | |
| function ___syscall_unlinkat(dirfd, path, flags) { | |
| try { | |
| path = SYSCALLS.getStr(path); | |
| path = SYSCALLS.calculateAt(dirfd, path); | |
| if (!flags) { | |
| FS.unlink(path) | |
| } else if (flags === 512) { | |
| FS.rmdir(path) | |
| } else { | |
| return -28 | |
| } | |
| return 0 | |
| } catch (e) { | |
| if (typeof FS == "undefined" || !(e.name === "ErrnoError")) throw e; | |
| return -e.errno | |
| } | |
| } | |