From: Nick Mathewson Date: Mon, 20 Sep 2010 15:24:01 +0000 (-0400) Subject: New function to grab a directory connection fetching a resource X-Git-Tag: tor-0.2.3.1-alpha~359^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4bfc64ba1c23da0bd6f5165a788cc07d934c9a9b;p=thirdparty%2Ftor.git New function to grab a directory connection fetching a resource We need this to tell if a given consensus flavor is being downloaded or not. --- diff --git a/src/or/connection.c b/src/or/connection.c index 80144c4d31..9c6166df3b 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -3397,6 +3397,33 @@ connection_get_by_type_state_rendquery(int type, int state, return NULL; } +/** Return a directory connection (if any one exists) that is fetching + * the item described by state/resource */ +dir_connection_t * +connection_dir_get_by_purpose_and_resource(int purpose, + const char *resource) +{ + smartlist_t *conns = get_connection_array(); + + SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) { + dir_connection_t *dirconn; + if (conn->type != CONN_TYPE_DIR || conn->marked_for_close || + conn->purpose != purpose) + continue; + dirconn = TO_DIR_CONN(conn); + if (dirconn->requested_resource == NULL) { + if (resource == NULL) + return dirconn; + } else if (resource) { + if (0 == strcmp(resource, dirconn->requested_resource)) + return dirconn; + } + } SMARTLIST_FOREACH_END(conn); + + return NULL; +} + + /** Return an open, non-marked connection of a given type and purpose, or NULL * if no such connection exists. */ connection_t * diff --git a/src/or/connection.h b/src/or/connection.h index a40b1a5fb5..004ede5d04 100644 --- a/src/or/connection.h +++ b/src/or/connection.h @@ -124,6 +124,8 @@ connection_t *connection_get_by_type_addr_port_purpose(int type, connection_t *connection_get_by_type_state(int type, int state); connection_t *connection_get_by_type_state_rendquery(int type, int state, const char *rendquery); +dir_connection_t *connection_dir_get_by_purpose_and_resource( + int state, const char *resource); #define connection_speaks_cells(conn) ((conn)->type == CONN_TYPE_OR) int connection_is_listener(connection_t *conn);