diff --git a/src/or/config.c b/src/or/config.c index 7372eb9e9a..77f5a83f94 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -164,6 +164,7 @@ static config_var_t _option_vars[] = { VAR("FastFirstHopPK", BOOL, FastFirstHopPK, "1"), VAR("FetchServerDescriptors",BOOL, FetchServerDescriptors,"1"), VAR("FetchHidServDescriptors",BOOL, FetchHidServDescriptors, "1"), + VAR("FetchUselessRouters", BOOL, FetchUselessRouters, "0"), VAR("Group", STRING, Group, NULL), VAR("HardwareAccel", BOOL, HardwareAccel, "0"), VAR("HashedControlPassword",STRING, HashedControlPassword, NULL), diff --git a/src/or/or.h b/src/or/or.h index 0e0e13ad59..43a8ebfb3b 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -1286,6 +1286,7 @@ typedef struct { int PublishHidServDescriptors; /**< and our hidden service descriptors? */ int FetchServerDescriptors; /**< Do we fetch server descriptors as normal? */ int FetchHidServDescriptors; /** and hidden service descriptors? */ + int FetchUselessRouters; /**< Do we fetch non-running descriptors too? */ int AllDirActionsPrivate; /**< Should every directory action be sent * through a Tor circuit? */ diff --git a/src/or/routerlist.c b/src/or/routerlist.c index 64f637853c..53bca88459 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -3251,8 +3251,9 @@ client_would_use_router(routerstatus_t *rs, time_t now) /* This one is too old to consider. */ return 0; } - if (!rs->is_running) { - /* If we had this router descriptor, we wouldn't even bother using it. */ + if (!rs->is_running && !get_options()->FetchUselessRouters) { + /* If we had this router descriptor, we wouldn't even bother using it. + * But, if we want to have a complete list, fetch it anyway. */ return 0; } if (rs->published_on + ESTIMATED_PROPAGATION_TIME > now) {