}
}
+/* return -1 if an unexpected error with conn, else 0. */
static int connection_ap_handshake_process_socks(connection_t *conn) {
socks_request_t *socks;
int sockshere;
return sockshere;
} /* else socks handshake is done, continue processing */
- conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
- /* attaching to a dirty circuit is fine */
- return connection_ap_handshake_attach_circuit(conn,0);
+ /* this call _modifies_ socks->address iff it's a hidden-service request */
+ if (rend_parse_rendezvous_address(socks->address) < 0) {
+ /* normal request */
+ conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
+ /* attaching to a dirty circuit is fine */
+ return connection_ap_handshake_attach_circuit(conn,0);
+ } else {
+ /* it's a hidden-service request */
+ const char *descp;
+ int desc_len;
+
+ /* see if we already have it cached */
+ if (rend_cache_lookup(socks->address, &descp, &desc_len) == 1) {
+ /* then pick and launch a rendezvous circuit */
+ /* go into some other state */
+ } else {
+ /* initiate a dir hidserv desc lookup */
+ /* go into a state where you'll be notified of the answer */
+ }
+ }
+ return 0;
}
static int connection_ap_handshake_attach_circuit(connection_t *conn,
int rend_cache_lookup(char *query, const char **desc, int *desc_len);
int rend_cache_store(char *desc, int desc_len);
+int rend_parse_rendezvous_address(char *address);
+
/********************************* rendservice.c ***************************/
int rend_config_services(or_options_t *options);
return 0;
}
+/* ==== General utility functions for rendezvous. */
+
+/* If address is of the form "y.onion" with a well-formed handle y,
+ * then put a '\0' after y and return 0.
+ * Else return -1 and change nothing.
+ */
+int rend_parse_rendezvous_address(char *address) {
+
+
+ return -1;
+}