From: Nick Mathewson Date: Wed, 19 Mar 2003 22:05:35 +0000 (+0000) Subject: Add other side of half-open-connection logic (still disabled X-Git-Tag: tor-0.0.2pre8~262 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3a0cf3764187f6ff56fbde3783b475222eebc034;p=thirdparty%2Ftor.git Add other side of half-open-connection logic (still disabled svn:r206 --- diff --git a/src/or/connection_ap.c b/src/or/connection_ap.c index 0faba3895f..caafef2400 100644 --- a/src/or/connection_ap.c +++ b/src/or/connection_ap.c @@ -11,9 +11,34 @@ int connection_ap_process_inbuf(connection_t *conn) { assert(conn && conn->type == CONN_TYPE_AP); if(conn->inbuf_reached_eof) { +#ifdef HALF_OPEN + /* eof reached; we're done reading, but we might want to write more. */ + conn->done_receiving = 1; + shutdown(conn->s, 0); /* XXX check return, refactor NM */ + if (conn->done_sending) + conn->marked_for_close = 1; + + /* XXX Factor out common logic here and in circuit_about_to_close NM */ + circ = circuit_get_by_conn(conn); + if (!circ) + return -1; + + memset(&cell, 0, sizeof(cell_t)); + cell.command = CELL_DATA; + cell.length = TOPIC_HEADER_SIZE; + *(uint16_t *)(cell.payload+2) = htons(conn->topic_id); + *cell.payload = TOPIC_COMMAND_END; + cell.aci = circ->n_aci; + if (circuit_deliver_data_cell_from_edge(&cell, circ, EDGE_AP) < 0) { + log(LOG_DEBUG,"connection_ap_process_inbuf: circuit_deliver_data_cell_from_edge failed. Closing"); + circuit_close(circ); + } + return 0; +#else /* eof reached, kill it. */ log(LOG_DEBUG,"connection_ap_process_inbuf(): conn reached eof. Closing."); return -1; +#endif } // log(LOG_DEBUG,"connection_ap_process_inbuf(): state %d.",conn->state); diff --git a/src/or/connection_exit.c b/src/or/connection_exit.c index 75096213a4..24b1f21b40 100644 --- a/src/or/connection_exit.c +++ b/src/or/connection_exit.c @@ -12,8 +12,6 @@ int connection_exit_process_inbuf(connection_t *conn) { if(conn->inbuf_reached_eof) { #ifdef HALF_OPEN - /* XXX!!! If this is right, duplicate it in connection_ap.c */ - /* eof reached; we're done reading, but we might want to write more. */ conn->done_receiving = 1; shutdown(conn->s, 0); /* XXX check return, refactor NM */