#include <mLib/daemonize.h>
#include <mLib/darray.h>
#include <mLib/dstr.h>
+#include <mLib/mdup.h>
#include <mLib/mdwopt.h>
#include <mLib/quis.h>
#include <mLib/report.h>
if (f & f_syslog) syslog(prio, "%s", d.buf);
if (logfp) {
switch (prio) {
- case LOG_WARN: cat = "warning"; break;
+ case LOG_WARNING: cat = "warning"; break;
case LOG_DEBUG: cat = "debug"; break;
case LOG_ERR: cat = "error"; break;
default: cat = "message"; break;
}
writelog(cat, d.buf);
}
- if (prio == LOG_WARN && (f & f_warn))
+ if (prio == LOG_WARNING && (f & f_warn))
fprintf(stderr, "Warning: %s\n", d.buf);
dstr_destroy(&d);
}
}
}
+static void eline(char *p, size_t len, void *b)
+{
+ if (p)
+ dolog(LOG_WARNING, "(stderr): %s", p);
+ else {
+ selbuf_destroy(b);
+ close(fd);
+ }
+}
+
static void setup(const char *cmd)
{
dstr d = DSTR_INIT;
else if (logname)
die(EXIT_FAILURE, d.buf);
if (f & f_syslog)
- syslog(LOG_ERR, d.buf);
+ syslog(LOG_ERR, "%s", d.buf);
dstr_destroy(&d);
}
}
size_t sz;
uid_t u = -1;
gid_t g = -1;
- int pfd[2];
+ int pfd[2], efd[2];
+ mdup_fd md[3];
pid_t kid;
struct sigaction sa;
sigset_t newmask, oldmask;
struct sockaddr_un sun;
- selbuf bu, bs;
+ selbuf bu, bs, be;
dstr d = DSTR_INIT;
sig hup;
putarg(&spawnopts, "-d.");
putarg(&spawnopts, "-F");
putarg(&spawnopts, "%s", spawnpath);
- if (socketpair(PF_UNIX, SOCK_STREAM, 0, pfd))
+ if (socketpair(PF_UNIX, SOCK_STREAM, 0, pfd) || pipe(efd))
die(EXIT_FAILURE, "error from socketpair: %s", strerror(errno));
sigemptyset(&newmask);
sigaddset(&newmask, SIGCHLD);
if ((kid = fork()) < 0)
die(EXIT_FAILURE, "fork failed: %s", strerror(errno));
if (!kid) {
- dup2(pfd[1], STDIN_FILENO);
- dup2(pfd[1], STDOUT_FILENO);
- close(pfd[0]);
- close(pfd[1]);
+ close(pfd[0]); close(efd[0]);
+ md[0].cur = pfd[1]; md[0].want = STDIN_FILENO;
+ md[1].cur = pfd[1]; md[1].want = STDOUT_FILENO;
+ md[2].cur = efd[1]; md[2].want = STDERR_FILENO;
+ mdup(md, 3);
if (logfp) fclose(logfp);
if (pidfp) fclose(pidfp);
closelog();
}
sigprocmask(SIG_SETMASK, &oldmask, 0);
fd = pfd[0];
- close(pfd[1]);
+ close(pfd[1]); close(efd[1]);
+ selbuf_init(&be, &sel, efd[0], eline, &be);
} else {
sz = strlen(sock) + 1;
if (sz > sizeof(sun.sun_path))