Parcourir la source

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.
Nick Mathewson il y a 13 ans
Parent
commit
4bfc64ba1c
2 fichiers modifiés avec 29 ajouts et 0 suppressions
  1. 27 0
      src/or/connection.c
  2. 2 0
      src/or/connection.h

+ 27 - 0
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 <b>state</b>/<b>resource</b> */
+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 *

+ 2 - 0
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);