Add a node_get_by_hex_id().

This commit is contained in:
Nick Mathewson 2010-10-21 11:18:16 -04:00
parent f32140238f
commit bd1a694221
2 changed files with 34 additions and 19 deletions

View File

@ -400,31 +400,18 @@ nodelist_get_list(void)
return the_nodelist->nodes;
}
/** Given a nickname (possibly verbose, possibly a hexadecimal digest), return
* the corresponding node_t, or NULL if none exists. Warn the user if
* <b>warn_if_unnamed</b> is set, and they have specified a router by
* nickname, but the Named flag isn't set for that router. */
/** Given a hex-encoded nickname of the format DIGEST, $DIGEST, $DIGEST=name,
* or $DIGEST~name, return the node with the matching identity digest and
* nickname (if any). Return NULL if no such node exists, or if <b>hex_id</b>
* is not well-formed. */
const node_t *
node_get_by_nickname(const char *nickname, int warn_if_unnamed)
node_get_by_hex_id(const char *hex_id)
{
char digest_buf[DIGEST_LEN];
char nn_buf[MAX_NICKNAME_LEN+1];
char nn_char='\0';
if (!the_nodelist)
return NULL;
/* ???? NM Naming authorities had an additional weird behavior here where
they would treat their own namings as slightly authoritative in a
strange and inconsistent way. I think that this way is better, but we
could get the old behavior back if we wanted to by adding a function
to look in the fp_by_name table in fingerprint_list, and using this
function to override the name-to-digest lookup below if we are a
naming server. -NM
*/
/* Handle these cases: DIGEST, $DIGEST, $DIGEST=name, $DIGEST~name. */
if (hex_digest_nickname_decode(nickname, digest_buf, &nn_char, nn_buf)==0) {
if (hex_digest_nickname_decode(hex_id, digest_buf, &nn_char, nn_buf)==0) {
const node_t *node = node_get_by_id(digest_buf);
if (!node)
return NULL;
@ -442,6 +429,33 @@ node_get_by_nickname(const char *nickname, int warn_if_unnamed)
return node;
}
return NULL;
}
/** Given a nickname (possibly verbose, possibly a hexadecimal digest), return
* the corresponding node_t, or NULL if none exists. Warn the user if
* <b>warn_if_unnamed</b> is set, and they have specified a router by
* nickname, but the Named flag isn't set for that router. */
const node_t *
node_get_by_nickname(const char *nickname, int warn_if_unnamed)
{
const node_t *node;
if (!the_nodelist)
return NULL;
/* ???? NM Naming authorities had an additional weird behavior here where
they would treat their own namings as slightly authoritative in a
strange and inconsistent way. I think that this way is better, but we
could get the old behavior back if we wanted to by adding a function
to look in the fp_by_name table in fingerprint_list, and using this
function to override the name-to-digest lookup below if we are a
naming server. -NM
*/
/* Handle these cases: DIGEST, $DIGEST, $DIGEST=name, $DIGEST~name. */
if ((node = node_get_by_hex_id(nickname)) != NULL)
return node;
if (!strcasecmp(nickname, UNNAMED_ROUTER_NICKNAME))
return NULL;

View File

@ -14,6 +14,7 @@
node_t *node_get_mutable_by_id(const char *identity_digest);
const node_t *node_get_by_id(const char *identity_digest);
const node_t *node_get_by_hex_id(const char *identity_digest);
node_t *nodelist_add_routerinfo(routerinfo_t *ri);
node_t *nodelist_add_microdesc(microdesc_t *md);
void nodelist_set_consensus(networkstatus_t *ns);