aboutsummaryrefslogtreecommitdiff
path: root/httpd/proc.c
diff options
context:
space:
mode:
Diffstat (limited to 'httpd/proc.c')
-rw-r--r--httpd/proc.c77
1 files changed, 51 insertions, 26 deletions
diff --git a/httpd/proc.c b/httpd/proc.c
index 9ba7bbe..7a6124a 100644
--- a/httpd/proc.c
+++ b/httpd/proc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: proc.c,v 1.9 2015/08/20 13:00:23 reyk Exp $ */
+/* $OpenBSD: proc.c,v 1.15 2015/12/07 16:05:56 reyk Exp $ */
/*
* Copyright (c) 2010 - 2014 Reyk Floeter <reyk@openbsd.org>
@@ -41,6 +41,7 @@ int proc_ispeer(struct privsep_proc *, unsigned int, enum privsep_procid);
void proc_shutdown(struct privsep_proc *);
void proc_sig_handler(int, short, void *);
void proc_range(struct privsep *, enum privsep_procid, int *, int *);
+int proc_dispatch_null(int, struct privsep_proc *, struct imsg *);
int
proc_ispeer(struct privsep_proc *procs, unsigned int nproc,
@@ -160,6 +161,8 @@ proc_open(struct privsep *ps, struct privsep_proc *p,
for (proc = 0; proc < nproc; proc++) {
procs[proc].p_ps = ps;
procs[proc].p_env = ps->ps_env;
+ if (procs[proc].p_cb == NULL)
+ procs[proc].p_cb = proc_dispatch_null;
for (i = 0; i < ps->ps_instances[src]; i++) {
for (j = 0; j < ps->ps_instances[procs[proc].p_id];
@@ -171,13 +174,11 @@ proc_open(struct privsep *ps, struct privsep_proc *p,
if (pa->pp_pipes[procs[proc].p_id][j] != -1)
continue;
- if (socketpair(AF_UNIX, SOCK_STREAM,
+ if (socketpair(AF_UNIX,
+ SOCK_STREAM | SOCK_NONBLOCK,
PF_UNSPEC, fds) == -1)
fatal("socketpair");
- socket_set_blockmode(fds[0], BM_NONBLOCK);
- socket_set_blockmode(fds[1], BM_NONBLOCK);
-
pa->pp_pipes[procs[proc].p_id][j] = fds[0];
pb->pp_pipes[src][i] = fds[1];
}
@@ -328,7 +329,7 @@ proc_sig_handler(int sig, short event, void *arg)
pid_t
proc_run(struct privsep *ps, struct privsep_proc *p,
struct privsep_proc *procs, unsigned int nproc,
- void (*init)(struct privsep *, struct privsep_proc *, void *), void *arg)
+ void (*run)(struct privsep *, struct privsep_proc *, void *), void *arg)
{
pid_t pid;
struct passwd *pw;
@@ -346,6 +347,8 @@ proc_run(struct privsep *ps, struct privsep_proc *p,
case -1:
fatal("proc_run: cannot fork");
case 0:
+ log_procinit(p->p_title);
+
/* Set the process group of the current process */
setpgid(0, 0);
break;
@@ -357,10 +360,10 @@ proc_run(struct privsep *ps, struct privsep_proc *p,
if (p->p_id == PROC_CONTROL && ps->ps_instance == 0) {
if (control_init(ps, &ps->ps_csock) == -1)
- fatalx(p->p_title);
+ fatalx(__func__);
TAILQ_FOREACH(rcs, &ps->ps_rcsocks, cs_entry)
if (control_init(ps, rcs) == -1)
- fatalx(p->p_title);
+ fatalx(__func__);
}
/* Change root directory */
@@ -417,14 +420,14 @@ proc_run(struct privsep *ps, struct privsep_proc *p,
if (p->p_id == PROC_CONTROL && ps->ps_instance == 0) {
TAILQ_INIT(&ctl_conns);
if (control_listen(&ps->ps_csock) == -1)
- fatalx(p->p_title);
+ fatalx(__func__);
TAILQ_FOREACH(rcs, &ps->ps_rcsocks, cs_entry)
if (control_listen(rcs) == -1)
- fatalx(p->p_title);
+ fatalx(__func__);
}
- if (init != NULL)
- init(ps, p, arg);
+ if (run != NULL)
+ run(ps, p, arg);
event_dispatch();
@@ -449,8 +452,8 @@ proc_dispatch(int fd, short event, void *arg)
ibuf = &iev->ibuf;
if (event & EV_READ) {
- if ((n = imsg_read(ibuf)) == -1)
- fatal(title);
+ if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN)
+ fatal(__func__);
if (n == 0) {
/* this pipe is dead, so remove the event handler */
event_del(&iev->ev);
@@ -461,19 +464,19 @@ proc_dispatch(int fd, short event, void *arg)
if (event & EV_WRITE) {
if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN)
- fatal(title);
+ fatal(__func__);
}
for (;;) {
if ((n = imsg_get(ibuf, &imsg)) == -1)
- fatal(title);
+ fatal(__func__);
if (n == 0)
break;
#if DEBUG > 1
- log_debug("%s: %s %d got imsg %d from %s %d",
+ log_debug("%s: %s %d got imsg %d peerid %d from %s %d",
__func__, title, ps->ps_instance + 1,
- imsg.hdr.type, p->p_title, p->p_instance);
+ imsg.hdr.type, imsg.hdr.peerid, p->p_title, p->p_instance);
#endif
/*
@@ -495,16 +498,24 @@ proc_dispatch(int fd, short event, void *arg)
log_verbose(verbose);
break;
default:
- log_warnx("%s: %s %d got invalid imsg %d from %s %d",
+ log_warnx("%s: %s %d got invalid imsg %d peerid %d "
+ "from %s %d",
__func__, title, ps->ps_instance + 1,
- imsg.hdr.type, p->p_title, p->p_instance);
- fatalx(title);
+ imsg.hdr.type, imsg.hdr.peerid,
+ p->p_title, p->p_instance);
+ fatalx(__func__);
}
imsg_free(&imsg);
}
imsg_event_add(iev);
}
+int
+proc_dispatch_null(int fd, struct privsep_proc *p, struct imsg *imsg)
+{
+ return (-1);
+}
+
/*
* imsg helper functions
*/
@@ -567,14 +578,14 @@ proc_range(struct privsep *ps, enum privsep_procid id, int *n, int *m)
int
proc_compose_imsg(struct privsep *ps, enum privsep_procid id, int n,
- uint16_t type, int fd, void *data, uint16_t datalen)
+ uint16_t type, uint32_t peerid, int fd, void *data, uint16_t datalen)
{
int m;
proc_range(ps, id, &n, &m);
for (; n < m; n++) {
if (imsg_compose_event(&ps->ps_ievs[id][n],
- type, -1, 0, fd, data, datalen) == -1)
+ type, peerid, 0, fd, data, datalen) == -1)
return (-1);
}
@@ -582,26 +593,40 @@ proc_compose_imsg(struct privsep *ps, enum privsep_procid id, int n,
}
int
+proc_compose(struct privsep *ps, enum privsep_procid id,
+ uint16_t type, void *data, uint16_t datalen)
+{
+ return (proc_compose_imsg(ps, id, -1, type, -1, -1, data, datalen));
+}
+
+int
proc_composev_imsg(struct privsep *ps, enum privsep_procid id, int n,
- uint16_t type, int fd, const struct iovec *iov, int iovcnt)
+ uint16_t type, uint32_t peerid, int fd, const struct iovec *iov, int iovcnt)
{
int m;
proc_range(ps, id, &n, &m);
for (; n < m; n++)
if (imsg_composev_event(&ps->ps_ievs[id][n],
- type, -1, 0, fd, iov, iovcnt) == -1)
+ type, peerid, 0, fd, iov, iovcnt) == -1)
return (-1);
return (0);
}
int
+proc_composev(struct privsep *ps, enum privsep_procid id,
+ uint16_t type, const struct iovec *iov, int iovcnt)
+{
+ return (proc_composev_imsg(ps, id, -1, type, -1, -1, iov, iovcnt));
+}
+
+int
proc_forward_imsg(struct privsep *ps, struct imsg *imsg,
enum privsep_procid id, int n)
{
return (proc_compose_imsg(ps, id, n, imsg->hdr.type,
- imsg->fd, imsg->data, IMSG_DATA_SIZE(imsg)));
+ imsg->hdr.peerid, imsg->fd, imsg->data, IMSG_DATA_SIZE(imsg)));
}
struct imsgbuf *