diff options
Diffstat (limited to 'misc')
| -rw-r--r-- | misc/btpd_if.c | 66 | ||||
| -rw-r--r-- | misc/iobuf.c | 77 | ||||
| -rw-r--r-- | misc/iobuf.h | 21 |
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 |