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
);