[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] [tor/master] Make consensus_method_is_supported() be the canonical source for its info.
Author: Nick Mathewson <nickm@xxxxxxxxxxxxxx>
Date: Wed, 19 Aug 2009 22:07:32 -0400
Subject: Make consensus_method_is_supported() be the canonical source for its info.
Commit: 8771fdfda49124e46f155a396778649946a894b9
Add a new function to derive the declared method list from
consensus_method_is_supported().
---
src/or/dirvote.c | 42 ++++++++++++++++++++++++++++++++++--------
1 files changed, 34 insertions(+), 8 deletions(-)
diff --git a/src/or/dirvote.c b/src/or/dirvote.c
index aadece9..58b02da 100644
--- a/src/or/dirvote.c
+++ b/src/or/dirvote.c
@@ -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
--
1.5.6.5