about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libmain/shared.cc38
-rw-r--r--src/libutil/types.hh1
-rw-r--r--src/libutil/util.cc10
3 files changed, 10 insertions, 39 deletions
diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc
index ef4ea370622b..1d50346a1bf8 100644
--- a/src/libmain/shared.cc
+++ b/src/libmain/shared.cc
@@ -15,7 +15,6 @@
 #include <sys/stat.h>
 #include <unistd.h>
 #include <signal.h>
-#include <spawn.h>
 
 extern char * * environ;
 
@@ -308,35 +307,14 @@ RunPager::RunPager()
     Pipe toPager;
     toPager.create();
 
-    // FIXME: should do this in the child environment.
-    if (!getenv("LESS"))
-        setenv("LESS", "FRSXMK", 1);
-
-    /* Start the pager using posix_spawn. */
-    pid_t pid_;
-    const char * argv[] = { "sh", "-c", pager.c_str(), 0 };
-
-    posix_spawn_file_actions_t fileActions;
-    int err = posix_spawn_file_actions_init(&fileActions);
-    if (err) throw SysError(err, "creating POSIX file actions");
-    err = posix_spawn_file_actions_adddup2(&fileActions, toPager.readSide, STDIN_FILENO);
-    if (err) throw SysError(err, "adding to POSIX file actions");
-
-    posix_spawnattr_t spawnAttrs;
-    err = posix_spawnattr_init(&spawnAttrs);
-    if (err) throw SysError(err, "creating POSIX spawn attrs");
-#ifdef POSIX_SPAWN_USEVFORK
-    err = posix_spawnattr_setflags(&spawnAttrs, POSIX_SPAWN_USEVFORK);
-    if (err) throw SysError(err, "setting POSIX spawn attr flag");
-#endif
-
-    err = posix_spawn(&pid_, "/bin/sh", &fileActions, &spawnAttrs, (char * const *) argv, environ);
-
-    posix_spawn_file_actions_destroy(&fileActions);
-    posix_spawnattr_destroy(&spawnAttrs);
-
-    if (err) throw SysError(err, format("running ‘%1%’") % pager);
-    pid = pid_;
+    pid = startProcess([&]() {
+        if (dup2(toPager.readSide, STDIN_FILENO) == -1)
+            throw SysError("dupping stdin");
+        if (!getenv("LESS"))
+            setenv("LESS", "FRSXMK", 1);
+        execl("/bin/sh", "sh", "-c", pager.c_str(), NULL);
+        throw SysError(format("executing ‘%1%’") % pager);
+    });
 
     if (dup2(toPager.writeSide, STDOUT_FILENO) == -1)
         throw SysError("dupping stdout");
diff --git a/src/libutil/types.hh b/src/libutil/types.hh
index 030996a060e2..160884ee1ad7 100644
--- a/src/libutil/types.hh
+++ b/src/libutil/types.hh
@@ -73,7 +73,6 @@ class SysError : public Error
 public:
     int errNo;
     SysError(const FormatOrString & fs);
-    SysError(int errNo, const FormatOrString & fs);
 };
 
 
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index 60be02cd4647..305e470ebde0 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -45,14 +45,8 @@ BaseError & BaseError::addPrefix(const FormatOrString & fs)
 
 
 SysError::SysError(const FormatOrString & fs)
-    : SysError(errno, fs)
-{
-}
-
-
-SysError::SysError(int errNo, const FormatOrString & fs)
-    : Error(format("%1%: %2%") % fs.s % strerror(errNo))
-    , errNo(errNo)
+    : Error(format("%1%: %2%") % fs.s % strerror(errno))
+    , errNo(errno)
 {
 }