diff options
author | Hiroki Sato <hrs@FreeBSD.org> | 2010-02-16 19:27:03 +0000 |
---|---|---|
committer | Hiroki Sato <hrs@FreeBSD.org> | 2010-02-16 19:27:03 +0000 |
commit | 7ab9a19af615666cef45e1b4538c8460d19e1ec0 (patch) | |
tree | 301a68c22691daf3b616754a383cd1730c23dae7 /net/openbgpd/files/patch-bgpd_buffer.c | |
parent | Add updating instructions for sysutils/bacula-{server,client}. (diff) |
Update to 4.6.20100215.
Feature safe: yes
Notes
Notes:
svn path=/head/; revision=249966
Diffstat (limited to 'net/openbgpd/files/patch-bgpd_buffer.c')
-rw-r--r-- | net/openbgpd/files/patch-bgpd_buffer.c | 233 |
1 files changed, 39 insertions, 194 deletions
diff --git a/net/openbgpd/files/patch-bgpd_buffer.c b/net/openbgpd/files/patch-bgpd_buffer.c index ccb9dc1d71bd..875b789f68b3 100644 --- a/net/openbgpd/files/patch-bgpd_buffer.c +++ b/net/openbgpd/files/patch-bgpd_buffer.c @@ -1,191 +1,55 @@ Index: bgpd/buffer.c =================================================================== RCS file: /home/cvs/private/hrs/openbgpd/bgpd/buffer.c,v -retrieving revision 1.1.1.1 -retrieving revision 1.1.1.4 -diff -u -p -r1.1.1.1 -r1.1.1.4 ---- bgpd/buffer.c 30 Jun 2009 05:46:15 -0000 1.1.1.1 -+++ bgpd/buffer.c 22 Oct 2009 14:24:02 -0000 1.1.1.4 +retrieving revision 1.1.1.7 +retrieving revision 1.1.1.8 +diff -u -p -r1.1.1.7 -r1.1.1.8 +--- bgpd/buffer.c 14 Feb 2010 20:19:57 -0000 1.1.1.7 ++++ bgpd/buffer.c 14 Feb 2010 20:27:06 -0000 1.1.1.8 @@ -1,4 +1,4 @@ --/* $OpenBSD: buffer.c,v 1.39 2008/03/24 16:11:02 deraadt Exp $ */ +-/* $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> -@@ -16,18 +16,19 @@ - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - --#include <sys/types.h> -+#include <sys/param.h> -+#include <sys/queue.h> -+#include <sys/socket.h> - #include <sys/uio.h> - - #include <errno.h> --#include <limits.h> --#include <stdio.h> - #include <stdlib.h> - #include <string.h> - #include <unistd.h> - --#include "bgpd.h" -+#include "imsg.h" - -+int buf_realloc(struct buf *, size_t); - void buf_enqueue(struct msgbuf *, struct buf *); - void buf_dequeue(struct msgbuf *, struct buf *); - -@@ -42,35 +43,55 @@ buf_open(size_t len) - free(buf); - return (NULL); - } -- buf->size = len; -+ buf->size = buf->max = len; - buf->fd = -1; - - return (buf); - } - - struct buf * --buf_grow(struct buf *buf, size_t len) -+buf_dynamic(size_t len, size_t max) - { -- void *p; -+ struct buf *buf; - -- if ((p = realloc(buf->buf, buf->size + len)) == NULL) { -- free(buf->buf); -- buf->buf = NULL; -- buf->size = 0; -+ if (max < len) - return (NULL); -- } - -- buf->buf = p; -- buf->size += len; -+ if ((buf = buf_open(len)) == NULL) -+ return (NULL); -+ -+ if (max > 0) -+ buf->max = max; - - return (buf); - } - - int -+buf_realloc(struct buf *buf, size_t len) -+{ -+ u_char *b; -+ -+ /* on static buffers max is eq size and so the following fails */ -+ if (buf->wpos + len > buf->max) { -+ errno = ENOMEM; -+ return (-1); -+ } -+ -+ b = realloc(buf->buf, buf->wpos + len); -+ if (b == NULL) -+ return (-1); -+ buf->buf = b; -+ buf->size = buf->wpos + len; -+ -+ return (0); -+} -+ -+int - buf_add(struct buf *buf, const void *data, size_t len) - { - if (buf->wpos + len > buf->size) -- return (-1); -+ if (buf_realloc(buf, len) == -1) -+ return (-1); - - memcpy(buf->buf + buf->wpos, data, len); - buf->wpos += len; -@@ -83,27 +104,60 @@ buf_reserve(struct buf *buf, size_t len) - void *b; - - if (buf->wpos + len > buf->size) -- return (NULL); -+ if (buf_realloc(buf, len) == -1) -+ return (NULL); - - b = buf->buf + buf->wpos; - buf->wpos += len; - return (b); - } - --int -+void * -+buf_seek(struct buf *buf, size_t pos, size_t len) -+{ -+ /* only allowed to seek in already written parts */ -+ if (pos + len > buf->wpos) -+ return (NULL); -+ -+ return (buf->buf + pos); -+} -+ -+size_t -+buf_size(struct buf *buf) -+{ -+ return (buf->wpos); -+} -+ -+size_t -+buf_left(struct buf *buf) -+{ -+ return (buf->max - buf->wpos); -+} -+ -+void - buf_close(struct msgbuf *msgbuf, struct buf *buf) - { - buf_enqueue(msgbuf, buf); -- return (1); - } - - int --buf_write(int sock, struct buf *buf) -+buf_write(struct msgbuf *msgbuf) +@@ -144,7 +144,7 @@ int + buf_write(struct msgbuf *msgbuf) { -+ struct iovec iov[IOV_MAX]; + struct iovec iov[IOV_MAX]; +- struct buf *buf, *next; + struct buf *buf; -+ unsigned int i = 0; + unsigned int i = 0; ssize_t n; -- if ((n = write(sock, buf->buf + buf->rpos, -- buf->size - buf->rpos)) == -1) { -+ bzero(&iov, sizeof(iov)); -+ TAILQ_FOREACH(buf, &msgbuf->bufs, entry) { -+ if (i >= IOV_MAX) -+ break; -+ iov[i].iov_base = buf->buf + buf->rpos; +@@ -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++; -+ } -+ -+ if ((n = writev(msgbuf->fd, iov, i)) == -1) { - if (errno == EAGAIN || errno == ENOBUFS || - errno == EINTR) /* try later */ - return (0); -@@ -116,11 +170,9 @@ buf_write(int sock, struct buf *buf) + i++; + } + +@@ -170,17 +170,7 @@ buf_write(struct msgbuf *msgbuf) return (-2); } -- if (buf->rpos + n < buf->size) { /* not all data written yet */ -- buf->rpos += n; -- return (0); -- } else -- return (1); +- 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); - } - void -@@ -139,6 +191,24 @@ msgbuf_init(struct msgbuf *msgbuf) + return (0); + } +@@ -201,6 +191,24 @@ msgbuf_init(struct msgbuf *msgbuf) } void @@ -210,43 +74,24 @@ diff -u -p -r1.1.1.1 -r1.1.1.4 msgbuf_clear(struct msgbuf *msgbuf) { struct buf *buf; -@@ -151,14 +221,14 @@ int +@@ -213,7 +221,7 @@ int msgbuf_write(struct msgbuf *msgbuf) { struct iovec iov[IOV_MAX]; - struct buf *buf, *next; -- int i = 0; + struct buf *buf; -+ unsigned int i = 0; + unsigned int i = 0; ssize_t n; struct msghdr msg; - struct cmsghdr *cmsg; - union { -- struct cmsghdr hdr; -- char buf[CMSG_SPACE(sizeof(int))]; -+ struct cmsghdr hdr; -+ char buf[CMSG_SPACE(sizeof(int))]; - } cmsgbuf; - - bzero(&iov, sizeof(iov)); -@@ -167,7 +237,7 @@ msgbuf_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++; - if (buf->fd != -1) - break; -@@ -208,17 +278,7 @@ msgbuf_write(struct msgbuf *msgbuf) +@@ -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->size) { -- n -= buf->size - buf->rpos; +- if (buf->rpos + n >= buf->wpos) { +- n -= buf->wpos - buf->rpos; - buf_dequeue(msgbuf, buf); - } else { - buf->rpos += n; |