summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2006-12-29 05:07:04 +0000
committerNick Mathewson <nickm@torproject.org>2006-12-29 05:07:04 +0000
commit8728e2826f9a06a842b77876b8a616ae394ecdb1 (patch)
tree6bc84046d69b2a6c5e722d888b4dbae900766b65
parent26c0d6ec5861cec381af0b850163ff0a4ac65850 (diff)
downloadtor-8728e2826f9a06a842b77876b8a616ae394ecdb1.tar.gz
tor-8728e2826f9a06a842b77876b8a616ae394ecdb1.zip
r11744@Kushana: nickm | 2006-12-28 23:43:53 -0500
Refactor connection_write_to_buf_zlib back into connection_write_to_buf. Hooray for dumping duplicate code. svn:r9209
-rw-r--r--src/or/connection.c57
-rw-r--r--src/or/dirserv.c10
-rw-r--r--src/or/or.h22
3 files changed, 45 insertions, 44 deletions
diff --git a/src/or/connection.c b/src/or/connection.c
index d7c1b7955c..2c8269fad8 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -1745,18 +1745,35 @@ connection_handle_write(connection_t *conn, int force)
/** Append <b>len</b> bytes of <b>string</b> onto <b>conn</b>'s
* outbuf, and ask it to start writing.
+ *
+ * If <b>zlib</b> is nonzero, this is a directory connection that should get
+ * its contents compressed or decompressed as they're written. If zlib is
+ * negative, this is the last data to be compressed, and the connection's zlib
+ * state should be flushed.
*/
void
-connection_write_to_buf(const char *string, size_t len, connection_t *conn)
+_connection_write_to_buf_impl(const char *string, size_t len,
+ connection_t *conn, int zlib)
{
int r;
+ size_t old_datalen;
if (!len)
return;
/* if it's marked for close, only allow write if we mean to flush it */
if (conn->marked_for_close && !conn->hold_open_until_flushed)
return;
- CONN_LOG_PROTECT(conn, r = write_to_buf(string, len, conn->outbuf));
+ old_datalen = buf_datalen(conn->outbuf);
+ if (zlib) {
+ dir_connection_t *dir_conn = TO_DIR_CONN(conn);
+ int done = zlib < 0;
+ if (!dir_conn) return;
+ CONN_LOG_PROTECT(conn, r = write_to_buf_zlib(conn->outbuf,
+ dir_conn->zlib_state,
+ string, len, done));
+ } else {
+ CONN_LOG_PROTECT(conn, r = write_to_buf(string, len, conn->outbuf));
+ }
if (r < 0) {
if (CONN_IS_EDGE(conn)) {
/* if it failed, it means we have our package/delivery windows set
@@ -1774,38 +1791,10 @@ connection_write_to_buf(const char *string, size_t len, connection_t *conn)
}
connection_start_writing(conn);
- conn->outbuf_flushlen += len;
-}
-
-void
-connection_write_to_buf_zlib(dir_connection_t *dir_conn,
- const char *data, size_t data_len,
- int done)
-{
- int r;
- size_t old_datalen;
- connection_t *conn;
- if (!data_len)
- return;
- conn = TO_CONN(dir_conn);
- /* if it's marked for close, only allow write if we mean to flush it */
- if (conn->marked_for_close && !conn->hold_open_until_flushed)
- return;
-
- old_datalen = buf_datalen(conn->outbuf);
- /* XXXX TOO much duplicate code! XXXX012NM */
- CONN_LOG_PROTECT(conn, r = write_to_buf_zlib(
- conn->outbuf, dir_conn->zlib_state,
- data, data_len, done));
- if (r < 0) {
- log_warn(LD_NET,
- "write_to_buf failed. Closing connection (fd %d).", conn->s);
- connection_mark_for_close(conn);
- return;
- }
-
- connection_start_writing(conn);
- conn->outbuf_flushlen += buf_datalen(conn->outbuf) - old_datalen;
+ if (zlib)
+ conn->outbuf_flushlen += buf_datalen(conn->outbuf) - old_datalen;
+ else
+ conn->outbuf_flushlen += len;
}
/** Return the conn to addr/port that has the most recent
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index 9a67622a35..2a83669fc6 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -1939,7 +1939,7 @@ static int
connection_dirserv_finish_spooling(dir_connection_t *conn)
{
if (conn->zlib_state) {
- connection_write_to_buf_zlib(conn, "", 0, 1);
+ connection_write_to_buf_zlib("", 0, conn, 1);
tor_zlib_free(conn->zlib_state);
conn->zlib_state = NULL;
}
@@ -1975,8 +1975,8 @@ connection_dirserv_add_servers_to_outbuf(dir_connection_t *conn)
body = signed_descriptor_get_body(sd);
if (conn->zlib_state) {
int last = ! smartlist_len(conn->fingerprint_stack);
- connection_write_to_buf_zlib(conn, body,
- sd->signed_descriptor_len, last);
+ connection_write_to_buf_zlib(body, sd->signed_descriptor_len, conn,
+ last);
if (last) {
tor_zlib_free(conn->zlib_state);
conn->zlib_state = NULL;
@@ -2014,9 +2014,9 @@ connection_dirserv_add_dir_bytes_to_outbuf(dir_connection_t *conn)
bytes = (ssize_t) remaining;
if (conn->zlib_state) {
- connection_write_to_buf_zlib(conn,
+ connection_write_to_buf_zlib(
conn->cached_dir->dir_z + conn->cached_dir_offset,
- bytes, bytes == remaining);
+ bytes, conn, bytes == remaining);
} else {
connection_write_to_buf(conn->cached_dir->dir_z + conn->cached_dir_offset,
bytes, TO_CONN(conn));
diff --git a/src/or/or.h b/src/or/or.h
index d8829c96f0..b81079ba0e 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -2000,11 +2000,23 @@ int connection_fetch_from_buf(char *string, size_t len, connection_t *conn);
int connection_wants_to_flush(connection_t *conn);
int connection_outbuf_too_full(connection_t *conn);
int connection_handle_write(connection_t *conn, int force);
-void connection_write_to_buf(const char *string, size_t len,
- connection_t *conn);
-void connection_write_to_buf_zlib(dir_connection_t *conn,
- const char *data, size_t data_len,
- int done);
+void _connection_write_to_buf_impl(const char *string, size_t len,
+ connection_t *conn, int zlib);
+static void connection_write_to_buf(const char *string, size_t len,
+ connection_t *conn);
+static void connection_write_to_buf_zlib(const char *string, size_t len,
+ dir_connection_t *conn, int done);
+static INLINE void
+connection_write_to_buf(const char *string, size_t len, connection_t *conn)
+{
+ _connection_write_to_buf_impl(string, len, conn, 0);
+}
+static INLINE void
+connection_write_to_buf_zlib(const char *string, size_t len,
+ dir_connection_t *conn, int done)
+{
+ _connection_write_to_buf_impl(string, len, TO_CONN(conn), done ? -1 : 1);
+}
or_connection_t *connection_or_exact_get_by_addr_port(uint32_t addr,
uint16_t port);