--:Minify:-- local fs = require("sys.fs") local cmdArgs = {...} local targetUser = "root" local i = 1 if cmdArgs[i] == "-u" then i = i + 1 local uarg = cmdArgs[i] or "root" local numUid = tonumber(uarg) if numUid then local pwent = syscall.auth_getpasswd(numUid) targetUser = (pwent and pwent.username) or uarg else targetUser = uarg end i = i + 1 end local cmd = cmdArgs[i] if not cmd or cmd == "" then print("usage: sudo [-u user] [args...]") syscall.exit(1) return end local restArgs = {} for j = i + 1, #cmdArgs do restArgs[#restArgs + 1] = cmdArgs[j] end local currentUid = syscall.getuid() local currentUser = syscall.getUsername(currentUid) or tostring(currentUid) local targetUid = syscall.auth_getuid(targetUser) if not targetUid then print("sudo: user '" .. targetUser .. "' does not exist") syscall.exit(1) return end if currentUid ~= 0 then printInline("[sudo] password for " .. currentUser .. ": ") local pw = "" while true do local ch = syscall.read(0) if not ch or ch == "" then elseif ch == "\n" then syscall.write(1, "\n") break elseif ch == "\b" then if #pw > 0 then pw = pw:sub(1, -2); syscall.write(1, "\b \b") end else pw = pw .. ch syscall.write(1, "*") end end local ok, err = syscall.auth_elevate(currentUser, pw) if not ok then sleep(1) print("sudo: Authentication failure") syscall.exit(1) return end if targetUid ~= 0 then syscall.setuid(targetUid) end else if targetUid ~= currentUid then syscall.setuid(targetUid) end end local cmdPath = "" if cmd:find("/") then if fs.exists(cmd) then cmdPath = cmd end else local paths = string.split(syscall.getEnviron("PATH") or "/bin/", ":") for _, p in ipairs(paths) do local full = p .. cmd if fs.exists(full) then cmdPath = full; break end end end if cmdPath == "" then print("sudo: command not found: " .. cmd) syscall.exit(1) return end local text = fs.readAllText(cmdPath) local program, loadErr = load(text, "@" .. cmdPath) if not program then print("sudo: cannot load " .. cmd .. ": " .. tostring(loadErr)) syscall.exit(1) return end local pwent = syscall.auth_getpasswd(targetUid) if pwent and pwent.homedir then syscall.setEnviron("HOME", pwent.homedir) end syscall.setEnviron("USER", targetUser) local ok, err = xpcall(program, debug.traceback, table.unpack(restArgs)) if not ok then print("sudo: " .. cmd .. ": " .. tostring(err)) syscall.exit(1) end