From dff2aa33561b00e97b3561892fb690ba9f2968c6 Mon Sep 17 00:00:00 2001
From: mathias <mathias>
Date: Wed, 6 Jun 2007 06:22:37 +0000
Subject: fix for the following problem:   on *bsd /bin/sh is not just a
 symlink to /bin/bash as on most linux's   but a real standalone shell. and it
 behaves differently from "bash -c"   behavior .. it doesnt exec the command
 given but waits till the command   finishes. as a result a lot of "rogue" a
 flying around. solution is now

     ( $SHELL or /bin/sh ) -c exec <cmd>
---
 ChangeLog           | 3 +++
 src/FbCommands.cc   | 5 ++++-
 util/fbrun/FbRun.cc | 9 ++++++++-
 3 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 8c67f62..07a09d7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
  (Format: Year/Month/Day)
 Changes for 1.0.0:
+*07/06/06:
+   * Fix to avoid rogue instances of /bin/sh after forking away programs (Mathias)
+     util/fbrun/FbRun.cc src/FbCommands.cc
 *07/06/04:
    * Fix fluxbox.1.in, and asciidoc, menu command is "wallpapers" not
      "wallpaper". asciidoc manpages are stale.
diff --git a/src/FbCommands.cc b/src/FbCommands.cc
index afa7984..4247820 100644
--- a/src/FbCommands.cc
+++ b/src/FbCommands.cc
@@ -154,9 +154,12 @@ int ExecuteCmd::run() {
     // remove last number of display and add screen num
     displaystring.erase(displaystring.size()-1);
     displaystring += intbuff;
+
+    std::string exec_cmd = "exec " + m_cmd;
+
     setsid();
     putenv(const_cast<char *>(displaystring.c_str()));
-    execl(shell, shell, "-c", m_cmd.c_str(), static_cast<void*>(NULL));
+    execl(shell, shell, "-c", exec_cmd.c_str(), static_cast<void*>(NULL));
     exit(0);
 
     return pid; // compiler happy -> we are happy ;)
diff --git a/util/fbrun/FbRun.cc b/util/fbrun/FbRun.cc
index 7797f76..95cb94d 100644
--- a/util/fbrun/FbRun.cc
+++ b/util/fbrun/FbRun.cc
@@ -119,8 +119,15 @@ void FbRun::run(const std::string &command) {
 
     // fork and execute program
     if (!fork()) {
+
+        char *shell = getenv("SHELL");
+        if (!shell)
+            shell = "/bin/sh";
+
+        std::string exec_cmd = "exec " + command;
+
         setsid();
-        execl("/bin/sh", "/bin/sh", "-c", command.c_str(), static_cast<void*>(NULL));
+        execl(shell, shell, "-c", exec_cmd.c_str(), static_cast<void*>(NULL));
         exit(0); //exit child
     }
 
-- 
cgit v0.11.2