executePrivileged: support multiple privesc commands, support sudo

This commit is contained in:
Max Headroom 2023-01-07 15:25:52 +01:00
parent d7e702b121
commit 8a11cfdda8

View file

@ -34,13 +34,22 @@ using namespace nix;
void executePrivileged(std::string program, Strings args) { void executePrivileged(std::string program, Strings args) {
args.push_front(program); args.push_front(program);
auto exe = program; auto exe = program;
if(getuid() != 0) { auto privCmds = Strings {
args.push_front("doas"); "doas",
exe = "doas"; "sudo"
};
bool isRoot = getuid() == 0;
for (auto privCmd : privCmds) {
if(!isRoot) {
args.push_front(privCmd);
exe = privCmd;
}
execvp(exe.c_str(), stringsToCharPtrs(args).data());
if(!isRoot)
args.pop_front();
} }
execvp(exe.c_str(), stringsToCharPtrs(args).data());
throw SysError("unable to execute '%s'", exe); throw SysError("unable to execute privilege elevation helper (tried %s)", concatStringsSep(", ", privCmds));
} }
struct SystemCommand : InstallableCommand struct SystemCommand : InstallableCommand