diff options
author | Henning Brauer <henning@cvs.openbsd.org> | 2004-01-01 23:09:10 +0000 |
---|---|---|
committer | Henning Brauer <henning@cvs.openbsd.org> | 2004-01-01 23:09:10 +0000 |
commit | b0fe3d62ce222a08711e8e5b1baac92a3a38274f (patch) | |
tree | 32de7a4f9362cf82034eac9437c4cf7d6cc00ab3 /usr.sbin | |
parent | 6cabb1abe96ce74073c96812753fe62daa7f8a68 (diff) |
now that imsg_get uses bigger buffers, one read call can put more than one
imsg into the buffer. since imsg_get by definition only returns one imsg we
missed the next imsg(s) until the next poll event on the socket in question,
building up a queue on that socket. didn't show up as a problem yet...
factor out imsg_read, which reads into the buffer. imsg_get now entirely
operates on the buffers and does not read(2) itself.
make all callers cope by calling imsg_read on poll events and calling
imsg_get in a loop until all imsgs are processed.
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/bgpd/bgpd.c | 12 | ||||
-rw-r--r-- | usr.sbin/bgpd/bgpd.h | 3 | ||||
-rw-r--r-- | usr.sbin/bgpd/imsg.c | 25 | ||||
-rw-r--r-- | usr.sbin/bgpd/rde.c | 14 | ||||
-rw-r--r-- | usr.sbin/bgpd/session.c | 14 |
5 files changed, 49 insertions, 19 deletions
diff --git a/usr.sbin/bgpd/bgpd.c b/usr.sbin/bgpd/bgpd.c index fb2cbd6ea79..370d8948948 100644 --- a/usr.sbin/bgpd/bgpd.c +++ b/usr.sbin/bgpd/bgpd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bgpd.c,v 1.47 2003/12/30 22:42:31 henning Exp $ */ +/* $OpenBSD: bgpd.c,v 1.48 2004/01/01 23:09:08 henning Exp $ */ /* * Copyright (c) 2003 Henning Brauer <henning@openbsd.org> @@ -340,10 +340,16 @@ dispatch_imsg(struct imsgbuf *ibuf, int idx, struct mrt_config *conf) int n; in_addr_t ina; - if ((n = imsg_get(ibuf, &imsg)) == -1) + if (imsg_read(ibuf) == -1) return (-1); - if (n > 0) { + for (;;) { + if ((n = imsg_get(ibuf, &imsg)) == -1) + return (-1); + + if (n == 0) + break; + switch (imsg.hdr.type) { case IMSG_MRT_MSG: case IMSG_MRT_END: diff --git a/usr.sbin/bgpd/bgpd.h b/usr.sbin/bgpd/bgpd.h index 0c3a48dada9..8e766659d9e 100644 --- a/usr.sbin/bgpd/bgpd.h +++ b/usr.sbin/bgpd/bgpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bgpd.h,v 1.44 2003/12/28 14:34:30 henning Exp $ */ +/* $OpenBSD: bgpd.h,v 1.45 2004/01/01 23:09:08 henning Exp $ */ /* * Copyright (c) 2003 Henning Brauer <henning@openbsd.org> @@ -294,6 +294,7 @@ int merge_config(struct bgpd_config *, struct bgpd_config *); /* imsg.c */ void imsg_init(struct imsgbuf *, int); +int imsg_read(struct imsgbuf *); int imsg_get(struct imsgbuf *, struct imsg *); int imsg_compose(struct imsgbuf *, int, u_int32_t, void *, u_int16_t); void imsg_free(struct imsg *); diff --git a/usr.sbin/bgpd/imsg.c b/usr.sbin/bgpd/imsg.c index ed80e399c45..5201c8fc353 100644 --- a/usr.sbin/bgpd/imsg.c +++ b/usr.sbin/bgpd/imsg.c @@ -1,4 +1,4 @@ -/* $OpenBSD: imsg.c,v 1.14 2003/12/30 22:42:31 henning Exp $ */ +/* $OpenBSD: imsg.c,v 1.15 2004/01/01 23:09:09 henning Exp $ */ /* * Copyright (c) 2003 Henning Brauer <henning@openbsd.org> @@ -35,10 +35,9 @@ imsg_init(struct imsgbuf *ibuf, int sock) } int -imsg_get(struct imsgbuf *ibuf, struct imsg *imsg) +imsg_read(struct imsgbuf *ibuf) { - ssize_t n, datalen = 0; - size_t av, left; + ssize_t n; if ((n = read(ibuf->sock, ibuf->r.buf + ibuf->r.wpos, sizeof(ibuf->r.buf) - ibuf->r.wpos)) == -1) { @@ -52,10 +51,22 @@ imsg_get(struct imsgbuf *ibuf, struct imsg *imsg) logit(LOG_CRIT, "imsg_get: pipe close"); return (-1); } - av = ibuf->r.wpos + n; + + ibuf->r.wpos += n; + + return (0); +} + +int +imsg_get(struct imsgbuf *ibuf, struct imsg *imsg) +{ + ssize_t datalen = 0; + size_t av, left; + + av = ibuf->r.wpos; if (IMSG_HEADER_SIZE > av) - return (-1); + return (0); memcpy(&imsg->hdr, ibuf->r.buf, sizeof(imsg->hdr)); if (imsg->hdr.len < IMSG_HEADER_SIZE || @@ -64,7 +75,7 @@ imsg_get(struct imsgbuf *ibuf, struct imsg *imsg) return (-1); } if (imsg->hdr.len > av) - return (-1); + return (0); datalen = imsg->hdr.len - IMSG_HEADER_SIZE; ibuf->r.rptr = ibuf->r.buf + IMSG_HEADER_SIZE; if ((imsg->data = malloc(datalen)) == NULL) { diff --git a/usr.sbin/bgpd/rde.c b/usr.sbin/bgpd/rde.c index e8b1248f1db..236589583be 100644 --- a/usr.sbin/bgpd/rde.c +++ b/usr.sbin/bgpd/rde.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.c,v 1.39 2003/12/27 00:53:51 henning Exp $ */ +/* $OpenBSD: rde.c,v 1.40 2004/01/01 23:09:09 henning Exp $ */ /* * Copyright (c) 2003 Henning Brauer <henning@openbsd.org> @@ -176,10 +176,16 @@ rde_dispatch_imsg(struct imsgbuf *ibuf, int idx) u_int32_t rid; int n; - if ((n = imsg_get(ibuf, &imsg)) == -1) - fatal("imsg_get error"); + if (imsg_read(ibuf) == -1) + fatal("rde_dispatch_imsg: imsg_read error"); + + for (;;) { + if ((n = imsg_get(ibuf, &imsg)) == -1) + fatal("rde_dispatch_imsg: imsg_read error"); + + if (n == 0) + break; - if (n > 0) { switch (imsg.hdr.type) { case IMSG_RECONF_CONF: if (idx != PFD_PIPE_MAIN) diff --git a/usr.sbin/bgpd/session.c b/usr.sbin/bgpd/session.c index 7b49c972403..1bc5f7b08a8 100644 --- a/usr.sbin/bgpd/session.c +++ b/usr.sbin/bgpd/session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: session.c,v 1.52 2003/12/30 21:05:09 henning Exp $ */ +/* $OpenBSD: session.c,v 1.53 2004/01/01 23:09:09 henning Exp $ */ /* * Copyright (c) 2003 Henning Brauer <henning@openbsd.org> @@ -1250,10 +1250,16 @@ session_dispatch_imsg(struct imsgbuf *ibuf, int idx) enum reconf_action reconf; int n; - if ((n = imsg_get(ibuf, &imsg)) == -1) - fatal("imsg_get error"); + if (imsg_read(ibuf) == -1) + fatal("session_dispatch_imsg: imsg_read error"); + + for (;;) { + if ((n = imsg_get(ibuf, &imsg)) == -1) + fatal("session_dispatch_imsg: imsg_get error"); + + if (n == 0) + break; - if (n > 0) { switch (imsg.hdr.type) { case IMSG_RECONF_CONF: if (idx != PFD_PIPE_MAIN) |