#include "orconfig.h"
#include "core/or/or.h"
#include "feature/dirclient/dirclient_modes.h"
#include "feature/dircache/dirserv.h"
#include "feature/relay/relay_find_addr.h"
#include "feature/relay/router.h"
#include "feature/relay/routermode.h"
#include "feature/stats/predict_ports.h"
#include "app/config/or_options_st.h"
#include "feature/nodelist/routerinfo_st.h"
int
dirclient_must_use_begindir(const or_options_t *options)
{
return !public_server_mode(options);
}
int
dirclient_fetches_from_authorities(const or_options_t *options)
{
const routerinfo_t *me;
int refuseunknown;
if (options->FetchDirInfoEarly)
return 1;
if (options->BridgeRelay == 1)
return 0;
if (server_mode(options) && !relay_has_address_set(AF_INET))
return 1;
refuseunknown = ! router_my_exit_policy_is_reject_star() &&
should_refuse_unknown_exits(options);
if (!dir_server_mode(options) && !refuseunknown)
return 0;
if (!server_mode(options) || !advertised_server_mode())
return 0;
me = router_get_my_routerinfo();
if (!me || (!me->supports_tunnelled_dir_requests && !refuseunknown))
return 0;
return 1;
}
int
dirclient_fetches_dir_info_early(const or_options_t *options)
{
return dirclient_fetches_from_authorities(options);
}
int
dirclient_fetches_dir_info_later(const or_options_t *options)
{
return options->UseBridges != 0;
}
int
dirclient_too_idle_to_fetch_descriptors(const or_options_t *options,
time_t now)
{
return !directory_caches_dir_info(options) &&
!options->FetchUselessDescriptors &&
rep_hist_circbuilding_dormant(now);
}