Fix some xxx020 items.
svn:r12864
in really weird results on platforms whose sys/types.h files define
nonstandard integer types.
- Fix compilation with --disable-threads set.
+ - Authorities decide whether they're authoritative for a given router
+ based on the router's purpose.
o Minor features:
- On USR1, when dmalloc is in use, log the top 10 memory
return 0;
}
- if (authdir_mode_handles_descs(options) &&
+ if (authdir_mode_handles_descs(options, -1) &&
!strcmp(url,"/tor/")) { /* server descriptor post */
const char *msg = NULL;
uint8_t purpose = authdir_mode_bridge(options) ?
MAX_NICKNAME_LEN+BASE64_DIGEST_LEN*2+ISO_TIME_LEN+INET_NTOA_BUF_LEN+ \
5*2 /* ports */ + 10 /* punctuation */ + \
/* second line */ \
- (LONGEST_STATUS_FLAG_NAME_LEN+1)*N_STATUS_FLAGS + 2)
-/* XXX020 RS_ENTRY_LEN should probably include space for v lines */
+ (LONGEST_STATUS_FLAG_NAME_LEN+1)*N_STATUS_FLAGS + 2 + \
+ /* v line. XXXX020 not accurate! */ \
+ 80 \
+ )
size_t len;
char *status = NULL;
return -1;
}
options = get_options(); /* they have changed now */
- if (authdir_mode_handles_descs(options)) {
+ if (authdir_mode_handles_descs(options, -1)) {
/* reload the approved-routers file */
if (dirserv_load_fingerprint_file() < 0) {
/* warnings are logged from dirserv_load_fingerprint_file() directly */
int authdir_mode_v1(or_options_t *options);
int authdir_mode_v2(or_options_t *options);
int authdir_mode_v3(or_options_t *options);
-int authdir_mode_handles_descs(or_options_t *options);
+int authdir_mode_handles_descs(or_options_t *options, int purpose);
int authdir_mode_publishes_statuses(or_options_t *options);
int authdir_mode_tests_reachability(or_options_t *options);
int authdir_mode_bridge(or_options_t *options);
options->V2AuthoritativeDir ||
options->V3AuthoritativeDir);
}
-/** Return true iff we are an authoritative directory server that
- * is willing to receive or serve descriptors on its dirport.
- */
+/** Return true iff we are an authoritative directory server that is
+ * authoritative about receiving and serving descriptors of type
+ * <b>purpose</b> its dirport. Use -1 for "any purpose". */
int
-authdir_mode_handles_descs(or_options_t *options)
-{
- return authdir_mode_any_nonhidserv(options);
+authdir_mode_handles_descs(or_options_t *options, int purpose)
+{
+ if (purpose < 0)
+ return authdir_mode_any_nonhidserv(options);
+ else if (purpose == ROUTER_PURPOSE_GENERAL)
+ return (options->V1AuthoritativeDir ||
+ options->V2AuthoritativeDir ||
+ options->V3AuthoritativeDir);
+ else if (purpose == ROUTER_PURPOSE_BRIDGE)
+ return (options->BridgeAuthoritativeDir);
+ else
+ return 0;
}
/** Return true iff we are an authoritative directory server that
* publishes its own network statuses.
int
authdir_mode_tests_reachability(or_options_t *options)
{
- return authdir_mode_handles_descs(options);
+ return authdir_mode_handles_descs(options, -1);
}
/** Return true iff we believe ourselves to be a bridge authoritative
* directory server.
int from_cache, int from_fetch)
{
const char *id_digest;
- int authdir = authdir_mode(get_options());
+ int authdir = authdir_mode_handles_descs(get_options(), router->purpose);
int authdir_believes_valid = 0;
routerinfo_t *old_router;
networkstatus_vote_t *consensus = networkstatus_get_latest_consensus();
}
if (router->purpose == ROUTER_PURPOSE_GENERAL &&
- consensus && !in_consensus && !authdir_mode(get_options())) {
+ consensus && !in_consensus && !authdir) {
/* If it's a general router not listed in the consensus, then don't
* consider replacing the latest router with it. */
if (!from_cache && should_cache_old_descriptors())
smartlist_add(downloadable, rs->descriptor_digest);
});
- if (!authdir_mode_handles_descs(options) && smartlist_len(no_longer_old)) {
- /* XXX020 Nick: where do authorities decide never to put stuff in old?
- * We should make sure bridge descriptors do that too. */
+ if (!authdir_mode_handles_descs(options, ROUTER_PURPOSE_GENERAL)
+ && smartlist_len(no_longer_old)) {
routerlist_t *rl = router_get_routerlist();
log_info(LD_DIR, "%d router descriptors listed in consensus are "
"currently in old_routers; making them current.",