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 } }