[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