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>
This commit is contained in:
mathias 2007-06-06 06:22:37 +00:00
parent 467cb9ac6d
commit dff2aa3356
3 changed files with 15 additions and 2 deletions

View file

@ -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.

View file

@ -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 ;)

View file

@ -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
}