about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2003-03-28T10·33+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2003-03-28T10·33+0000
commit278ea4097e4deca33da1a08d746e8d80a620ce95 (patch)
tree840c57c4501e5adeae44733417a64d4bfbd66775
parentf915f773495e9675a6cd514742666c8c12f005e6 (diff)
* Don't fork in `nix run'.
-rw-r--r--src/nix.cc64
-rwxr-xr-xtest/build/pan-run.sh5
-rw-r--r--test/tmpl/pan-0.13.91-run.nix2
3 files changed, 25 insertions, 46 deletions
diff --git a/src/nix.cc b/src/nix.cc
index c24cb1fd7baf..275a37bea1fc 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;
diff --git a/test/build/pan-run.sh b/test/build/pan-run.sh
index c933a38039eb..1d9db5377650 100755
--- a/test/build/pan-run.sh
+++ b/test/build/pan-run.sh
@@ -4,4 +4,7 @@ export LD_LIBRARY_PATH=$glib/lib:$atk/lib:$pango/lib:$gtk/lib:$gnet/lib:$pspell/
 
 ldd $pan/bin/pan
 
-$pan/bin/pan $*
\ No newline at end of file
+prog=$1
+shift
+
+$pan/bin/$prog $*
diff --git a/test/tmpl/pan-0.13.91-run.nix b/test/tmpl/pan-0.13.91-run.nix
index a28459916cd8..f9c13e64d71e 100644
--- a/test/tmpl/pan-0.13.91-run.nix
+++ b/test/tmpl/pan-0.13.91-run.nix
@@ -1,4 +1,4 @@
-id : pan-0.13.91-run
+id : pan-0.13.91-run-2
 
 pan <- ./pan-0.13.91.nix