diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-12-29 02:33:42 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-12-29 02:33:42 +0000 |
commit | bd32982c779261e0aae59499c0299c23c1d3f05b (patch) | |
tree | 097493ee32531eb99bca97483cc0bdfb7a0cf8fb /src/or/buffers.c | |
parent | c03ef9c395cc6c3aab504a8f54db459015ca8a34 (diff) | |
download | tor-bd32982c779261e0aae59499c0299c23c1d3f05b.tar.gz tor-bd32982c779261e0aae59499c0299c23c1d3f05b.zip |
r17426@catbus: nickm | 2007-12-28 21:12:29 -0500
Remove need for buf_pullup in fetch_line_from_buf().
svn:r13002
Diffstat (limited to 'src/or/buffers.c')
-rw-r--r-- | src/or/buffers.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/src/or/buffers.c b/src/or/buffers.c index 8f1bba2410..6a74f0d570 100644 --- a/src/or/buffers.c +++ b/src/or/buffers.c @@ -1398,6 +1398,22 @@ peek_buf_has_control0_command(buf_t *buf) return 0; } +/** DOCDOC */ +static int +buf_find_offset_of_char(buf_t *buf, char ch) +{ + chunk_t *chunk; + int offset = 0; + for (chunk = buf->head; chunk; chunk = chunk->next) { + char *cp = memchr(chunk->data, ch, chunk->datalen); + if (cp) + return offset + (cp - chunk->data); + else + offset += chunk->datalen; + } + return -1; +} + /** Try to read a single LF-terminated line from <b>buf</b>, and write it, * NUL-terminated, into the *<b>data_len</b> byte buffer at <b>data_out</b>. * Set *<b>data_len</b> to the number of bytes in the line, not counting the @@ -1408,21 +1424,18 @@ peek_buf_has_control0_command(buf_t *buf) int fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len) { - char *cp; size_t sz; + int offset; if (!buf->head) return 0; - /* XXXX020 pull up less aggressively. And implement setting *data_len - * properly in cases where we return -1. */ - buf_pullup(buf, *data_len, 0); - cp = memchr(buf->head->data, '\n', buf->head->datalen); - if (!cp) { + + offset = buf_find_offset_of_char(buf, '\n'); + if (offset < 0) return 0; - } - sz = cp - buf->head->data; + sz = (size_t) offset; if (sz+2 > *data_len) { - *data_len = sz+2; + *data_len = sz + 2; return -1; } fetch_from_buf(data_out, sz+1, buf); |