Merge pull request #9494 from sellout/nix-run-execv

Don’t use `execvp` when we know the path
This commit is contained in:
Théophane Hufschmitt 2023-12-01 16:07:16 +01:00 committed by GitHub
commit dfa219d03b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 15 additions and 5 deletions

View file

@ -662,7 +662,7 @@ struct CmdDevelop : Common, MixEnvironment
}
}
runProgramInStore(store, shell, args, buildEnvironment.getSystem());
runProgramInStore(store, UseSearchPath::Use, shell, args, buildEnvironment.getSystem());
}
};

View file

@ -49,7 +49,7 @@ struct CmdFmt : SourceExprCommand {
}
}
runProgramInStore(store, app.program, programArgs);
runProgramInStore(store, UseSearchPath::DontUse, app.program, programArgs);
};
};

View file

@ -25,6 +25,7 @@ std::string chrootHelperName = "__run_in_chroot";
namespace nix {
void runProgramInStore(ref<Store> store,
UseSearchPath useSearchPath,
const std::string & program,
const Strings & args,
std::optional<std::string_view> system)
@ -58,7 +59,10 @@ void runProgramInStore(ref<Store> store,
if (system)
setPersonality(*system);
execvp(program.c_str(), stringsToCharPtrs(args).data());
if (useSearchPath == UseSearchPath::Use)
execvp(program.c_str(), stringsToCharPtrs(args).data());
else
execv(program.c_str(), stringsToCharPtrs(args).data());
throw SysError("unable to execute '%s'", program);
}
@ -132,7 +136,7 @@ struct CmdShell : InstallablesCommand, MixEnvironment
Strings args;
for (auto & arg : command) args.push_back(arg);
runProgramInStore(store, *command.begin(), args);
runProgramInStore(store, UseSearchPath::Use, *command.begin(), args);
}
};
@ -194,7 +198,7 @@ struct CmdRun : InstallableValueCommand
Strings allArgs{app.program};
for (auto & i : args) allArgs.push_back(i);
runProgramInStore(store, app.program, allArgs);
runProgramInStore(store, UseSearchPath::DontUse, app.program, allArgs);
}
};

View file

@ -5,7 +5,13 @@
namespace nix {
enum struct UseSearchPath {
Use,
DontUse
};
void runProgramInStore(ref<Store> store,
UseSearchPath useSearchPath,
const std::string & program,
const Strings & args,
std::optional<std::string_view> system = std::nullopt);