From 66b2a7ffb72e68a059c7479362bfe4863e2331df Mon Sep 17 00:00:00 2001 From: Niels Provos Date: Thu, 29 Jan 2009 03:20:40 +0000 Subject: [PATCH] test evbuffer_add_reference svn:r1068 --- buffer.c | 5 ++-- include/event2/buffer.h | 3 ++- test/regress.c | 59 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/buffer.c b/buffer.c index a8c788b3..a6de9518 100644 --- a/buffer.c +++ b/buffer.c @@ -1389,7 +1389,8 @@ evbuffer_add_printf(struct evbuffer *buf, const char *fmt, ...) } int -evbuffer_add_reference(struct evbuffer *outbuf, void *data, size_t datlen, +evbuffer_add_reference(struct evbuffer *outbuf, + const void *data, size_t datlen, void (*cleanupfn)(void *extra), void *extra) { size_t old_len = outbuf->total_len; @@ -1400,7 +1401,7 @@ evbuffer_add_reference(struct evbuffer *outbuf, void *data, size_t datlen, return (-1); chain->flags |= EVBUFFER_REFERENCE | EVBUFFER_IMMUTABLE; - chain->buffer = data; + chain->buffer = (u_char *)data; chain->buffer_len = datlen; chain->off = datlen; diff --git a/include/event2/buffer.h b/include/event2/buffer.h index 6aef2283..dbb95841 100644 --- a/include/event2/buffer.h +++ b/include/event2/buffer.h @@ -245,7 +245,8 @@ int evbuffer_add_buffer(struct evbuffer *outbuf, struct evbuffer *inbuf); @param extra optional argument to the cleanup callback @return 0 if successful, or -1 if an error occurred */ -int evbuffer_add_reference(struct evbuffer *outbuf, void *data, size_t datlen, +int evbuffer_add_reference(struct evbuffer *outbuf, + const void *data, size_t datlen, void (*cleanupfn)(void *extra), void *extra); /** diff --git a/test/regress.c b/test/regress.c index 8293f667..c511be0c 100644 --- a/test/regress.c +++ b/test/regress.c @@ -1237,6 +1237,64 @@ out: cleanup_test(); } +static void +reference_cb(void *extra) +{ + assert(extra = (void *)0xdeadaffe); + test_ok = 1; +} + +static void +test_evbuffer_reference(void) +{ + struct evbuffer *src = evbuffer_new(); + struct evbuffer *dst = evbuffer_new(); + void *tmp; + const char *data = "this is what we add as read-only memory."; + + setup_test("Testing evbuffer_add_reference: "); + + if (evbuffer_add_reference(src, data, strlen(data), + reference_cb, (void *)0xdeadaffe) == -1) { + fprintf(stdout, "FAILED\n"); + exit(1); + } + + tmp = evbuffer_reserve_space(dst, strlen(data)); + if (evbuffer_remove(src, tmp, 10) == -1) { + fprintf(stdout, "FAILED\n"); + exit(1); + } + + evbuffer_validate(src); + evbuffer_validate(dst); + + /* make sure that we don't write data at the beginning */ + evbuffer_prepend(src, "aaaaa", 5); + evbuffer_validate(src); + evbuffer_drain(src, 5); + + if (evbuffer_remove(src, tmp + 10, strlen(data) - 10) == -1) { + fprintf(stdout, "FAILED\n"); + exit(1); + } + + evbuffer_commit_space(dst, strlen(data)); + evbuffer_validate(src); + evbuffer_validate(dst); + + if (memcmp(evbuffer_pullup(dst, strlen(data)), + data, strlen(data)) != 0) { + fprintf(stdout, "FAILED\n"); + exit(1); + } + + cleanup_test(); + + evbuffer_free(dst); + evbuffer_free(src); +} + static void test_evbuffer_readln(void) { @@ -2363,6 +2421,7 @@ main (int argc, char **argv) test_priorities(3); test_evbuffer(); + test_evbuffer_reference(); test_evbuffer_iterative(); test_evbuffer_readln(); test_evbuffer_find();