about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRichard Nyberg <rnyberg@murmeldjur.se>2005-07-17 18:33:16 +0000
committerRichard Nyberg <rnyberg@murmeldjur.se>2005-07-17 18:33:16 +0000
commit47aa24ceaf4f711afbfab36e070df098b1f892a2 (patch)
tree834e1c8189101b8444f3b87d32e1ed399aef797b
parentba425dc31afb44dbb349d7d596b6b8f77412ef53 (diff)
downloadbtpd-47aa24ceaf4f711afbfab36e070df098b1f892a2.tar.gz
btpd-47aa24ceaf4f711afbfab36e070df098b1f892a2.zip
Add net_read_to_buf getting rid of some common code. I should make
net_generic_read use a real io_buffer and this function too.

-rw-r--r--btpd/net.c43
1 files changed, 20 insertions, 23 deletions
diff --git a/btpd/net.c b/btpd/net.c
index 719c57c..761e152 100644
--- a/btpd/net.c
+++ b/btpd/net.c
@@ -453,6 +453,21 @@ net_read(struct peer *p, char *buf, size_t len)
 	return nread;
 }
 
+static size_t
+net_read_to_buf(struct peer *p, struct io_buffer *iob, unsigned long rmax)
+{
+    if (rmax == 0)
+	rmax = iob->buf_len - iob->buf_off;
+    else
+	rmax = min(rmax, iob->buf_len - iob->buf_off);
+
+    assert(rmax > 0);
+    size_t nread = net_read(p, iob->buf + iob->buf_off, rmax);
+    if (nread > 0)
+	iob->buf_off += nread;
+    return nread;
+}
+
 void
 kill_bitfield(struct input_reader *rd)
 {
@@ -464,17 +479,12 @@ static void net_generic_reader(struct peer *p);
 static unsigned long
 read_bitfield(struct peer *p, unsigned long rmax)
 {
-    ssize_t nread;
     struct bitfield_reader *rd = (struct bitfield_reader *)p->reader;
-    if (rmax == 0)
-	rmax = rd->iob.buf_len - rd->iob.buf_off;
-    else
-	rmax = min(rmax, rd->iob.buf_len - rd->iob.buf_off);
 
-    if ((nread = net_read(p, rd->iob.buf + rd->iob.buf_off, rmax)) == 0)
+    size_t nread = net_read_to_buf(p, &rd->iob, rmax);
+    if (nread == 0)
 	return 0;
 
-    rd->iob.buf_off += nread;
     if (rd->iob.buf_off == rd->iob.buf_len) {
 	peer_on_bitfield(p, rd->iob.buf);
 	free(rd);
@@ -494,17 +504,12 @@ kill_piece(struct input_reader *rd)
 static unsigned long
 read_piece(struct peer *p, unsigned long rmax)
 {
-    ssize_t nread;
     struct piece_reader *rd = (struct piece_reader *)p->reader;
-    if (rmax == 0)
-	rmax = rd->iob.buf_len - rd->iob.buf_off;
-    else
-	rmax = min(rmax, rd->iob.buf_len - rd->iob.buf_off);
 
-    if ((nread = net_read(p, rd->iob.buf + rd->iob.buf_off, rmax)) == 0)
+    size_t nread = net_read_to_buf(p, &rd->iob, rmax);
+    if (nread == 0)
 	return 0;
 
-    rd->iob.buf_off += nread;
     p->rate_to_me[btpd.seconds % RATEHISTORY] += nread;
     p->tp->downloaded += nread;
     if (rd->iob.buf_off == rd->iob.buf_len) {
@@ -734,21 +739,13 @@ net_generic_reader(struct peer *p)
 static unsigned long
 net_shake_read(struct peer *p, unsigned long rmax)
 {
-    ssize_t nread;
     struct handshake *hs = (struct handshake *)p->reader;
     struct io_buffer *in = &hs->in;
 
-    if (rmax == 0)
-	rmax = in->buf_len - in->buf_off;
-    else
-	rmax = min(rmax, in->buf_len - in->buf_off);
-
-    nread = net_read(p, in->buf + in->buf_off, rmax);
+    size_t nread = net_read_to_buf(p, in, rmax);
     if (nread == 0)
 	return 0;
 
-    in->buf_off += nread;
-
     switch (hs->state) {
     case SHAKE_INIT:
 	if (in->buf_off < 20)