1 /* $OpenBSD: src/usr.sbin/ntpd/buffer.c,v 1.6 2005/03/23 11:36:35 henning Exp $ */
4 * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/types.h>
31 void buf_enqueue(struct msgbuf *, struct buf *);
32 void buf_dequeue(struct msgbuf *, struct buf *);
39 if ((buf = calloc(1, sizeof(struct buf))) == NULL)
41 if ((buf->buf = malloc(len)) == NULL) {
51 buf_add(struct buf *buf, void *data, size_t len)
53 if (buf->wpos + len > buf->size)
56 memcpy(buf->buf + buf->wpos, data, len);
62 buf_close(struct msgbuf *msgbuf, struct buf *buf)
64 buf_enqueue(msgbuf, buf);
69 buf_free(struct buf *buf)
76 msgbuf_init(struct msgbuf *msgbuf)
80 TAILQ_INIT(&msgbuf->bufs);
84 msgbuf_clear(struct msgbuf *msgbuf)
88 while ((buf = TAILQ_FIRST(&msgbuf->bufs)) != NULL)
89 buf_dequeue(msgbuf, buf);
93 msgbuf_write(struct msgbuf *msgbuf)
95 struct iovec iov[IOV_MAX];
96 struct buf *buf, *next;
100 bzero(&iov, sizeof(iov));
101 TAILQ_FOREACH(buf, &msgbuf->bufs, entries) {
104 iov[i].iov_base = buf->buf + buf->rpos;
105 iov[i].iov_len = buf->size - buf->rpos;
109 if ((n = writev(msgbuf->fd, iov, i)) == -1) {
110 if (errno == EAGAIN) /* cannot write immediately */
116 if (n == 0) { /* connection closed */
121 for (buf = TAILQ_FIRST(&msgbuf->bufs); buf != NULL && n > 0;
123 next = TAILQ_NEXT(buf, entries);
124 if (buf->rpos + n >= buf->size) {
125 n -= buf->size - buf->rpos;
126 buf_dequeue(msgbuf, buf);
137 buf_enqueue(struct msgbuf *msgbuf, struct buf *buf)
139 TAILQ_INSERT_TAIL(&msgbuf->bufs, buf, entries);
144 buf_dequeue(struct msgbuf *msgbuf, struct buf *buf)
146 TAILQ_REMOVE(&msgbuf->bufs, buf, entries);