diff options
author | Roger Dingledine <arma@torproject.org> | 2003-10-04 02:38:18 +0000 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2003-10-04 02:38:18 +0000 |
commit | f563bbd2f988cd1f6ca292f89a47a86f98fe0e8d (patch) | |
tree | 08b3ea32a4ce45bc729225bd1beeed555fd0dd52 /src | |
parent | a6bab569abd3ac8f16a3603813fa03e4585a3bd3 (diff) | |
download | tor-f563bbd2f988cd1f6ca292f89a47a86f98fe0e8d.tar tor-f563bbd2f988cd1f6ca292f89a47a86f98fe0e8d.tar.gz |
refactor so connection_write_to_buf() never fails
svn:r537
Diffstat (limited to 'src')
-rw-r--r-- | src/or/circuit.c | 12 | ||||
-rw-r--r-- | src/or/connection.c | 17 | ||||
-rw-r--r-- | src/or/connection_edge.c | 23 | ||||
-rw-r--r-- | src/or/connection_or.c | 4 | ||||
-rw-r--r-- | src/or/cpuworker.c | 10 | ||||
-rw-r--r-- | src/or/directory.c | 22 | ||||
-rw-r--r-- | src/or/dns.c | 10 | ||||
-rw-r--r-- | src/or/main.c | 3 | ||||
-rw-r--r-- | src/or/onion.c | 4 | ||||
-rw-r--r-- | src/or/or.h | 6 |
10 files changed, 39 insertions, 72 deletions
diff --git a/src/or/circuit.c b/src/or/circuit.c index e047fc9e4..f39b16080 100644 --- a/src/or/circuit.c +++ b/src/or/circuit.c @@ -267,7 +267,8 @@ int circuit_deliver_relay_cell(cell_t *cell, circuit_t *circ, } log_fn(LOG_DEBUG,"Passing on unrecognized cell."); - return connection_write_cell_to_buf(cell, conn); + connection_write_cell_to_buf(cell, conn); + return 0; } int relay_crypt(circuit_t *circ, char *in, int inlen, char cell_direction, @@ -737,9 +738,7 @@ int circuit_send_next_onion_skin(circuit_t *circ) { return -1; } - if(connection_write_cell_to_buf(&cell, circ->n_conn) < 0) { - return -1; - } + connection_write_cell_to_buf(&cell, circ->n_conn); circ->cpath->state = CPATH_STATE_AWAITING_KEYS; circ->state = CIRCUIT_STATE_BUILDING; @@ -843,10 +842,7 @@ int circuit_extend(cell_t *cell, circuit_t *circ) { memcpy(newcell.payload, cell->payload+RELAY_HEADER_SIZE+6, DH_ONIONSKIN_LEN); - if(connection_write_cell_to_buf(&newcell, circ->n_conn) < 0) { - return -1; - } - + connection_write_cell_to_buf(&newcell, circ->n_conn); return 0; } diff --git a/src/or/connection.c b/src/or/connection.c index ab401771b..918aa6654 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -489,13 +489,10 @@ int connection_handle_write(connection_t *conn) { return 0; } -int connection_write_to_buf(const char *string, int len, connection_t *conn) { +void connection_write_to_buf(const char *string, int len, connection_t *conn) { - if(!len) - return 0; - - if(conn->marked_for_close) - return 0; + if(!len || conn->marked_for_close) + return; if( (!connection_speaks_cells(conn)) || (!connection_state_is_open(conn)) || @@ -506,7 +503,10 @@ int connection_write_to_buf(const char *string, int len, connection_t *conn) { conn->outbuf_flushlen += len; } - return write_to_buf(string, len, conn->outbuf); + if(write_to_buf(string, len, conn->outbuf) < 0) { + log_fn(LOG_WARNING,"write_to_buf failed. Closing connection (fd %d).", conn->s); + conn->marked_for_close = 1; + } } connection_t *connection_exact_get_by_addr_port(uint32_t addr, uint16_t port) { @@ -653,7 +653,8 @@ int connection_send_destroy(aci_t aci, connection_t *conn) { cell.aci = aci; cell.command = CELL_DESTROY; log_fn(LOG_INFO,"Sending destroy (aci %d).",aci); - return connection_write_cell_to_buf(&cell, conn); + connection_write_cell_to_buf(&cell, conn); + return 0; } int connection_process_inbuf(connection_t *conn) { diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index c8f48f581..9bba3c99c 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -171,13 +171,9 @@ int connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, connection // printf("New text for buf (%d bytes): '%s'", cell->length - RELAY_HEADER_SIZE, cell->payload + RELAY_HEADER_SIZE); stats_n_data_bytes_received += (cell->length - RELAY_HEADER_SIZE); - if(connection_write_to_buf(cell->payload + RELAY_HEADER_SIZE, - cell->length - RELAY_HEADER_SIZE, conn) < 0) { -/*ENDCLOSE*/ conn->marked_for_close = 1; - return 0; - } - if(connection_consider_sending_sendme(conn, edge_type) < 0) -/*ENDCLOSE*/ conn->marked_for_close = 1; + connection_write_to_buf(cell->payload + RELAY_HEADER_SIZE, + cell->length - RELAY_HEADER_SIZE, conn); + connection_consider_sending_sendme(conn, edge_type); return 0; case RELAY_COMMAND_END: if(!conn) { @@ -302,7 +298,8 @@ int connection_edge_finished_flushing(connection_t *conn) { case AP_CONN_STATE_OPEN: case EXIT_CONN_STATE_OPEN: connection_stop_writing(conn); - return connection_consider_sending_sendme(conn, conn->type); + connection_consider_sending_sendme(conn, conn->type); + return 0; case AP_CONN_STATE_SOCKS_WAIT: connection_stop_writing(conn); return 0; @@ -403,18 +400,18 @@ repeat_connection_package_raw_inbuf: goto repeat_connection_package_raw_inbuf; } -int connection_consider_sending_sendme(connection_t *conn, int edge_type) { +void connection_consider_sending_sendme(connection_t *conn, int edge_type) { circuit_t *circ; cell_t cell; if(connection_outbuf_too_full(conn)) - return 0; + return; circ = circuit_get_by_conn(conn); if(!circ) { /* this can legitimately happen if the destroy has already arrived and torn down the circuit */ log_fn(LOG_INFO,"No circuit associated with conn. Skipping."); - return 0; + return; } memset(&cell, 0, sizeof(cell_t)); @@ -434,11 +431,9 @@ int connection_consider_sending_sendme(connection_t *conn, int edge_type) { if(circuit_deliver_relay_cell(&cell, circ, CELL_DIRECTION(edge_type), conn->cpath_layer) < 0) { log_fn(LOG_WARNING,"circuit_deliver_relay_cell failed. Closing."); circuit_close(circ); - return 0; + return; } } - - return 0; } static int connection_ap_handshake_process_socks(connection_t *conn) { diff --git a/src/or/connection_or.c b/src/or/connection_or.c index 579cea499..0a1e41406 100644 --- a/src/or/connection_or.c +++ b/src/or/connection_or.c @@ -248,13 +248,13 @@ static int connection_tls_finish_handshake(connection_t *conn) { /* ********************************** */ -int connection_write_cell_to_buf(const cell_t *cellp, connection_t *conn) { +void connection_write_cell_to_buf(const cell_t *cellp, connection_t *conn) { char networkcell[CELL_NETWORK_SIZE]; char *n = networkcell; cell_pack(n, cellp); - return connection_write_to_buf(n, CELL_NETWORK_SIZE, conn); + connection_write_to_buf(n, CELL_NETWORK_SIZE, conn); } /* if there's a whole cell there, pull it off and process it. */ diff --git a/src/or/cpuworker.c b/src/or/cpuworker.c index b47df87a7..1b9e5d8d1 100644 --- a/src/or/cpuworker.c +++ b/src/or/cpuworker.c @@ -267,13 +267,9 @@ int assign_to_cpuworker(connection_t *cpuworker, unsigned char question_type, cpuworker->state = CPUWORKER_STATE_BUSY_ONION; num_cpuworkers_busy++; - if(connection_write_to_buf(&question_type, 1, cpuworker) < 0 || - connection_write_to_buf(tag, sizeof(tag), cpuworker) < 0 || - connection_write_to_buf(circ->onionskin, DH_ONIONSKIN_LEN, cpuworker) < 0) { - log_fn(LOG_WARNING,"Write failed. Closing worker and failing circ."); - cpuworker->marked_for_close = 1; - return -1; - } + connection_write_to_buf(&question_type, 1, cpuworker); + connection_write_to_buf(tag, sizeof(tag), cpuworker); + connection_write_to_buf(circ->onionskin, DH_ONIONSKIN_LEN, cpuworker); } return 0; } diff --git a/src/or/directory.c b/src/or/directory.c index 4cbae07b2..88854a35c 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -90,10 +90,7 @@ static int directory_send_command(connection_t *conn, int command) { switch(command) { case DIR_CONN_STATE_CONNECTING_FETCH: - if(connection_write_to_buf(fetchstring, strlen(fetchstring), conn) < 0) { - log_fn(LOG_WARNING,"Couldn't write fetch to buffer."); - return -1; - } + connection_write_to_buf(fetchstring, strlen(fetchstring), conn); conn->state = DIR_CONN_STATE_CLIENT_SENDING_FETCH; break; case DIR_CONN_STATE_CONNECTING_UPLOAD: @@ -104,10 +101,7 @@ static int directory_send_command(connection_t *conn, int command) { } snprintf(tmp, sizeof(tmp), "POST / HTTP/1.0\r\nContent-Length: %d\r\n\r\n%s", strlen(s), s); - if(connection_write_to_buf(tmp, strlen(tmp), conn) < 0) { - log_fn(LOG_WARNING,"Couldn't write post/descriptor to buffer."); - return -1; - } + connection_write_to_buf(tmp, strlen(tmp), conn); conn->state = DIR_CONN_STATE_CLIENT_SENDING_UPLOAD; break; } @@ -200,11 +194,8 @@ static int directory_handle_command(connection_t *conn) { } log_fn(LOG_DEBUG,"Dumping directory to client."); - if((connection_write_to_buf(answerstring, strlen(answerstring), conn) < 0) || - (connection_write_to_buf(cp, dlen, conn) < 0)) { - log_fn(LOG_WARNING,"Failed to write answerstring+directory to outbuf."); - return -1; - } + connection_write_to_buf(answerstring, strlen(answerstring), conn); + connection_write_to_buf(cp, dlen, conn); conn->state = DIR_CONN_STATE_SERVER_WRITING; return 0; } @@ -218,10 +209,7 @@ static int directory_handle_command(connection_t *conn) { return -1; /* XXX should write an http failed code */ } dirserv_get_directory(&cp); /* rebuild and write to disk */ - if(connection_write_to_buf(answerstring, strlen(answerstring), conn) < 0) { - log_fn(LOG_WARNING,"Failed to write answerstring to outbuf."); - return -1; - } + connection_write_to_buf(answerstring, strlen(answerstring), conn); conn->state = DIR_CONN_STATE_SERVER_WRITING; return 0; } diff --git a/src/or/dns.c b/src/or/dns.c index e12f522c6..75f17c6e6 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -170,14 +170,8 @@ static int assign_to_dnsworker(connection_t *exitconn) { num_dnsworkers_busy++; len = strlen(dnsconn->address); - /* FFFF we should have it retry if the first worker bombs out */ - if(connection_write_to_buf(&len, 1, dnsconn) < 0 || - connection_write_to_buf(dnsconn->address, len, dnsconn) < 0) { - log_fn(LOG_WARNING,"Write failed. Closing worker and failing resolve."); - dnsconn->marked_for_close = 1; - dns_cancel_pending_resolve(exitconn->address, NULL); - return -1; - } + connection_write_to_buf(&len, 1, dnsconn); + connection_write_to_buf(dnsconn->address, len, dnsconn); // log_fn(LOG_DEBUG,"submitted '%s'", exitconn->address); return 0; diff --git a/src/or/main.c b/src/or/main.c index 2c31c309b..4c5a296c0 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -345,8 +345,7 @@ static int prepare_for_poll(void) { conn->address, conn->port); memset(&cell,0,sizeof(cell_t)); cell.command = CELL_PADDING; - if(connection_write_cell_to_buf(&cell, conn) < 0) - conn->marked_for_close = 1; + connection_write_cell_to_buf(&cell, conn); } } } diff --git a/src/or/onion.c b/src/or/onion.c index 42b978fb1..84d70df40 100644 --- a/src/or/onion.c +++ b/src/or/onion.c @@ -151,9 +151,7 @@ int onionskin_answer(circuit_t *circ, unsigned char *payload, unsigned char *key return -1; } - if(connection_write_cell_to_buf(&cell, circ->p_conn) < 0) { - return -1; - } + connection_write_cell_to_buf(&cell, circ->p_conn); log_fn(LOG_DEBUG,"Finished sending 'created' cell."); return 0; diff --git a/src/or/or.h b/src/or/or.h index 90d602871..857ed5d48 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -550,7 +550,7 @@ int connection_wants_to_flush(connection_t *conn); int connection_outbuf_too_full(connection_t *conn); int connection_flush_buf(connection_t *conn); int connection_handle_write(connection_t *conn); -int connection_write_to_buf(const char *string, int len, connection_t *conn); +void connection_write_to_buf(const char *string, int len, connection_t *conn); connection_t *connection_twin_get_by_addr_port(uint32_t addr, uint16_t port); connection_t *connection_exact_get_by_addr_port(uint32_t addr, uint16_t port); @@ -581,7 +581,7 @@ int connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, connection int connection_edge_finished_flushing(connection_t *conn); int connection_package_raw_inbuf(connection_t *conn); -int connection_consider_sending_sendme(connection_t *conn, int edge_type); +void connection_consider_sending_sendme(connection_t *conn, int edge_type); int connection_exit_connect(connection_t *conn); @@ -601,7 +601,7 @@ connection_t *connection_or_connect(routerinfo_t *router); int connection_tls_start_handshake(connection_t *conn, int receiving); int connection_tls_continue_handshake(connection_t *conn); -int connection_write_cell_to_buf(const cell_t *cellp, connection_t *conn); +void connection_write_cell_to_buf(const cell_t *cellp, connection_t *conn); int connection_process_cell_from_inbuf(connection_t *conn); /********************************* cpuworker.c *****************************/ |