From ddcb59bb70457e203247931aaad3a3ff8b923f97 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Sun, 9 Aug 2009 11:40:28 -0700 Subject: [PATCH] Fix more remaining users of inbuf/outbuf to handle bufferevents instead. --- src/or/buffers.c | 21 +++++++++++++++++++++ src/or/buffers.h | 1 + src/or/connection.c | 18 ++++++++++++++++++ src/or/connection.h | 4 ++++ src/or/connection_or.c | 12 +++++++++--- src/or/control.c | 13 ++++++++++++- src/or/cpuworker.c | 4 ++-- src/or/directory.c | 4 ++-- 8 files changed, 69 insertions(+), 8 deletions(-) diff --git a/src/or/buffers.c b/src/or/buffers.c index 374c37c860..9fde8972b1 100644 --- a/src/or/buffers.c +++ b/src/or/buffers.c @@ -1988,6 +1988,27 @@ peek_buf_has_control0_command(buf_t *buf) return 0; } +#ifdef USE_BUFFEREVENTS +int +peek_evbuffer_has_control0_command(struct evbuffer *buf) +{ + int result = 0; + if (evbuffer_get_length(buf) >= 4) { + int free_out = 0; + char *data = NULL; + size_t n = inspect_evbuffer(buf, &data, 4, &free_out); + uint16_t cmd; + tor_assert(n >= 4); + cmd = ntohs(get_uint16(data+2)); + if (cmd <= 0x14) + result = 1; + if (free_out) + tor_free(data); + } + return result; +} +#endif + /** Return the index within buf at which ch first appears, * or -1 if ch does not appear on buf. */ static off_t diff --git a/src/or/buffers.h b/src/or/buffers.h index ca01dc8074..4f565ddce8 100644 --- a/src/or/buffers.h +++ b/src/or/buffers.h @@ -57,6 +57,7 @@ int fetch_from_evbuffer_http(struct evbuffer *buf, char **headers_out, size_t max_headerlen, char **body_out, size_t *body_used, size_t max_bodylen, int force_complete); +int peek_evbuffer_has_control0_command(struct evbuffer *buf); #endif void assert_buf_ok(buf_t *buf); diff --git a/src/or/connection.c b/src/or/connection.c index 54b9911391..e6b4bc3d18 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -2785,6 +2785,24 @@ connection_fetch_from_buf_line(connection_t *conn, char *data, } } +/** As fetch_from_buf_http, but fetches from a conncetion's input buffer_t or + * its bufferevent as appropriate. */ +int +connection_fetch_from_buf_http(connection_t *conn, + char **headers_out, size_t max_headerlen, + char **body_out, size_t *body_used, + size_t max_bodylen, int force_complete) +{ + IF_HAS_BUFFEREVENT(conn, { + struct evbuffer *input = bufferevent_get_input(conn->bufev); + return fetch_from_evbuffer_http(input, headers_out, max_headerlen, + body_out, body_used, max_bodylen, force_complete); + }) ELSE_IF_NO_BUFFEREVENT { + return fetch_from_buf_http(conn->inbuf, headers_out, max_headerlen, + body_out, body_used, max_bodylen, force_complete); + } +} + /** Return conn-\>outbuf_flushlen: how many bytes conn wants to flush * from its outbuf. */ int diff --git a/src/or/connection.h b/src/or/connection.h index af21481156..4d269d649a 100644 --- a/src/or/connection.h +++ b/src/or/connection.h @@ -65,6 +65,10 @@ int connection_handle_read(connection_t *conn); int connection_fetch_from_buf(char *string, size_t len, connection_t *conn); int connection_fetch_from_buf_line(connection_t *conn, char *data, size_t *data_len); +int connection_fetch_from_buf_http(connection_t *conn, + char **headers_out, size_t max_headerlen, + char **body_out, size_t *body_used, + size_t max_bodylen, int force_complete); int connection_wants_to_flush(connection_t *conn); int connection_outbuf_too_full(connection_t *conn); diff --git a/src/or/connection_or.c b/src/or/connection_or.c index 169f14153a..a2eb868d95 100644 --- a/src/or/connection_or.c +++ b/src/or/connection_or.c @@ -1253,12 +1253,18 @@ connection_or_write_var_cell_to_buf(const var_cell_t *cell, conn->timestamp_last_added_nonpadding = approx_time(); } -/** See whether there's a variable-length cell waiting on conn's +/** See whether there's a variable-length cell waiting on or_conn's * inbuf. Return values as for fetch_var_cell_from_buf(). */ static int -connection_fetch_var_cell_from_buf(or_connection_t *conn, var_cell_t **out) +connection_fetch_var_cell_from_buf(or_connection_t *or_conn, var_cell_t **out) { - return fetch_var_cell_from_buf(conn->_base.inbuf, out, conn->link_proto); + connection_t *conn = TO_CONN(or_conn); + IF_HAS_BUFFEREVENT(conn, { + struct evbuffer *input = bufferevent_get_input(conn->bufev); + return fetch_var_cell_from_evbuffer(input, out, or_conn->link_proto); + }) ELSE_IF_NO_BUFFEREVENT { + return fetch_var_cell_from_buf(conn->inbuf, out, or_conn->link_proto); + } } /** Process cells from conn's inbuf. diff --git a/src/or/control.c b/src/or/control.c index ac004b5582..37ebfd88dc 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -2753,6 +2753,17 @@ is_valid_initial_command(control_connection_t *conn, const char *cmd) * interfaces is broken. */ #define MAX_COMMAND_LINE_LENGTH (1024*1024) +static int +peek_connection_has_control0_command(connection_t *conn) +{ + IF_HAS_BUFFEREVENT(conn, { + struct evbuffer *input = bufferevent_get_input(conn->bufev); + return peek_evbuffer_has_control0_command(input); + }) ELSE_IF_NO_BUFFEREVENT { + return peek_buf_has_control0_command(conn->inbuf); + } +} + /** Called when data has arrived on a v1 control connection: Try to fetch * commands from conn->inbuf, and execute them. */ @@ -2775,7 +2786,7 @@ connection_control_process_inbuf(control_connection_t *conn) } if (conn->_base.state == CONTROL_CONN_STATE_NEEDAUTH && - peek_buf_has_control0_command(conn->_base.inbuf)) { + peek_connection_has_control0_command(TO_CONN(conn))) { /* Detect v0 commands and send a "no more v0" message. */ size_t body_len; char buf[128]; diff --git a/src/or/cpuworker.c b/src/or/cpuworker.c index a9c29d288d..e5b2c71025 100644 --- a/src/or/cpuworker.c +++ b/src/or/cpuworker.c @@ -144,9 +144,9 @@ connection_cpu_process_inbuf(connection_t *conn) return 0; if (conn->state == CPUWORKER_STATE_BUSY_ONION) { - if (buf_datalen(conn->inbuf) < LEN_ONION_RESPONSE) /* answer available? */ + if (connection_get_inbuf_len(conn) < LEN_ONION_RESPONSE) return 0; /* not yet */ - tor_assert(buf_datalen(conn->inbuf) == LEN_ONION_RESPONSE); + tor_assert(connection_get_inbuf_len(conn) == LEN_ONION_RESPONSE); connection_fetch_from_buf(&success,1,conn); connection_fetch_from_buf(buf,LEN_ONION_RESPONSE-1,conn); diff --git a/src/or/directory.c b/src/or/directory.c index 2e9770eebf..284a1ad12f 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -1466,7 +1466,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) int was_compressed=0; time_t now = time(NULL); - switch (fetch_from_buf_http(conn->_base.inbuf, + switch (connection_fetch_from_buf_http(TO_CONN(conn), &headers, MAX_HEADERS_SIZE, &body, &body_len, MAX_DIR_DL_SIZE, allow_partial)) { @@ -3299,7 +3299,7 @@ directory_handle_command(dir_connection_t *conn) tor_assert(conn); tor_assert(conn->_base.type == CONN_TYPE_DIR); - switch (fetch_from_buf_http(conn->_base.inbuf, + switch (connection_fetch_from_buf_http(TO_CONN(conn), &headers, MAX_HEADERS_SIZE, &body, &body_len, MAX_DIR_UL_SIZE, 0)) { case -1: /* overflow */