so, msgbuf_write can now (again) return EAGAIN. some daemons have been fixed/adopted, some not. I did a full audit of the tree for all msgbuf_write users EAGAIN handling - this is the result.
Index: usr.sbin/dvmrpd/control.c =================================================================== RCS file: /cvs/src/usr.sbin/dvmrpd/control.c,v retrieving revision 1.17 diff -u -p -r1.17 control.c --- usr.sbin/dvmrpd/control.c 11 Mar 2013 17:40:11 -0000 1.17 +++ usr.sbin/dvmrpd/control.c 20 Nov 2013 08:18:05 -0000 @@ -229,7 +229,7 @@ control_dispatch_imsg(int fd, short even } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) == -1) { + if (msgbuf_write(&c->iev.ibuf.w) == -1 && errno != EAGAIN) { control_close(fd); return; } Index: usr.sbin/dvmrpd/dvmrpd.c =================================================================== RCS file: /cvs/src/usr.sbin/dvmrpd/dvmrpd.c,v retrieving revision 1.14 diff -u -p -r1.14 dvmrpd.c --- usr.sbin/dvmrpd/dvmrpd.c 20 Aug 2011 19:02:28 -0000 1.14 +++ usr.sbin/dvmrpd/dvmrpd.c 20 Nov 2013 08:10:34 -0000 @@ -366,7 +366,7 @@ main_dispatch_dvmrpe(int fd, short event fatalx("pipe closed"); } if (event & EV_WRITE) { - if (msgbuf_write(&ibuf->w) == -1) + if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("msgbuf_write"); } @@ -419,7 +419,7 @@ main_dispatch_rde(int fd, short event, v fatalx("pipe closed"); } if (event & EV_WRITE) { - if (msgbuf_write(&ibuf->w) == -1) + if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("msgbuf_write"); } Index: usr.sbin/dvmrpd/dvmrpe.c =================================================================== RCS file: /cvs/src/usr.sbin/dvmrpd/dvmrpe.c,v retrieving revision 1.10 diff -u -p -r1.10 dvmrpe.c --- usr.sbin/dvmrpd/dvmrpe.c 4 Jul 2011 04:34:14 -0000 1.10 +++ usr.sbin/dvmrpd/dvmrpe.c 20 Nov 2013 08:12:35 -0000 @@ -1,4 +1,4 @@ -/* $OpenBSD: dvmrpe.c,v 1.9 2010/05/26 13:56:07 nicm Exp $ */ +/* $OpenBSD: dvmrpe.c,v 1.10 2011/07/04 04:34:14 claudio Exp $ */ /* * Copyright (c) 2005 Claudio Jeker <clau...@openbsd.org> @@ -249,7 +249,7 @@ dvmrpe_dispatch_main(int fd, short event fatalx("pipe closed"); } if (event & EV_WRITE) { - if (msgbuf_write(&ibuf->w) == -1) + if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("msgbuf_write"); } @@ -314,7 +314,7 @@ dvmrpe_dispatch_rde(int fd, short event, fatalx("pipe closed"); } if (event & EV_WRITE) { - if (msgbuf_write(&ibuf->w) == -1) + if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("msgbuf_write"); } Index: usr.sbin/dvmrpd/rde.c =================================================================== RCS file: /cvs/src/usr.sbin/dvmrpd/rde.c,v retrieving revision 1.22 diff -u -p -r1.22 rde.c --- usr.sbin/dvmrpd/rde.c 2 Nov 2009 20:31:50 -0000 1.22 +++ usr.sbin/dvmrpd/rde.c 20 Nov 2013 08:12:57 -0000 @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.c,v 1.21 2009/09/06 09:52:14 michele Exp $ */ +/* $OpenBSD: rde.c,v 1.22 2009/11/02 20:31:50 claudio Exp $ */ /* * Copyright (c) 2004, 2005 Claudio Jeker <clau...@openbsd.org> @@ -209,7 +209,7 @@ rde_dispatch_imsg(int fd, short event, v fatalx("pipe closed"); } if (event & EV_WRITE) { - if (msgbuf_write(&ibuf->w) == -1) + if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("msgbuf_write"); } Index: usr.sbin/ldapd/imsgev.c =================================================================== RCS file: /cvs/src/usr.sbin/ldapd/imsgev.c,v retrieving revision 1.2 diff -u -p -r1.2 imsgev.c --- usr.sbin/ldapd/imsgev.c 16 Jun 2012 00:08:32 -0000 1.2 +++ usr.sbin/ldapd/imsgev.c 20 Nov 2013 08:38:48 -0000 @@ -138,7 +138,7 @@ imsgev_dispatch(int fd, short ev, void * * closed, or some error occured. Both case are not recoverable * from the imsg perspective, so we treat it as a WRITE error. */ - if ((n = msgbuf_write(&ibuf->w)) != 1) { + if ((n = msgbuf_write(&ibuf->w)) != 1 && errno != EAGAIN) { imsgev_disconnect(iev, IMSGEV_EWRITE); return; } Index: usr.sbin/ldpd/control.c =================================================================== RCS file: /cvs/src/usr.sbin/ldpd/control.c,v retrieving revision 1.12 diff -u -p -r1.12 control.c --- usr.sbin/ldpd/control.c 4 Jun 2013 02:25:28 -0000 1.12 +++ usr.sbin/ldpd/control.c 20 Nov 2013 08:16:39 -0000 @@ -209,7 +209,7 @@ control_dispatch_imsg(int fd, short even } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) == -1) { + if (msgbuf_write(&c->iev.ibuf.w) == -1 && errno != EAGAIN) { control_close(fd); return; } Index: usr.sbin/ldpd/lde.c =================================================================== RCS file: /cvs/src/usr.sbin/ldpd/lde.c,v retrieving revision 1.27 diff -u -p -r1.27 lde.c --- usr.sbin/ldpd/lde.c 15 Oct 2013 20:36:30 -0000 1.27 +++ usr.sbin/ldpd/lde.c 20 Nov 2013 08:31:33 -0000 @@ -211,7 +211,7 @@ lde_dispatch_imsg(int fd, short event, v shut = 1; } if (event & EV_WRITE) { - if (msgbuf_write(&ibuf->w) == -1) + if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("msgbuf_write"); } @@ -367,7 +367,7 @@ lde_dispatch_parent(int fd, short event, shut = 1; } if (event & EV_WRITE) { - if (msgbuf_write(&ibuf->w) == -1) + if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("msgbuf_write"); } Index: usr.sbin/ldpd/ldpd.c =================================================================== RCS file: /cvs/src/usr.sbin/ldpd/ldpd.c,v retrieving revision 1.18 diff -u -p -r1.18 ldpd.c --- usr.sbin/ldpd/ldpd.c 15 Oct 2013 20:21:25 -0000 1.18 +++ usr.sbin/ldpd/ldpd.c 20 Nov 2013 08:38:48 -0000 @@ -339,7 +339,7 @@ main_dispatch_ldpe(int fd, short event, shut = 1; } if (event & EV_WRITE) { - if (msgbuf_write(&ibuf->w) == -1) + if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("msgbuf_write"); } @@ -415,7 +415,7 @@ main_dispatch_lde(int fd, short event, v shut = 1; } if (event & EV_WRITE) { - if (msgbuf_write(&ibuf->w) == -1) + if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("msgbuf_write"); } Index: usr.sbin/ldpd/ldpe.c =================================================================== RCS file: /cvs/src/usr.sbin/ldpd/ldpe.c,v retrieving revision 1.22 diff -u -p -r1.22 ldpe.c --- usr.sbin/ldpd/ldpe.c 17 Oct 2013 17:52:21 -0000 1.22 +++ usr.sbin/ldpd/ldpe.c 20 Nov 2013 08:32:21 -0000 @@ -330,7 +330,7 @@ ldpe_dispatch_main(int fd, short event, shut = 1; } if (event & EV_WRITE) { - if (msgbuf_write(&ibuf->w) == -1) + if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("ldpe_dispatch_main: msgbuf_write"); } @@ -470,7 +470,7 @@ ldpe_dispatch_lde(int fd, short event, v shut = 1; } if (event & EV_WRITE) { - if (msgbuf_write(&ibuf->w) == -1) + if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("ldpe_dispatch_lde: msgbuf_write"); } Index: usr.sbin/ldpd/packet.c =================================================================== RCS file: /cvs/src/usr.sbin/ldpd/packet.c,v retrieving revision 1.33 diff -u -p -r1.33 packet.c --- usr.sbin/ldpd/packet.c 17 Oct 2013 17:47:05 -0000 1.33 +++ usr.sbin/ldpd/packet.c 20 Nov 2013 08:38:47 -0000 @@ -507,7 +507,7 @@ session_write(int fd, short event, void struct nbr *nbr = tcp->nbr; if (event & EV_WRITE) { - if (msgbuf_write(&tcp->wbuf.wbuf) == -1) { + if (msgbuf_write(&tcp->wbuf.wbuf) == -1 && errno != EAGAIN) { if (nbr) nbr_fsm(nbr, NBR_EVT_CLOSE_SESSION); } Index: usr.sbin/ripd/ripe.c =================================================================== RCS file: /cvs/src/usr.sbin/ripd/ripe.c,v retrieving revision 1.14 diff -u -p -r1.14 ripe.c --- usr.sbin/ripd/ripe.c 4 Jul 2011 04:34:14 -0000 1.14 +++ usr.sbin/ripd/ripe.c 20 Nov 2013 08:38:47 -0000 @@ -1,4 +1,4 @@ -/* $OpenBSD: ripe.c,v 1.13 2010/05/26 13:56:08 nicm Exp $ */ +/* $OpenBSD: ripe.c,v 1.14 2011/07/04 04:34:14 claudio Exp $ */ /* * Copyright (c) 2006 Michele Marchetto <myde...@openbeer.it> @@ -240,7 +240,7 @@ ripe_dispatch_main(int fd, short event, shut = 1; } if (event & EV_WRITE) { - if (msgbuf_write(&ibuf->w) == -1) + if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("msgbuf_write"); } @@ -318,7 +318,7 @@ ripe_dispatch_rde(int fd, short event, v shut = 1; } if (event & EV_WRITE) { - if (msgbuf_write(&ibuf->w) == -1) + if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("msgbuf_write"); } Index: usr.sbin/smtpd/enqueue.c =================================================================== RCS file: /cvs/src/usr.sbin/smtpd/enqueue.c,v retrieving revision 1.69 diff -u -p -r1.69 enqueue.c --- usr.sbin/smtpd/enqueue.c 25 Oct 2013 21:31:23 -0000 1.69 +++ usr.sbin/smtpd/enqueue.c 20 Nov 2013 08:38:46 -0000 @@ -705,7 +705,7 @@ open_connection(void) imsg_compose(ibuf, IMSG_SMTP_ENQUEUE_FD, IMSG_VERSION, 0, -1, NULL, 0); while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) < 0) + if (msgbuf_write(&ibuf->w) < 0 && errno != EAGAIN) err(1, "write error"); while (1) { Index: usr.sbin/snmpd/control.c =================================================================== RCS file: /cvs/src/usr.sbin/snmpd/control.c,v retrieving revision 1.20 diff -u -p -r1.20 control.c --- usr.sbin/snmpd/control.c 13 Nov 2013 20:45:19 -0000 1.20 +++ usr.sbin/snmpd/control.c 20 Nov 2013 08:59:10 -0000 @@ -252,8 +252,7 @@ control_dispatch_imsg(int fd, short even control_close(fd, cs); return; } - imsg_event_add(&c->iev); - return; + break; default: fatalx("unknown event"); } Index: usr.sbin/ypldap/ldapclient.c =================================================================== RCS file: /cvs/src/usr.sbin/ypldap/ldapclient.c,v retrieving revision 1.27 diff -u -p -r1.27 ldapclient.c --- usr.sbin/ypldap/ldapclient.c 30 Apr 2013 05:14:59 -0000 1.27 +++ usr.sbin/ypldap/ldapclient.c 20 Nov 2013 08:38:43 -0000 @@ -174,7 +174,7 @@ client_dispatch_dns(int fd, short event, shut = 1; break; case EV_WRITE: - if (msgbuf_write(&ibuf->w) == -1) + if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("msgbuf_write"); imsg_event_add(iev); return; @@ -276,7 +276,7 @@ client_dispatch_parent(int fd, short eve shut = 1; break; case EV_WRITE: - if (msgbuf_write(&ibuf->w) == -1) + if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("msgbuf_write"); imsg_event_add(iev); return;