Browse Source

Enclose repeated buffer draining code in a new msgbuf_drain()

function, which is additionally exported for use by others.
It will be needed by smtpd's SSL module when the SMTP client code
is changed to replace libevent's evbuffers with our msgbuf_* API.
ok gilles@ henning@ guenther@ eric@
OPENBSD_4_7
jacekm 15 years ago
parent
commit
3a304260b4
2 changed files with 25 additions and 26 deletions
  1. +23
    -25
      src/usr.sbin/ntpd/buffer.c
  2. +2
    -1
      src/usr.sbin/ntpd/imsg.h

+ 23
- 25
src/usr.sbin/ntpd/buffer.c View File

@ -1,4 +1,4 @@
/* $OpenBSD: buffer.c,v 1.11 2009/07/23 18:58:42 eric Exp $ */
/* $OpenBSD: buffer.c,v 1.12 2009/09/15 10:54:59 jacekm Exp $ */
/* /*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -144,7 +144,7 @@ int
buf_write(struct msgbuf *msgbuf) 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; ssize_t n;
@ -170,17 +170,7 @@ buf_write(struct msgbuf *msgbuf)
return (-2); return (-2);
} }
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); return (0);
} }
@ -200,6 +190,24 @@ msgbuf_init(struct msgbuf *msgbuf)
TAILQ_INIT(&msgbuf->bufs); TAILQ_INIT(&msgbuf->bufs);
} }
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 void
msgbuf_clear(struct msgbuf *msgbuf) msgbuf_clear(struct msgbuf *msgbuf)
{ {
@ -213,7 +221,7 @@ int
msgbuf_write(struct msgbuf *msgbuf) msgbuf_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; ssize_t n;
struct msghdr msg; struct msghdr msg;
@ -270,17 +278,7 @@ msgbuf_write(struct msgbuf *msgbuf)
buf->fd = -1; 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); return (0);
} }


+ 2
- 1
src/usr.sbin/ntpd/imsg.h View File

@ -1,4 +1,4 @@
/* $OpenBSD: imsg.h,v 1.3 2009/06/07 05:56:25 eric Exp $ */
/* $OpenBSD: imsg.h,v 1.4 2009/09/15 10:54:59 jacekm Exp $ */
/* /*
* Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org> * Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org>
@ -90,6 +90,7 @@ void buf_free(struct buf *);
void msgbuf_init(struct msgbuf *); void msgbuf_init(struct msgbuf *);
void msgbuf_clear(struct msgbuf *); void msgbuf_clear(struct msgbuf *);
int msgbuf_write(struct msgbuf *); int msgbuf_write(struct msgbuf *);
void msgbuf_drain(struct msgbuf *, size_t);
/* imsg.c */ /* imsg.c */
void imsg_init(struct imsgbuf *, int); void imsg_init(struct imsgbuf *, int);


Loading…
Cancel
Save