summaryrefslogtreecommitdiff
path: root/src/or/connection_ap.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2003-03-19 22:05:35 +0000
committerNick Mathewson <nickm@torproject.org>2003-03-19 22:05:35 +0000
commit3a0cf3764187f6ff56fbde3783b475222eebc034 (patch)
tree1885b94ce032011fce73b47a00189bf2490e39ab /src/or/connection_ap.c
parentd07146b7781535e08c2e3715d23d50e63741ee91 (diff)
downloadtor-3a0cf3764187f6ff56fbde3783b475222eebc034.tar.gz
tor-3a0cf3764187f6ff56fbde3783b475222eebc034.zip
Add other side of half-open-connection logic (still disabled
svn:r206
Diffstat (limited to 'src/or/connection_ap.c')
-rw-r--r--src/or/connection_ap.c25
1 files changed, 25 insertions, 0 deletions
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);