diff options
author | Frank Schmirler <vdr@schmirler.de> | 2010-12-02 09:43:13 +0100 |
---|---|---|
committer | Frank Schmirler <vdr@schmirler.de> | 2010-12-02 09:43:13 +0100 |
commit | 7254a6752808830d5fc133e5362da6c47f3f84ff (patch) | |
tree | 673cc17f88ba80f8a67debb54f85ea100cde9ae5 /remux/extern.c | |
parent | 31df0eaf8e49bc1cfea755bd88f3dd795c8f1ace (diff) | |
download | vdr-plugin-streamdev-7254a6752808830d5fc133e5362da6c47f3f84ff.tar.gz vdr-plugin-streamdev-7254a6752808830d5fc133e5362da6c47f3f84ff.tar.bz2 |
Snapshot 2009-06-11
Diffstat (limited to 'remux/extern.c')
-rw-r--r-- | remux/extern.c | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/remux/extern.c b/remux/extern.c index e137c4a..c5f35de 100644 --- a/remux/extern.c +++ b/remux/extern.c @@ -1,4 +1,5 @@ #include "remux/extern.h" +#include "server/server.h" #include "server/streamer.h" #include <vdr/tools.h> #include <sys/types.h> @@ -6,8 +7,6 @@ #include <signal.h> #include <unistd.h> -const char *g_ExternRemux = "/root/externremux.sh"; - class cTSExt: public cThread { private: cRingBufferLinear *m_ResultBuffer; @@ -28,7 +27,7 @@ public: cTSExt::cTSExt(cRingBufferLinear *ResultBuffer, std::string Parameter): m_ResultBuffer(ResultBuffer), m_Active(false), - m_Process(0), + m_Process(-1), m_Inpipe(0), m_Outpipe(0) { @@ -67,9 +66,13 @@ cTSExt::cTSExt(cRingBufferLinear *ResultBuffer, std::string Parameter): for (int i = STDERR_FILENO + 1; i < MaxPossibleFileDescriptors; i++) close(i); //close all dup'ed filedescriptors - std::string cmd = std::string(g_ExternRemux) + " " + Parameter; - execl("/bin/sh", "sh", "-c", cmd.c_str(), NULL); - _exit(-1); + std::string cmd = std::string(opt_remux) + " " + Parameter; + if (execl("/bin/sh", "sh", "-c", cmd.c_str(), NULL) == -1) { + esyslog("streamdev-server: externremux script '%s' execution failed: %m", cmd.c_str()); + _exit(-1); + } + // should never be reached + _exit(0); } close(inpipe[0]); @@ -84,16 +87,31 @@ cTSExt::~cTSExt() m_Active = false; Cancel(3); if (m_Process > 0) { + // close pipes close(m_Outpipe); close(m_Inpipe); - kill(m_Process, SIGTERM); - for (int i = 0; waitpid(m_Process, NULL, WNOHANG) == 0; i++) { - if (i == 20) { - esyslog("streamdev-server: externremux process won't stop - killing it"); - kill(m_Process, SIGKILL); + // signal and wait for termination + if (kill(m_Process, SIGINT) < 0) { + esyslog("streamdev-server: externremux SIGINT failed: %m"); + } + else { + int i = 0; + int retval; + while ((retval = waitpid(m_Process, NULL, WNOHANG)) == 0) { + + if ((++i % 20) == 0) { + esyslog("streamdev-server: externremux process won't stop - killing it"); + kill(m_Process, SIGKILL); + } + cCondWait::SleepMs(100); } - cCondWait::SleepMs(100); + + if (retval < 0) + esyslog("streamdev-server: externremux process waitpid failed: %m"); + else + Dprintf("streamdev-server: externremux child (%d) exited as expected\n", m_Process); } + m_Process = -1; } } |