o New function to automate connecting on a socket-based bufferevent.
o New functions to automate listening for incoming TCP connections.
o Do case-insensitive checks with a locale-independent comparison function.
-
+ o Rename the evbuffercb and everrorcb callbacks to bufferevent_data_cb and bufferevent_event_cb respectively. The old names are available in bufferevent_compat.h.
+ o Rename the EVBUFFER_* codes used by bufferevent event callbacks to BEV_EVENT_*, to avoid namespace collision with evbuffer flags. The old names are available in bufferevent_compat.h.
+ o Move the EVBUFFER_INPUT and EVBUFFER_OUTPUT macros to bufferevent_compat.h
Changes in 2.0.1-alpha:
o free minheap on event_base_free(); from Christopher Layne
void
bufferevent_setcb(struct bufferevent *bufev,
- evbuffercb readcb, evbuffercb writecb, everrorcb errorcb, void *cbarg)
+ bufferevent_data_cb readcb, bufferevent_data_cb writecb,
+ bufferevent_event_cb errorcb, void *cbarg)
{
BEV_LOCK(bufev);
if (mode == BEV_FINISHED) {
if (partner->errorcb)
(*partner->errorcb)(partner,
- iotype|EVBUFFER_EOF, partner->cbarg);
+ iotype|BEV_EVENT_EOF, partner->cbarg);
}
return 0;
}
struct bufferevent *bufev = arg;
struct evbuffer *input;
int res = 0;
- short what = EVBUFFER_READ;
+ short what = BEV_EVENT_READING;
int howmuch = -1;
if (event == EV_TIMEOUT) {
- what |= EVBUFFER_TIMEOUT;
+ what |= BEV_EVENT_TIMEOUT;
goto error;
}
if (EVUTIL_ERR_RW_RETRIABLE(err))
goto reschedule;
/* error case */
- what |= EVBUFFER_ERROR;
+ what |= BEV_EVENT_ERROR;
} else if (res == 0) {
/* eof case */
- what |= EVBUFFER_EOF;
+ what |= BEV_EVENT_EOF;
}
if (res <= 0)
struct bufferevent_private *bufev_p =
EVUTIL_UPCAST(bufev, struct bufferevent_private, bev);
int res = 0;
- short what = EVBUFFER_WRITE;
+ short what = BEV_EVENT_WRITING;
if (event == EV_TIMEOUT) {
- what |= EVBUFFER_TIMEOUT;
+ what |= BEV_EVENT_TIMEOUT;
goto error;
}
if (bufev_p->connecting) {
bufev_p->connecting = 0;
- _bufferevent_run_errorcb(bufev, EVBUFFER_CONNECTED);
+ _bufferevent_run_errorcb(bufev, BEV_EVENT_CONNECTED);
if (!(bufev->enabled & EV_WRITE)) {
event_del(&bufev->ev_write);
return;
int err = evutil_socket_geterror(fd);
if (EVUTIL_ERR_RW_RETRIABLE(err))
goto reschedule;
- what |= EVBUFFER_ERROR;
+ what |= BEV_EVENT_ERROR;
} else if (res == 0) {
/* eof case */
- what |= EVBUFFER_EOF;
+ what |= BEV_EVENT_EOF;
}
if (res <= 0)
goto error;
return 0;
}
}
- _bufferevent_run_errorcb(bev, EVBUFFER_ERROR);
+ _bufferevent_run_errorcb(bev, BEV_EVENT_ERROR);
/* do something about the error? */
} else {
/* The connect succeeded already. How odd. */
- _bufferevent_run_errorcb(bev, EVBUFFER_CONNECTED);
+ _bufferevent_run_errorcb(bev, BEV_EVENT_CONNECTED);
}
return 0;
*/
struct bufferevent *
-bufferevent_new(evutil_socket_t fd, evbuffercb readcb, evbuffercb writecb,
- everrorcb errorcb, void *cbarg)
+bufferevent_new(evutil_socket_t fd,
+ bufferevent_data_cb readcb, bufferevent_data_cb writecb,
+ bufferevent_event_cb errorcb, void *cbarg)
{
struct bufferevent *bufev;
switch (evcon->state) {
case EVCON_CONNECTING:
- if (what == EVBUFFER_TIMEOUT) {
+ if (what == BEV_EVENT_TIMEOUT) {
event_debug(("%s: connection timeout for \"%s:%d\" on %d",
__func__, evcon->address, evcon->port,
evcon->fd));
case EVCON_READING_BODY:
if (!req->chunked && req->ntoread < 0
- && what == (EVBUFFER_READ|EVBUFFER_EOF)) {
+ && what == (BEV_EVENT_READING|BEV_EVENT_EOF)) {
/* EOF on read can be benign */
evhttp_connection_done(evcon);
return;
return;
}
- if (what & EVBUFFER_TIMEOUT) {
+ if (what & BEV_EVENT_TIMEOUT) {
evhttp_connection_fail(evcon, EVCON_HTTP_TIMEOUT);
- } else if (what & (EVBUFFER_EOF|EVBUFFER_ERROR)) {
+ } else if (what & (BEV_EVENT_EOF|BEV_EVENT_ERROR)) {
evhttp_connection_fail(evcon, EVCON_HTTP_EOF);
} else {
evhttp_connection_fail(evcon, EVCON_HTTP_BUFFER_ERROR);
/* Just for error reporting - use other constants otherwise */
-#define EVBUFFER_READ 0x01 /**< error encountered while reading */
-#define EVBUFFER_WRITE 0x02 /**< error encountered while writing */
-#define EVBUFFER_EOF 0x10 /**< eof file reached */
-#define EVBUFFER_ERROR 0x20 /**< unrecoverable error encountered */
-#define EVBUFFER_TIMEOUT 0x40 /**< user specified timeout reached */
-#define EVBUFFER_CONNECTED 0x80 /**< connect operation finished. */
+#define BEV_EVENT_READING 0x01 /**< error encountered while reading */
+#define BEV_EVENT_WRITING 0x02 /**< error encountered while writing */
+#define BEV_EVENT_EOF 0x10 /**< eof file reached */
+#define BEV_EVENT_ERROR 0x20 /**< unrecoverable error encountered */
+#define BEV_EVENT_TIMEOUT 0x40 /**< user specified timeout reached */
+#define BEV_EVENT_CONNECTED 0x80 /**< connect operation finished. */
struct bufferevent;
struct event_base;
struct evbuffer;
@param bev the bufferevent that triggered the callback
@param ctx the user specified context for this bufferevent
*/
-/* XXXX we should rename this to bufferevent_cb; evbuffercb implies that it's
- * a cb on an evbuffer. We should retain the old name in bufferevent_compat. */
-typedef void (*evbuffercb)(struct bufferevent *bev, void *ctx);
+typedef void (*bufferevent_data_cb)(struct bufferevent *bev, void *ctx);
/**
type defintion for the error callback of a bufferevent.
unrecoverable error was encountered.
@param bev the bufferevent for which the error condition was reached
- @param what a conjunction of flags: EVBUFFER_READ or EVBUFFER write to
- indicate if the error was encountered on the read or write path,
- and one of the following flags: EVBUFFER_EOF, EVBUFFER_ERROR or
- EVBUFFER_TIMEOUT.
+ @param what a conjunction of flags: BEV_EVENT_READING or BEV_EVENT_WRITING
+ to indicate if the error was encountered on the read or write path,
+ and one of the following flags: BEV_EVENT_EOF, BEV_EVENT_ERROR,
+ BEV_EVENT_TIMEOUT, BEV_EVENT_CONNECTED.
+
@param ctx the user specified context for this bufferevent
*/
-/* XXXX we should rename this to bufferevent_error_cb; see above. */
-typedef void (*everrorcb)(struct bufferevent *bev, short what, void *ctx);
+typedef void (*bufferevent_event_cb)(struct bufferevent *bev, short what, void *ctx);
/** Options that can be specified when creating a bufferevent */
enum bufferevent_options {
/**
Launch a connect() attempt with a socket. When the connect succeeds,
- the errorcb will be invoked with EVBUFFER_CONNECTED set.
+ the errorcb will be invoked with BEV_EVENT_CONNECTED set.
If the bufferevent does not already have a socket set, we allocate a new
socket here and make it nonblocking before we begin.
@see bufferevent_new()
*/
void bufferevent_setcb(struct bufferevent *bufev,
- evbuffercb readcb, evbuffercb writecb, everrorcb errorcb, void *cbarg);
+ bufferevent_data_cb readcb, bufferevent_data_cb writecb,
+ bufferevent_event_cb errorcb, void *cbarg);
/**
Changes the file descriptor on which the bufferevent operates.
void bufferevent_setwatermark(struct bufferevent *bufev, short events,
size_t lowmark, size_t highmark);
-/** macro for getting access to the input buffer of a bufferevent */
-#define EVBUFFER_INPUT(x) bufferevent_get_input(x)
-/** macro for getting access to the output buffer of a bufferevent */
-#define EVBUFFER_OUTPUT(x) bufferevent_get_output(x)
-
/**
Flags that can be passed into filters to let them know how to
deal with the incoming data.
#ifndef _EVENT2_BUFFEREVENT_COMPAT_H_
#define _EVENT2_BUFFEREVENT_COMPAT_H_
+#define evbuffercb bufferevent_data_cb
+#define everrorcb bufferevent_event_cb
+
/**
Create a new bufferevent for an fd.
void bufferevent_settimeout(struct bufferevent *bufev,
int timeout_read, int timeout_write);
+#define EVBUFFER_READ BEV_EVENT_READING
+#define EVBUFFER_WRITE BEV_EVENT_WRITING
+#define EVBUFFER_EOF BEV_EVENT_EOF
+#define EVBUFFER_ERROR BEV_EVENT_ERROR
+#define EVBUFFER_TIMEOUT BEV_EVENT_TIMEOUT
+#define EVBUFFER_CONNECTED BEV_EVENT_CONNECTED
+
+/** macro for getting access to the input buffer of a bufferevent */
+#define EVBUFFER_INPUT(x) bufferevent_get_input(x)
+/** macro for getting access to the output buffer of a bufferevent */
+#define EVBUFFER_OUTPUT(x) bufferevent_get_output(x)
+
#endif
struct event_watermark wm_read;
struct event_watermark wm_write;
- evbuffercb readcb;
- evbuffercb writecb;
- everrorcb errorcb;
+ bufferevent_data_cb readcb;
+ bufferevent_data_cb writecb;
+ bufferevent_event_cb errorcb;
void *cbarg;
struct timeval timeout_read;
{
struct request_info *ri = arg;
struct timeval now, diff;
- if (what & EVBUFFER_EOF) {
+ if (what & BEV_EVENT_EOF) {
++total_n_handled;
total_n_bytes += ri->n_read;
gettimeofday(&now, NULL);
reader_eventcb(struct bufferevent *bev, short what, void *ctx)
{
struct event_base *base = ctx;
- if (what & EVBUFFER_ERROR) {
+ if (what & BEV_EVENT_ERROR) {
perror("foobar");
TT_FAIL(("got connector error %d", (int)what));
return;
}
- if (what & EVBUFFER_CONNECTED) {
+ if (what & BEV_EVENT_CONNECTED) {
bufferevent_enable(bev, EV_READ);
}
- if (what & EVBUFFER_EOF) {
+ if (what & BEV_EVENT_EOF) {
char buf[512];
size_t n;
n = bufferevent_read(bev, buf, sizeof(buf)-1);
{
const char *what = BASIC_REQUEST_BODY;
- event_debug(("%s: %s\n", __func__, EVBUFFER_DATA(EVBUFFER_INPUT(bev))));
+ event_debug(("%s: %s\n", __func__, EVBUFFER_DATA(bufferevent_get_input(bev))));
- if (evbuffer_find(EVBUFFER_INPUT(bev),
+ if (evbuffer_find(bufferevent_get_input(bev),
(const unsigned char*) what, strlen(what)) != NULL) {
struct evhttp_request *req = evhttp_request_new(NULL, NULL);
enum message_read_status done;
req->kind = EVHTTP_RESPONSE;
- done = evhttp_parse_firstline(req, EVBUFFER_INPUT(bev));
+ done = evhttp_parse_firstline(req, bufferevent_get_input(bev));
if (done != ALL_DATA_READ)
goto out;
- done = evhttp_parse_headers(req, EVBUFFER_INPUT(bev));
+ done = evhttp_parse_headers(req, bufferevent_get_input(bev));
if (done != ALL_DATA_READ)
goto out;
static void
http_writecb(struct bufferevent *bev, void *arg)
{
- if (EVBUFFER_LENGTH(EVBUFFER_OUTPUT(bev)) == 0) {
+ if (EVBUFFER_LENGTH(bufferevent_get_output(bev)) == 0) {
/* enable reading of the reply */
bufferevent_enable(bev, EV_READ);
test_ok++;
http_failure_readcb(struct bufferevent *bev, void *arg)
{
const char *what = "400 Bad Request";
- if (evbuffer_find(EVBUFFER_INPUT(bev),
+ if (evbuffer_find(bufferevent_get_input(bev),
(const unsigned char*) what, strlen(what)) != NULL) {
test_ok = 2;
bufferevent_disable(bev, EV_READ);
/* terminate the write side to simulate EOF */
shutdown(fd, SHUT_WR);
}
- if (EVBUFFER_LENGTH(EVBUFFER_OUTPUT(bev)) == 0) {
+ if (EVBUFFER_LENGTH(bufferevent_get_output(bev)) == 0) {
/* enable reading of the reply */
bufferevent_enable(bev, EV_READ);
test_ok++;
enum message_read_status done;
req->kind = EVHTTP_RESPONSE;
- done = evhttp_parse_firstline(req, EVBUFFER_INPUT(bev));
+ done = evhttp_parse_firstline(req, bufferevent_get_input(bev));
if (done != ALL_DATA_READ)
goto out;
- done = evhttp_parse_headers(req, EVBUFFER_INPUT(bev));
+ done = evhttp_parse_headers(req, bufferevent_get_input(bev));
if (done != ALL_DATA_READ)
goto out;
if (header == NULL || strcmp(header, "close"))
goto out;
- header = evbuffer_readln(EVBUFFER_INPUT(bev), NULL, EVBUFFER_EOL_CRLF);
+ header = evbuffer_readln(bufferevent_get_input(bev), NULL, EVBUFFER_EOL_CRLF);
if (header == NULL)
goto out;
/* 13 chars */
goto out;
free((char*)header);
- if (strncmp((char *)evbuffer_pullup(EVBUFFER_INPUT(bev), 13),
+ if (strncmp((char *)evbuffer_pullup(bufferevent_get_input(bev), 13),
"This is funny", 13))
goto out;
- evbuffer_drain(EVBUFFER_INPUT(bev), 13 + 2);
+ evbuffer_drain(bufferevent_get_input(bev), 13 + 2);
- header = evbuffer_readln(EVBUFFER_INPUT(bev), NULL, EVBUFFER_EOL_CRLF);
+ header = evbuffer_readln(bufferevent_get_input(bev), NULL, EVBUFFER_EOL_CRLF);
if (header == NULL)
goto out;
/* 18 chars */
goto out;
free((char *)header);
- if (strncmp((char *)evbuffer_pullup(EVBUFFER_INPUT(bev), 18),
+ if (strncmp((char *)evbuffer_pullup(bufferevent_get_input(bev), 18),
"but not hilarious.", 18))
goto out;
- evbuffer_drain(EVBUFFER_INPUT(bev), 18 + 2);
+ evbuffer_drain(bufferevent_get_input(bev), 18 + 2);
- header = evbuffer_readln(EVBUFFER_INPUT(bev), NULL, EVBUFFER_EOL_CRLF);
+ header = evbuffer_readln(bufferevent_get_input(bev), NULL, EVBUFFER_EOL_CRLF);
if (header == NULL)
goto out;
/* 8 chars */
goto out;
free((char *)header);
- if (strncmp((char *)evbuffer_pullup(EVBUFFER_INPUT(bev), 8),
+ if (strncmp((char *)evbuffer_pullup(bufferevent_get_input(bev), 8),
"bwv 1052.", 8))
goto out;
- evbuffer_drain(EVBUFFER_INPUT(bev), 8 + 2);
+ evbuffer_drain(bufferevent_get_input(bev), 8 + 2);
- header = evbuffer_readln(EVBUFFER_INPUT(bev), NULL, EVBUFFER_EOL_CRLF);
+ header = evbuffer_readln(bufferevent_get_input(bev), NULL, EVBUFFER_EOL_CRLF);
if (header == NULL)
goto out;
/* 0 chars */
static void
http_chunked_writecb(struct bufferevent *bev, void *arg)
{
- if (EVBUFFER_LENGTH(EVBUFFER_OUTPUT(bev)) == 0) {
+ if (EVBUFFER_LENGTH(bufferevent_get_output(bev)) == 0) {
/* enable reading of the reply */
bufferevent_enable(bev, EV_READ);
test_ok++;