[ds6-devel] nc6/src circ_buf.c,1.9,1.10 circ_buf.h,1.8,1.9
chris@deepspace6.net
chris@deepspace6.net
Fri Dec 27 15:56:53 2002
Update of /cvs/nc6/src
Modified Files:
circ_buf.c circ_buf.h
Log Message:
Rounded off circ_buf api by adding cb_recv (companion to cb_send) and
cb_extract (companion to cb_append).
Index: circ_buf.c
===================================================================
RCS file: /cvs/nc6/src/circ_buf.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- circ_buf.c 24 Dec 2002 23:47:24 -0000 1.9
+++ circ_buf.c 27 Dec 2002 15:56:51 -0000 1.10
@@ -129,6 +129,68 @@
+ssize_t cb_recv(circ_buf *cb, int fd, struct sockaddr *from, size_t *fromlen)
+{
+ ssize_t rr;
+ int count;
+ struct iovec iov[2];
+ struct msghdr msg;
+
+ cb_assert(cb);
+
+ /* buffer is full, return an error condition */
+ if (cb_is_full(cb)) return -1;
+
+ /* prepare for writing to buffer */
+ if (cb->ptr == cb->buf) {
+ /* space only at end of buf */
+ iov->iov_base = cb->ptr + cb->data_size;
+ iov->iov_len = cb->buf_size - cb->data_size;
+ count = 1;
+ } else if (cb->ptr + cb->data_size >= cb->buf + cb->buf_size) {
+ /* space only before cb->ptr */
+ iov->iov_base = cb->ptr + cb->data_size - cb->buf_size;
+ iov->iov_len = cb->buf_size - cb->data_size;
+ count = 1;
+ } else {
+ /* space at end and begining of buf */
+ iov[0].iov_base = cb->ptr + cb->data_size;
+ iov[0].iov_len = (cb->buf_size - cb->data_size)
+ - (cb->ptr - cb->buf);
+ iov[1].iov_base = cb->buf;
+ iov[1].iov_len = cb->ptr - cb->buf;
+ count = 2;
+ }
+
+ memset(&msg, 0, sizeof(msg));
+ msg.msg_name = (void *)from;
+ msg.msg_namelen = (from && fromlen)? *fromlen : 0;
+ msg.msg_iov = iov;
+ msg.msg_iovlen = count;
+
+ /* do the actual recv */
+ do {
+ errno = 0;
+ rr = recvmsg(fd, &msg, 0);
+ /* copy out updated namelen */
+ if (from && fromlen) *fromlen = msg.msg_namelen;
+ } while (errno == EINTR);
+
+ /* if rr < 0 an error has occured,
+ * if rr = 0 nothing needs to be changed.
+ * update internal stuff only if rr > 0 */
+ if (rr > 0) {
+ cb->data_size += rr;
+
+ /* sanity check */
+ cb_assert(cb);
+ }
+
+ return rr;
+}
+
+
+
ssize_t cb_append(circ_buf *cb, const uint8_t *buf, size_t len)
{
ssize_t rr;
@@ -170,7 +232,7 @@
count = 2;
}
- /* do the actual write */
+ /* do the actual copy */
for (i = 0; i < count; ++i) {
size_t chunk_size;
@@ -277,7 +339,7 @@
msg.msg_iov = iov;
msg.msg_iovlen = count;
- /* do the actual write */
+ /* do the actual send */
do {
errno = 0;
rr = sendmsg(fd, &msg, 0);
@@ -295,6 +357,75 @@
if (cb->ptr >= cb->buf + cb->buf_size)
cb->ptr -= cb->buf_size;
+ /* sanity check */
[...71 lines suppressed...]
Index: circ_buf.h
===================================================================
RCS file: /cvs/nc6/src/circ_buf.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- circ_buf.h 24 Dec 2002 23:47:24 -0000 1.8
+++ circ_buf.h 27 Dec 2002 15:56:51 -0000 1.9
@@ -48,11 +48,13 @@
#define cb_is_full(CB) (cb_space(CB) == 0)
ssize_t cb_read(circ_buf *cb, int fd);
+ssize_t cb_recv(circ_buf *cb, int fd, struct sockaddr *from, size_t *fromlen);
ssize_t cb_write(circ_buf *cb, int fd);
ssize_t cb_send(circ_buf *cb, int fd, struct sockaddr *dest, size_t destlen);
ssize_t cb_append(circ_buf *cb, const uint8_t *buf, size_t len);
+ssize_t cb_extract(circ_buf *cb, uint8_t *buf, size_t len);
void cb_clear(circ_buf *cb);
More information about the ds6-devel
mailing list