27#include <sys/socket.h>
39 int rp[2], wp[2], ep[2];
43#ifdef OSX_EMBEDED_MODE
44 fprintf(stderr,
"STARTING \"%s\"\n",
name.c_str());
52 if (socketpair(AF_UNIX, SOCK_STREAM, 0, ux) == -1)
104 for (
fd = 3;
fd < 100;
fd++)
110 setenv(
"INDIDEV",
envDev.c_str(), 1);
119 setenv(
"INDICONFIG",
envConfig.c_str(), 1);
123 unsetenv(
"INDICONFIG");
127 setenv(
"INDISKEL",
envSkel.c_str(), 1);
131 unsetenv(
"INDISKEL");
133 std::string executable;
136 setenv(
"INDIPREFIX",
envPrefix.c_str(), 1);
137#if defined(OSX_EMBEDED_MODE)
139#elif defined(__APPLE__)
145 fprintf(stderr,
"%s\n", executable.c_str());
147 execlp(executable.c_str(),
name.c_str(), NULL);
151 execlp(
name.c_str(),
name.c_str(), NULL);
154#ifdef OSX_EMBEDED_MODE
155 fprintf(stderr,
"FAILED \"%s\"\n",
name.c_str());
158 log(
fmt(
"execlp %s: %s\n", executable.c_str(), strerror(
errno)));
186 this->pidwatcher.set(pid);
187 this->pidwatcher.start();
191 fcntl(this->efd, F_SETFL, fcntl(this->efd, F_GETFL, 0) | O_NONBLOCK);
192 this->eio.start(this->efd, ev::READ);
198 log(
fmt(
"pid=%d rfd=%d wfd=%d efd=%d\n", pid, rp[0], wp[1], ep[0]));
202 mp =
new Msg(
nullptr, root);
211 pidwatcher.set<
LocalDvrInfo, &LocalDvrInfo::onPidEvent>(
this);
216 envDev(model.envDev),
217 envConfig(model.envConfig),
218 envSkel(model.envSkel),
219 envPrefix(model.envPrefix)
222 pidwatcher.set<
LocalDvrInfo, &LocalDvrInfo::onPidEvent>(
this);
241void LocalDvrInfo::closeEfd()
248void LocalDvrInfo::closePid()
254void LocalDvrInfo::onEfdEvent(ev::io &,
int revents)
256 if (EV_ERROR & revents)
261 log(
fmt(
"Error on stderr: %s\n", strerror(sockErrno)));
267 if (revents & EV_READ)
272 nr = read(efd, errbuff + errbuffpos,
sizeof(errbuff) - errbuffpos);
277 if (
errno == EAGAIN ||
errno == EWOULDBLOCK)
return;
288 for(
int i = 0; i < errbuffpos; ++i)
290 if (errbuff[i] ==
'\n')
292 log(
fmt(
"%.*s\n", (
int)i, errbuff));
295 memmove(errbuff, errbuff + i, errbuffpos);
302void LocalDvrInfo::onPidEvent(ev::child &,
int revents)
304 if (revents & EV_CHILD)
306 if (WIFEXITED(pidwatcher.rstatus))
308 log(
fmt(
"process %d exited with status %d\n", pid, WEXITSTATUS(pidwatcher.rstatus)));
310 else if (WIFSIGNALED(pidwatcher.rstatus))
312 int signum = WTERMSIG(pidwatcher.rstatus);
313 log(
fmt(
"process %d killed with signal %d - %s\n", pid, signum, strsignal(signum)));
316 this->pidwatcher.stop();
CommandLineArgs * userConfigurableArguments
std::string fmt(const char *fmt,...)
void log(const std::string &log) const override
LocalDvrInfo * clone() const override
void setFds(int rFd, int wFd)
XMLEle * addXMLEle(XMLEle *parent, const char *tag)
add an element with the given tag to the given element. parent can be NULL to make a new root.
XMLAtt * addXMLAtt(XMLEle *ep, const char *name, const char *valu)
Add an XML attribute to an existing XML element.