diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2003-03-28 10:33:34 +0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2003-03-28 10:33:34 +0000 |
commit | 278ea4097e4deca33da1a08d746e8d80a620ce95 (patch) | |
tree | 840c57c4501e5adeae44733417a64d4bfbd66775 /src/nix.cc | |
parent | f915f773495e9675a6cd514742666c8c12f005e6 (diff) | |
download | guix-278ea4097e4deca33da1a08d746e8d80a620ce95.tar.gz |
* Don't fork in `nix run'.
Diffstat (limited to 'src/nix.cc')
-rw-r--r-- | src/nix.cc | 64 |
1 files changed, 20 insertions, 44 deletions
diff --git a/src/nix.cc b/src/nix.cc index c24cb1fd7b..275a37bea1 100644 --- a/src/nix.cc +++ b/src/nix.cc @@ -406,52 +406,29 @@ void runPkg(string hash, const vector<string> & args) runner = getFromEnv(env, "run"); - /* Fork a child to build the package. */ - pid_t pid; - switch (pid = fork()) { - - case -1: - throw Error("unable to fork"); - - case 0: { /* child */ - - /* Fill in the environment. We don't bother freeing the - strings, since we'll exec or die soon anyway. */ - for (Environment::iterator it = env.begin(); - it != env.end(); it++) - { - string * s = new string(it->first + "=" + it->second); - putenv((char *) s->c_str()); - } - - /* Create the list of arguments. */ - const char * args2[env.size() + 2]; - int i = 0; - args2[i++] = runner.c_str(); - for (vector<string>::const_iterator it = args.begin(); - it != args.end(); it++, i++) - args2[i] = it->c_str(); - args2[i] = 0; - - /* Execute the runner. This should not return. */ - execv(runner.c_str(), (char * *) args2); - - cout << strerror(errno) << endl; - - cout << "unable to execute runner\n"; - _exit(1); } - + /* Fill in the environment. We don't bother freeing the + strings, since we'll exec or die soon anyway. */ + for (Environment::iterator it = env.begin(); + it != env.end(); it++) + { + string * s = new string(it->first + "=" + it->second); + putenv((char *) s->c_str()); } - /* parent */ + /* Create the list of arguments. */ + const char * args2[env.size() + 2]; + int i = 0; + args2[i++] = runner.c_str(); + for (vector<string>::const_iterator it = args.begin(); + it != args.end(); it++, i++) + args2[i] = it->c_str(); + args2[i] = 0; - /* Wait for the child to finish. */ - int status; - if (waitpid(pid, &status, 0) != pid) - throw Error("unable to wait for child"); - - if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) - throw Error("unable to run package"); + /* Execute the runner. This should not return. */ + execv(runner.c_str(), (char * *) args2); + + cout << strerror(errno) << endl; + throw Error("unable to execute runner"); } @@ -750,7 +727,6 @@ void main2(int argc, char * * argv) /* Parse the global flags. */ while (argc) { string arg(*argv); - cout << arg << endl; if (arg == "-h" || arg == "--help") { printUsage(); return; |