summaryrefslogtreecommitdiff
path: root/net/openbgpd/files/patch-bgpd_buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/openbgpd/files/patch-bgpd_buffer.c')
-rw-r--r--net/openbgpd/files/patch-bgpd_buffer.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/net/openbgpd/files/patch-bgpd_buffer.c b/net/openbgpd/files/patch-bgpd_buffer.c
new file mode 100644
index 000000000000..692fe85c1687
--- /dev/null
+++ b/net/openbgpd/files/patch-bgpd_buffer.c
@@ -0,0 +1,104 @@
+Index: bgpd/buffer.c
+===================================================================
+RCS file: /home/cvs/private/hrs/openbgpd/bgpd/buffer.c,v
+retrieving revision 1.1.1.7
+retrieving revision 1.3
+diff -u -p -r1.1.1.7 -r1.3
+--- bgpd/buffer.c 14 Feb 2010 20:19:57 -0000 1.1.1.7
++++ bgpd/buffer.c 8 Dec 2012 20:17:59 -0000 1.3
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: buffer.c,v 1.43 2009/06/06 06:33:15 eric Exp $ */
++/* $OpenBSD: buffer.c,v 1.44 2009/07/23 18:58:42 eric Exp $ */
+
+ /*
+ * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
+@@ -144,7 +144,7 @@ int
+ buf_write(struct msgbuf *msgbuf)
+ {
+ struct iovec iov[IOV_MAX];
+- struct buf *buf, *next;
++ struct buf *buf;
+ unsigned int i = 0;
+ ssize_t n;
+
+@@ -153,7 +153,7 @@ buf_write(struct msgbuf *msgbuf)
+ if (i >= IOV_MAX)
+ break;
+ iov[i].iov_base = buf->buf + buf->rpos;
+- iov[i].iov_len = buf->size - buf->rpos;
++ iov[i].iov_len = buf->wpos - buf->rpos;
+ i++;
+ }
+
+@@ -170,17 +170,7 @@ buf_write(struct msgbuf *msgbuf)
+ return (-2);
+ }
+
+- for (buf = TAILQ_FIRST(&msgbuf->bufs); buf != NULL && n > 0;
+- buf = next) {
+- next = TAILQ_NEXT(buf, entry);
+- if (buf->rpos + n >= buf->size) {
+- n -= buf->size - buf->rpos;
+- buf_dequeue(msgbuf, buf);
+- } else {
+- buf->rpos += n;
+- n = 0;
+- }
+- }
++ msgbuf_drain(msgbuf, n);
+
+ return (0);
+ }
+@@ -201,6 +191,24 @@ msgbuf_init(struct msgbuf *msgbuf)
+ }
+
+ void
++msgbuf_drain(struct msgbuf *msgbuf, size_t n)
++{
++ struct buf *buf, *next;
++
++ for (buf = TAILQ_FIRST(&msgbuf->bufs); buf != NULL && n > 0;
++ buf = next) {
++ next = TAILQ_NEXT(buf, entry);
++ if (buf->rpos + n >= buf->wpos) {
++ n -= buf->wpos - buf->rpos;
++ buf_dequeue(msgbuf, buf);
++ } else {
++ buf->rpos += n;
++ n = 0;
++ }
++ }
++}
++
++void
+ msgbuf_clear(struct msgbuf *msgbuf)
+ {
+ struct buf *buf;
+@@ -213,7 +221,7 @@ int
+ msgbuf_write(struct msgbuf *msgbuf)
+ {
+ struct iovec iov[IOV_MAX];
+- struct buf *buf, *next;
++ struct buf *buf;
+ unsigned int i = 0;
+ ssize_t n;
+ struct msghdr msg;
+@@ -270,17 +278,7 @@ msgbuf_write(struct msgbuf *msgbuf)
+ buf->fd = -1;
+ }
+
+- for (buf = TAILQ_FIRST(&msgbuf->bufs); buf != NULL && n > 0;
+- buf = next) {
+- next = TAILQ_NEXT(buf, entry);
+- if (buf->rpos + n >= buf->wpos) {
+- n -= buf->wpos - buf->rpos;
+- buf_dequeue(msgbuf, buf);
+- } else {
+- buf->rpos += n;
+- n = 0;
+- }
+- }
++ msgbuf_drain(msgbuf, n);
+
+ return (0);
+ }