Make consensus_method_is_supported() be the canonical source for its info.

Add a new function to derive the declared method list from
consensus_method_is_supported().
This commit is contained in:
Nick Mathewson 2009-08-19 22:07:32 -04:00
parent d0c212995a
commit 8771fdfda4

View File

@ -21,6 +21,10 @@ static int dirvote_perform_vote(void);
static void dirvote_clear_votes(int all_votes);
static int dirvote_compute_consensus(void);
static int dirvote_publish_consensus(void);
static char *make_consensus_method_list(int low, int high);
/** The highest consensus method that we currently support. */
#define MAX_SUPPORTED_CONSENSUS_METHOD 6
/* =====
* Voting
@ -94,6 +98,8 @@ format_networkstatus_vote(crypto_pk_env_t *private_signing_key,
char vu[ISO_TIME_LEN+1];
char *flags = smartlist_join_strings(v3_ns->known_flags, " ", 0, NULL);
authority_cert_t *cert = v3_ns->cert;
char *methods =
make_consensus_method_list(1, MAX_SUPPORTED_CONSENSUS_METHOD);
format_iso_time(published, v3_ns->published);
format_iso_time(va, v3_ns->valid_after);
format_iso_time(fu, v3_ns->fresh_until);
@ -103,10 +109,7 @@ format_networkstatus_vote(crypto_pk_env_t *private_signing_key,
tor_snprintf(status, len,
"network-status-version 3\n"
"vote-status %s\n"
/* XXX: If you change this value, you also need to
* change consensus_method_is_supported().
* Perhaps we should unify these somehow? */
"consensus-methods 1 2 3 4 5 6\n"
"consensus-methods %s\n"
"published %s\n"
"valid-after %s\n"
"fresh-until %s\n"
@ -117,6 +120,7 @@ format_networkstatus_vote(crypto_pk_env_t *private_signing_key,
"dir-source %s %s %s %s %d %d\n"
"contact %s\n",
v3_ns->type == NS_TYPE_VOTE ? "vote" : "opinion",
methods,
published, va, fu, vu,
v3_ns->vote_seconds, v3_ns->dist_seconds,
version_lines,
@ -125,6 +129,7 @@ format_networkstatus_vote(crypto_pk_env_t *private_signing_key,
ipaddr, voter->dir_port, voter->or_port, voter->contact);
tor_free(flags);
tor_free(methods);
outp = status + strlen(status);
endp = status + len;
@ -458,10 +463,31 @@ compute_consensus_method(smartlist_t *votes)
static int
consensus_method_is_supported(int method)
{
/* XXX: If you change this value, you also need to change
* format_networkstatus_vote(). Perhaps we should unify
* these somehow? */
return (method >= 1) && (method <= 6);
return (method >= 1) && (method <= MAX_SUPPORTED_CONSENSUS_METHOD);
}
/** Return a newly allocated string holding the numbers between low and high
* (inclusive) that are supported consensus methods. */
static char *
make_consensus_method_list(int low, int high)
{
char *list;
char b[32];
int i;
smartlist_t *lst;
lst = smartlist_create();
for (i = low; i <= high; ++i) {
if (!consensus_method_is_supported(i))
continue;
tor_snprintf(b, sizeof(b), "%d", i);
smartlist_add(lst, tor_strdup(b));
}
list = smartlist_join_strings(lst, " ", 0, NULL);
tor_assert(list);
SMARTLIST_FOREACH(lst, char *, cp, tor_free(cp));
smartlist_free(lst);
return list;
}
/** Helper: given <b>lst</b>, a list of version strings such that every