summary refs log tree commit diff
path: root/misc
diff options
context:
space:
mode:
authorRichard Nyberg <rnyberg@murmeldjur.se>2009-01-11 00:34:46 +0100
committerRichard Nyberg <rnyberg@murmeldjur.se>2009-01-11 00:34:46 +0100
commit3af2b0c0ac1fc2536c8fca7b86d5f7455d82c763 (patch)
tree3fe666d14011fb536d5737c7eb9b9dddff0feaf8 /misc
parent186113e4ee392535aa5de02c209fd8f4996545af (diff)
downloadbtpd-3af2b0c0ac1fc2536c8fca7b86d5f7455d82c763.tar.gz
btpd-3af2b0c0ac1fc2536c8fca7b86d5f7455d82c763.zip
Make iobuf more useful for io and use better names in its api.
Diffstat (limited to 'misc')
-rw-r--r--misc/btpd_if.c66
-rw-r--r--misc/iobuf.c77
-rw-r--r--misc/iobuf.h21
3 files changed, 97 insertions, 67 deletions
diff --git a/misc/btpd_if.c b/misc/btpd_if.c
index 6705963..0d43924 100644
--- a/misc/btpd_if.c
+++ b/misc/btpd_if.c
@@ -129,7 +129,7 @@ ipc_req_res(struct ipc *ipc, const char *req, uint32_t qlen, char **res,
 }
 
 static enum ipc_err
-ipc_buf_req_res(struct ipc *ipc, struct io_buffer *iob, char **res,
+ipc_buf_req_res(struct ipc *ipc, struct iobuf *iob, char **res,
     uint32_t *rlen)
 {
     enum ipc_err err;
@@ -137,12 +137,12 @@ ipc_buf_req_res(struct ipc *ipc, struct io_buffer *iob, char **res,
         err = IPC_COMMERR;
     else
         err = ipc_req_res(ipc, iob->buf, iob->off, res, rlen);
-    buf_free(iob);
+    iobuf_free(iob);
     return err;
 }
 
 static enum ipc_err
-ipc_buf_req_code(struct ipc *ipc, struct io_buffer *iob)
+ipc_buf_req_code(struct ipc *ipc, struct iobuf *iob)
 {
     enum ipc_err err;
     char *res;
@@ -158,11 +158,11 @@ ipc_buf_req_code(struct ipc *ipc, struct io_buffer *iob)
 enum ipc_err
 btpd_die(struct ipc *ipc, int seconds)
 {
-    struct io_buffer iob = buf_init(16);
+    struct iobuf iob = iobuf_init(16);
     if (seconds >= 0)
-        buf_print(&iob, "l3:diei%dee", seconds);
+        iobuf_print(&iob, "l3:diei%dee", seconds);
     else
-        buf_swrite(&iob, "l3:diee");
+        iobuf_swrite(&iob, "l3:diee");
     return ipc_buf_req_code(ipc, &iob);
 }
 
@@ -219,24 +219,24 @@ btpd_tget(struct ipc *ipc, struct ipc_torrent *tps, size_t ntps,
     char *res;
     uint32_t rlen;
     enum ipc_err err;
-    struct io_buffer iob;
+    struct iobuf iob;
 
     if (nkeys == 0 || ntps == 0)
         return IPC_COMMERR;
 
-    iob = buf_init(1 << 14);
-    buf_swrite(&iob, "l4:tgetd4:froml");
+    iob = iobuf_init(1 << 14);
+    iobuf_swrite(&iob, "l4:tgetd4:froml");
     for (int i = 0; i < ntps; i++) {
         if (tps[i].by_hash) {
-            buf_swrite(&iob, "20:");
-            buf_write(&iob, tps[i].u.hash, 20);
+            iobuf_swrite(&iob, "20:");
+            iobuf_write(&iob, tps[i].u.hash, 20);
         } else
-            buf_print(&iob, "i%ue", tps[i].u.num);
+            iobuf_print(&iob, "i%ue", tps[i].u.num);
     }
-    buf_swrite(&iob, "e4:keysl");
+    iobuf_swrite(&iob, "e4:keysl");
     for (int k = 0; k < nkeys; k++)
-        buf_print(&iob, "i%de", keys[k]);
-    buf_swrite(&iob, "eee");
+        iobuf_print(&iob, "i%de", keys[k]);
+    iobuf_swrite(&iob, "eee");
 
     if ((err = ipc_buf_req_res(ipc, &iob, &res, &rlen)) == 0)
         err = tget_common(res, keys, nkeys, cb, arg);
@@ -249,17 +249,17 @@ btpd_tget_wc(struct ipc *ipc, enum ipc_twc twc, enum ipc_tval *keys,
 {
     char *res;
     uint32_t rlen;
-    struct io_buffer iob;
+    struct iobuf iob;
     enum ipc_err err;
 
     if (nkeys == 0)
         return IPC_COMMERR;
 
-    iob = buf_init(1 << 14);
-    buf_print(&iob, "l4:tgetd4:fromi%de4:keysl", twc);
+    iob = iobuf_init(1 << 14);
+    iobuf_print(&iob, "l4:tgetd4:fromi%de4:keysl", twc);
     for (int i = 0; i < nkeys; i++)
-        buf_print(&iob, "i%de", keys[i]);
-    buf_swrite(&iob, "eee");
+        iobuf_print(&iob, "i%de", keys[i]);
+    iobuf_swrite(&iob, "eee");
 
     if ((err = ipc_buf_req_res(ipc, &iob, &res, &rlen)) == 0)
         err = tget_common(res, keys, nkeys, cb, arg);
@@ -270,27 +270,27 @@ enum ipc_err
 btpd_add(struct ipc *ipc, const char *mi, size_t mi_size, const char *content,
     const char *name)
 {
-    struct io_buffer iob = buf_init(1 << 10);
-    buf_print(&iob, "l3:addd7:content%d:%s", (int)strlen(content),
+    struct iobuf iob = iobuf_init(1 << 10);
+    iobuf_print(&iob, "l3:addd7:content%d:%s", (int)strlen(content),
         content);
     if (name != NULL)
-        buf_print(&iob, "4:name%d:%s", (int)strlen(name), name);
-    buf_print(&iob, "7:torrent%lu:", (unsigned long)mi_size);
-    buf_write(&iob, mi, mi_size);
-    buf_swrite(&iob, "ee");
+        iobuf_print(&iob, "4:name%d:%s", (int)strlen(name), name);
+    iobuf_print(&iob, "7:torrent%lu:", (unsigned long)mi_size);
+    iobuf_write(&iob, mi, mi_size);
+    iobuf_swrite(&iob, "ee");
     return ipc_buf_req_code(ipc, &iob);
 }
 
 static enum ipc_err
 simple_treq(struct ipc *ipc, char *cmd, struct ipc_torrent *tp)
 {
-    struct io_buffer iob = buf_init(32);
+    struct iobuf iob = iobuf_init(32);
     if (tp->by_hash) {
-        buf_print(&iob, "l%d:%s20:", (int)strlen(cmd), cmd);
-        buf_write(&iob, tp->u.hash, 20);
-        buf_swrite(&iob, "e");
+        iobuf_print(&iob, "l%d:%s20:", (int)strlen(cmd), cmd);
+        iobuf_write(&iob, tp->u.hash, 20);
+        iobuf_swrite(&iob, "e");
     } else
-        buf_print(&iob, "l%d:%si%uee", (int)strlen(cmd), cmd, tp->u.num);
+        iobuf_print(&iob, "l%d:%si%uee", (int)strlen(cmd), cmd, tp->u.num);
     return ipc_buf_req_code(ipc, &iob);
 }
 
@@ -315,7 +315,7 @@ btpd_stop(struct ipc *ipc, struct ipc_torrent *tp)
 enum ipc_err
 btpd_stop_all(struct ipc *ipc)
 {
-    struct io_buffer iob = buf_init(16);
-    buf_swrite(&iob, "l8:stop-alle");
+    struct iobuf iob = iobuf_init(16);
+    iobuf_swrite(&iob, "l8:stop-alle");
     return ipc_buf_req_code(ipc, &iob);
 }
diff --git a/misc/iobuf.c b/misc/iobuf.c
index 45918ab..fa5e33f 100644
--- a/misc/iobuf.c
+++ b/misc/iobuf.c
@@ -1,3 +1,4 @@
+#include <assert.h>
 #include <inttypes.h>
 #include <stdarg.h>
 #include <stdio.h>
@@ -5,44 +6,66 @@
 #include <string.h>
 
 #include "iobuf.h"
+#include "subr.h"
 
-#define GROWLEN (1 << 14)
-
-struct io_buffer
-buf_init(size_t size)
+struct iobuf
+iobuf_init(size_t size)
 {
-    struct io_buffer iob;
+    struct iobuf iob;
+    iob.size = size;
     iob.off = 0;
-    iob.len = size;
+    iob.skip = 0;
     iob.error = (iob.buf = malloc(size)) == NULL ? 1 : 0;
     return iob;
 }
 
 void
-buf_free(struct io_buffer *iob)
+iobuf_free(struct iobuf *iob)
 {
     if (iob->buf != NULL)
-        free(iob->buf);
+        free(iob->buf - iob->skip);
+    iob->buf = NULL;
+    iob->error = 1;
+}
+
+void
+iobuf_consumed(struct iobuf *iob, size_t count)
+{
+    if (iob->error)
+        return;
+    assert(count <= iob->off);
+    iob->skip += count;
+    iob->buf += count;
+    iob->off -= count;
 }
 
 int
-buf_grow(struct io_buffer *iob, size_t addlen)
+iobuf_accommodate(struct iobuf *iob, size_t count)
 {
     if (iob->error)
-        return iob->error;
-    char *nbuf = realloc(iob->buf, iob->len + addlen);
-    if (nbuf == NULL) {
-        iob->error = 1;
         return 0;
+    size_t esize = iob->size - (iob->skip + iob->off);
+    if (esize >= count)
+        return 1;
+    else if (esize + iob->skip >= count) {
+        bcopy(iob->buf, iob->buf - iob->skip, iob->off);
+        iob->buf -= iob->skip;
+        iob->skip = 0;
+        return 1;
     } else {
-        iob->buf = nbuf;
-        iob->len += addlen;
+        uint8_t *nbuf = realloc(iob->buf - iob->skip, iob->size + count);
+        if (nbuf == NULL) {
+            iob->error = 1;
+            return 0;
+        }
+        iob->buf = nbuf + iob->skip;
+        iob->size += count;
         return 1;
     }
 }
 
 int
-buf_print(struct io_buffer *iob, const char *fmt, ...)
+iobuf_print(struct iobuf *iob, const char *fmt, ...)
 {
     if (iob->error)
         return 0;
@@ -51,9 +74,8 @@ buf_print(struct io_buffer *iob, const char *fmt, ...)
     va_start(ap, fmt);
     np = vsnprintf(NULL, 0, fmt, ap);
     va_end(ap);
-    if (np + 1 > iob->len - iob->off)
-        if (!buf_grow(iob, (1 + (np + 1) / GROWLEN) * GROWLEN))
-            return 0;
+    if (!iobuf_accommodate(iob, np + 1))
+        return 0;
     va_start(ap, fmt);
     vsnprintf(iob->buf + iob->off, np + 1, fmt, ap);
     va_end(ap);
@@ -62,14 +84,19 @@ buf_print(struct io_buffer *iob, const char *fmt, ...)
 }
 
 int
-buf_write(struct io_buffer *iob, const void *buf, size_t len)
+iobuf_write(struct iobuf *iob, const void *buf, size_t count)
 {
     if (iob->error)
         return 0;
-    if (len > iob->len - iob->off)
-        if (!buf_grow(iob, (1 + len / GROWLEN) * GROWLEN))
-            return 0;
-    bcopy(buf, iob->buf + iob->off, len);
-    iob->off += len;
+    if (!iobuf_accommodate(iob, count))
+        return 0;
+    bcopy(buf, iob->buf + iob->off, count);
+    iob->off += count;
     return 1;
 }
+
+void *
+iobuf_find(struct iobuf *iob, const void *p, size_t plen)
+{
+    return iob->error ? NULL : memfind(p, plen, iob->buf, iob->off);
+}
diff --git a/misc/iobuf.h b/misc/iobuf.h
index ccd2028..fb14835 100644
--- a/misc/iobuf.h
+++ b/misc/iobuf.h
@@ -1,20 +1,23 @@
 #ifndef BTPD_IOBUF_H
 #define BTPD_IOBUF_H
 
-struct io_buffer {
+struct iobuf {
+    uint8_t *buf;
+    size_t size;
     size_t off;
-    size_t len;
-    char *buf;
+    size_t skip;
     int error;
 };
 
-struct io_buffer buf_init(size_t size);
-void buf_free(struct io_buffer *iob);
-int buf_grow(struct io_buffer *iob, size_t size);
-int buf_write(struct io_buffer *iob, const void *data, size_t size);
+struct iobuf iobuf_init(size_t size);
+void iobuf_free(struct iobuf *iob);
+int iobuf_accommodate(struct iobuf *iob, size_t size);
+int iobuf_write(struct iobuf *iob, const void *data, size_t size);
 __attribute__((format (printf, 2, 3)))
-int buf_print(struct io_buffer *iob, const char *fmt, ...);
+int iobuf_print(struct iobuf *iob, const char *fmt, ...);
+void *iobuf_find(struct iobuf *iob, const void *p, size_t plen);
+void iobuf_consumed(struct iobuf *iob, size_t count);
 
-#define buf_swrite(iob, s) buf_write(iob, s, sizeof(s) - 1)
+#define iobuf_swrite(iob, s) iobuf_write(iob, s, sizeof(s) - 1)
 
 #endif