1
0
mirror of https://github.com/openbsd/src.git synced 2026-06-18 07:13:36 +02:00

relayd: convert proc.c to new imsg API

Replace IMSG_SIZE_CHECK() + memcpy() with imsg_get_data(), which does
the length check and copy in one call. Use the imsg accessors
(imsg_get_*) instead of touching imsg.hdr directly and
imsgbuf_get()/imsgbuf_read() instead of imsg_get().

Rewrite proc_forward_imsg() to use imsg_forward() per target imsgbuf
instead of re-composing via proc_compose_imsg(); arm the write event
with imsg_event_add() after each forward.

proc_forward_imsg() never forwarded an fd, and imsg_forward() rewinds
the buffer internally, so multiple forwards per message keep working.

Drop the now-unused n parameter (all callers passed -1).

ok claudio@
This commit is contained in:
rsadowski
2026-06-14 08:37:00 +00:00
parent 076e2b1c1f
commit 2f0a999569
3 changed files with 39 additions and 26 deletions
+5 -5
View File
@@ -1,4 +1,4 @@
/* $OpenBSD: control.c,v 1.65 2026/03/02 19:28:01 rsadowski Exp $ */
/* $OpenBSD: control.c,v 1.66 2026/06/14 08:37:00 rsadowski Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -361,7 +361,7 @@ control_dispatch_imsg(int fd, short event, void *arg)
break;
case IMSG_CTL_SHUTDOWN:
case IMSG_CTL_RELOAD:
proc_forward_imsg(env->sc_ps, &imsg, PROC_PARENT, -1);
proc_forward_imsg(env->sc_ps, &imsg, PROC_PARENT);
break;
case IMSG_CTL_POLL:
proc_compose(env->sc_ps, PROC_HCE,
@@ -385,9 +385,9 @@ control_dispatch_imsg(int fd, short event, void *arg)
memcpy(&verbose, imsg.data, sizeof(verbose));
proc_forward_imsg(env->sc_ps, &imsg, PROC_PARENT, -1);
proc_forward_imsg(env->sc_ps, &imsg, PROC_HCE, -1);
proc_forward_imsg(env->sc_ps, &imsg, PROC_RELAY, -1);
proc_forward_imsg(env->sc_ps, &imsg, PROC_PARENT);
proc_forward_imsg(env->sc_ps, &imsg, PROC_HCE);
proc_forward_imsg(env->sc_ps, &imsg, PROC_RELAY);
memcpy(imsg.data, &verbose, sizeof(verbose));
control_imsg_forward(ps, &imsg);
+32 -19
View File
@@ -1,4 +1,4 @@
/* $OpenBSD: proc.c,v 1.53 2026/03/02 19:28:01 rsadowski Exp $ */
/* $OpenBSD: proc.c,v 1.54 2026/06/14 08:37:00 rsadowski Exp $ */
/*
* Copyright (c) 2010 - 2016 Reyk Floeter <reyk@openbsd.org>
@@ -599,7 +599,7 @@ proc_dispatch(int fd, short event, void *arg)
struct imsgbuf *ibuf;
struct imsg imsg;
ssize_t n;
int verbose;
int ver;
const char *title;
struct privsep_fd pf;
@@ -607,9 +607,11 @@ proc_dispatch(int fd, short event, void *arg)
ibuf = &iev->ibuf;
if (event & EV_READ) {
if ((n = imsgbuf_read(ibuf)) == -1)
switch (imsgbuf_read(ibuf)) {
case -1:
fatal("%s: imsgbuf_read", __func__);
if (n == 0) {
break;
case 0:
/* this pipe is dead, so remove the event handler */
event_del(&iev->ev);
event_loopexit(NULL);
@@ -630,15 +632,16 @@ proc_dispatch(int fd, short event, void *arg)
}
for (;;) {
if ((n = imsg_get(ibuf, &imsg)) == -1)
fatal("%s: imsg_get", __func__);
if ((n = imsgbuf_get(ibuf, &imsg)) == -1)
fatal("%s: imsgbuf_get", __func__);
if (n == 0)
break;
#if DEBUG > 1
log_debug("%s: %s %d got imsg %d peerid %d from %s %d",
__func__, title, ps->ps_instance + 1,
imsg.hdr.type, imsg.hdr.peerid, p->p_title, imsg.hdr.pid);
imsg_get_type(&imsg), imsg_get_id(&imsg),
p->p_title, imsg_get_pid(&imsg));
#endif
/*
@@ -653,24 +656,26 @@ proc_dispatch(int fd, short event, void *arg)
/*
* Generic message handling
*/
switch (imsg.hdr.type) {
switch (imsg_get_type(&imsg)) {
case IMSG_CTL_VERBOSE:
IMSG_SIZE_CHECK(&imsg, &verbose);
memcpy(&verbose, imsg.data, sizeof(verbose));
log_setverbose(verbose);
if (imsg_get_data(&imsg, &ver, sizeof(ver)) == -1)
fatalx("%s: imsg_get_data", __func__);
log_setverbose(ver);
break;
case IMSG_CTL_PROCFD:
IMSG_SIZE_CHECK(&imsg, &pf);
memcpy(&pf, imsg.data, sizeof(pf));
if (imsg_get_data(&imsg, &pf, sizeof(pf)) == -1)
fatalx("%s: imsg_get_data", __func__);
proc_accept(ps, imsg_get_fd(&imsg), pf.pf_procid,
pf.pf_instance);
pf.pf_instance);
break;
default:
fatalx("%s: %s %d got invalid imsg %d peerid %d "
"from %s %d",
__func__, title, ps->ps_instance + 1,
imsg.hdr.type, imsg.hdr.peerid,
p->p_title, imsg.hdr.pid);
imsg_get_type(&imsg), imsg_get_id(&imsg),
p->p_title, imsg_get_pid(&imsg));
}
imsg_free(&imsg);
}
@@ -790,10 +795,18 @@ proc_composev(struct privsep *ps, enum privsep_procid id,
int
proc_forward_imsg(struct privsep *ps, struct imsg *imsg,
enum privsep_procid id, int n)
enum privsep_procid id)
{
return (proc_compose_imsg(ps, id, n, imsg->hdr.type,
imsg->hdr.peerid, -1, imsg->data, IMSG_DATA_SIZE(imsg)));
int m, n = -1;
proc_range(ps, id, &n, &m);
for (; n < m; n++) {
if (imsg_forward(&ps->ps_ievs[id][n].ibuf, imsg) == -1)
return (-1);
imsg_event_add(&ps->ps_ievs[id][n]);
}
return (0);
}
struct imsgbuf *
+2 -2
View File
@@ -1,4 +1,4 @@
/* $OpenBSD: relayd.h,v 1.280 2026/06/03 19:26:56 rsadowski Exp $ */
/* $OpenBSD: relayd.h,v 1.281 2026/06/14 08:37:00 rsadowski Exp $ */
/*
* Copyright (c) 2006 - 2016 Reyk Floeter <reyk@openbsd.org>
@@ -1423,7 +1423,7 @@ int proc_composev_imsg(struct privsep *, enum privsep_procid, int,
int proc_composev(struct privsep *, enum privsep_procid,
uint16_t, const struct iovec *, int);
int proc_forward_imsg(struct privsep *, struct imsg *,
enum privsep_procid, int);
enum privsep_procid);
struct imsgbuf *
proc_ibuf(struct privsep *, enum privsep_procid, int);
struct imsgev *