mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
r14886@Kushana: nickm | 2007-10-11 11:02:53 -0400
Move prototypes around in or.h so that the functions from routerlist.c which moved to networkstatus.c are all grouped in the right section. svn:r11869
This commit is contained in:
parent
6670122619
commit
52ca3a7610
197
src/or/or.h
197
src/or/or.h
@ -2886,7 +2886,7 @@ format_networkstatus_vote(crypto_pk_env_t *private_key,
|
|||||||
|
|
||||||
/********************************* dirvote.c ************************/
|
/********************************* dirvote.c ************************/
|
||||||
|
|
||||||
/** Lowest allowable value for VoteSeconds. /*
|
/** Lowest allowable value for VoteSeconds. */
|
||||||
#define MIN_VOTE_SECONDS 20
|
#define MIN_VOTE_SECONDS 20
|
||||||
/** Lowest allowable value for DistSeconds. */
|
/** Lowest allowable value for DistSeconds. */
|
||||||
#define MIN_DIST_SECONDS 20
|
#define MIN_DIST_SECONDS 20
|
||||||
@ -3040,37 +3040,67 @@ int tor_init(int argc, char **argv);
|
|||||||
* completely? */
|
* completely? */
|
||||||
#define MAX_NETWORKSTATUS_AGE (10*24*60*60)
|
#define MAX_NETWORKSTATUS_AGE (10*24*60*60)
|
||||||
|
|
||||||
void networkstatus_consensus_download_failed(int status_code);
|
|
||||||
void networkstatus_reset_warnings(void);
|
|
||||||
int router_reload_networkstatus(void);
|
|
||||||
/* for consensuses. */
|
|
||||||
int router_reload_consensus_networkstatus(void);
|
|
||||||
networkstatus_vote_t *networkstatus_get_latest_consensus(void);
|
|
||||||
networkstatus_vote_t *networkstatus_get_live_consensus(time_t now);
|
|
||||||
int networkstatus_set_current_consensus(const char *consensus, int from_cache,
|
|
||||||
int was_waiting_for_certs);
|
|
||||||
char *networkstatus_get_cache_filename(const char *identity_digest);
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NS_FROM_CACHE, NS_FROM_DIR_BY_FP, NS_FROM_DIR_ALL, NS_GENERATED
|
NS_FROM_CACHE, NS_FROM_DIR_BY_FP, NS_FROM_DIR_ALL, NS_GENERATED
|
||||||
} networkstatus_source_t;
|
} networkstatus_source_t;
|
||||||
|
|
||||||
|
typedef enum version_status_t {
|
||||||
|
VS_RECOMMENDED=0, /**< This version is listed as recommended. */
|
||||||
|
VS_OLD=1, /**< This version is older than any recommended version. */
|
||||||
|
VS_NEW=2, /**< This version is newer than any recommended version. */
|
||||||
|
VS_NEW_IN_SERIES=3, /**< This version is newer than any recommended version
|
||||||
|
* in its series, but later recommended versions exist.
|
||||||
|
*/
|
||||||
|
VS_UNRECOMMENDED=4 /**< This version is not recommended (general case). */
|
||||||
|
} version_status_t;
|
||||||
|
|
||||||
|
typedef struct combined_version_status_t {
|
||||||
|
/** How many networkstatuses claim to know about versions? */
|
||||||
|
int n_versioning;
|
||||||
|
/** What do the majority of networkstatuses believe about this version? */
|
||||||
|
enum version_status_t consensus;
|
||||||
|
/** How many networkstatuses constitute the majority? */
|
||||||
|
int n_concurring;
|
||||||
|
} combined_version_status_t;
|
||||||
|
|
||||||
|
void networkstatus_reset_warnings(void);
|
||||||
|
int router_reload_networkstatus(void);
|
||||||
|
int router_reload_consensus_networkstatus(void);
|
||||||
|
void routerstatus_free(routerstatus_t *rs);
|
||||||
|
void networkstatus_free(networkstatus_t *ns);
|
||||||
|
char *networkstatus_get_cache_filename(const char *identity_digest);
|
||||||
int router_set_networkstatus(const char *s, time_t arrived_at,
|
int router_set_networkstatus(const char *s, time_t arrived_at,
|
||||||
networkstatus_source_t source,
|
networkstatus_source_t source,
|
||||||
smartlist_t *requested_fingerprints);
|
smartlist_t *requested_fingerprints);
|
||||||
void networkstatus_list_clean(time_t now);
|
void networkstatus_list_clean(time_t now);
|
||||||
routerstatus_t *networkstatus_find_entry(networkstatus_t *ns,
|
routerstatus_t *networkstatus_find_entry(networkstatus_t *ns,
|
||||||
const char *digest);
|
const char *digest);
|
||||||
/* XXXX020 move remaining functions in networkstatus.c into this section. */
|
|
||||||
const smartlist_t *networkstatus_get_v2_list(void);
|
const smartlist_t *networkstatus_get_v2_list(void);
|
||||||
const smartlist_t *networkstatus_get_all_statuses(void);
|
const smartlist_t *networkstatus_get_all_statuses(void);
|
||||||
void networkstatus_note_certs_arrived(void);
|
routerstatus_t *router_get_combined_status_by_digest(const char *digest);
|
||||||
const char *networkstatus_get_router_digest_by_nickname(const char *nickname);
|
routerstatus_t *router_get_combined_status_by_descriptor_digest(const char *d);
|
||||||
void routerstatus_list_update_from_networkstatus(time_t now);
|
|
||||||
|
|
||||||
void networkstatus_free_all(void);
|
|
||||||
routerstatus_t *router_get_combined_status_by_nickname(const char *nickname,
|
routerstatus_t *router_get_combined_status_by_nickname(const char *nickname,
|
||||||
int warn_if_unnamed);
|
int warn_if_unnamed);
|
||||||
void routerstatus_free(routerstatus_t *routerstatus);
|
const char *networkstatus_get_router_digest_by_nickname(const char *nickname);
|
||||||
void networkstatus_free(networkstatus_t *networkstatus);
|
routerstatus_t *routerstatus_get_by_hexdigest(const char *hexdigest);
|
||||||
|
void networkstatus_consensus_download_failed(int status_code);
|
||||||
|
int should_delay_dir_fetches(or_options_t *options);
|
||||||
|
void update_networkstatus_downloads(time_t now);
|
||||||
|
networkstatus_t *networkstatus_get_by_digest(const char *digest);
|
||||||
|
networkstatus_vote_t *networkstatus_get_latest_consensus(void);
|
||||||
|
networkstatus_vote_t *networkstatus_get_live_consensus(time_t now);
|
||||||
|
int networkstatus_set_current_consensus(const char *consensus, int from_cache,
|
||||||
|
int was_waiting_for_certs);
|
||||||
|
void networkstatus_note_certs_arrived(void);
|
||||||
|
void routers_update_all_from_networkstatus(time_t now);
|
||||||
|
void networkstatus_list_update_recent(time_t now);
|
||||||
|
void routerstatus_list_update_from_networkstatus(time_t now);
|
||||||
|
void routers_update_status_from_networkstatus(smartlist_t *routers,
|
||||||
|
int reset_failures);
|
||||||
|
char *networkstatus_getinfo_helper_single(routerstatus_t *rs);
|
||||||
|
int getinfo_helper_networkstatus(control_connection_t *conn,
|
||||||
|
const char *question, char **answer);
|
||||||
|
void networkstatus_free_all(void);
|
||||||
|
|
||||||
/********************************* ntmain.c ***************************/
|
/********************************* ntmain.c ***************************/
|
||||||
#ifdef MS_WINDOWS
|
#ifdef MS_WINDOWS
|
||||||
@ -3486,26 +3516,32 @@ typedef struct trusted_dir_server_t {
|
|||||||
**/
|
**/
|
||||||
} trusted_dir_server_t;
|
} trusted_dir_server_t;
|
||||||
|
|
||||||
int router_reload_router_list(void);
|
#define ROUTER_REQUIRED_MIN_BANDWIDTH 10000
|
||||||
|
|
||||||
|
#define ROUTER_MAX_DECLARED_BANDWIDTH INT32_MAX
|
||||||
|
|
||||||
int get_n_authorities(authority_type_t type);
|
int get_n_authorities(authority_type_t type);
|
||||||
smartlist_t *router_get_trusted_dir_servers(void);
|
int trusted_dirs_reload_certs(void);
|
||||||
routerstatus_t *router_pick_directory_server(int requireother,
|
int trusted_dirs_load_certs_from_string(const char *contents, int from_store);
|
||||||
int fascistfirewall,
|
void trusted_dirs_flush_certs_to_disk(void);
|
||||||
authority_type_t type,
|
|
||||||
int retry_if_no_servers);
|
|
||||||
routerstatus_t *router_pick_trusteddirserver(authority_type_t type,
|
|
||||||
int requireother,
|
|
||||||
int fascistfirewall,
|
|
||||||
int retry_if_no_servers);
|
|
||||||
trusted_dir_server_t *router_get_trusteddirserver_by_digest(
|
|
||||||
const char *digest);
|
|
||||||
trusted_dir_server_t *trusteddirserver_get_by_v3_auth_digest(
|
|
||||||
const char *digest);
|
|
||||||
authority_cert_t *authority_cert_get_newest_by_id(const char *id_digest);
|
authority_cert_t *authority_cert_get_newest_by_id(const char *id_digest);
|
||||||
authority_cert_t *authority_cert_get_by_sk_digest(const char *sk_digest);
|
authority_cert_t *authority_cert_get_by_sk_digest(const char *sk_digest);
|
||||||
authority_cert_t *authority_cert_get_by_digests(const char *id_digest,
|
authority_cert_t *authority_cert_get_by_digests(const char *id_digest,
|
||||||
const char *sk_digest);
|
const char *sk_digest);
|
||||||
void authority_certs_fetch_missing(networkstatus_vote_t *status, time_t now);
|
void authority_certs_fetch_missing(networkstatus_vote_t *status, time_t now);
|
||||||
|
int router_reload_router_list(void);
|
||||||
|
smartlist_t *router_get_trusted_dir_servers(void);
|
||||||
|
routerstatus_t *router_pick_directory_server(int requireother,
|
||||||
|
int fascistfirewall,
|
||||||
|
authority_type_t type,
|
||||||
|
int retry_if_no_servers);
|
||||||
|
trusted_dir_server_t *router_get_trusteddirserver_by_digest(const char *d);
|
||||||
|
trusted_dir_server_t *trusteddirserver_get_by_v3_auth_digest(const char *d);
|
||||||
|
routerstatus_t *router_pick_trusteddirserver(authority_type_t type,
|
||||||
|
int requireother,
|
||||||
|
int fascistfirewall,
|
||||||
|
int retry_if_no_servers);
|
||||||
|
void router_reset_status_download_failures(void);
|
||||||
void routerlist_add_family(smartlist_t *sl, routerinfo_t *router);
|
void routerlist_add_family(smartlist_t *sl, routerinfo_t *router);
|
||||||
void add_nickname_list_to_smartlist(smartlist_t *sl, const char *list,
|
void add_nickname_list_to_smartlist(smartlist_t *sl, const char *list,
|
||||||
int must_be_running);
|
int must_be_running);
|
||||||
@ -3513,29 +3549,32 @@ int router_nickname_is_in_list(routerinfo_t *router, const char *list);
|
|||||||
routerinfo_t *routerlist_find_my_routerinfo(void);
|
routerinfo_t *routerlist_find_my_routerinfo(void);
|
||||||
routerinfo_t *router_find_exact_exit_enclave(const char *address,
|
routerinfo_t *router_find_exact_exit_enclave(const char *address,
|
||||||
uint16_t port);
|
uint16_t port);
|
||||||
|
|
||||||
#define ROUTER_REQUIRED_MIN_BANDWIDTH 10000
|
|
||||||
|
|
||||||
#define ROUTER_MAX_DECLARED_BANDWIDTH INT32_MAX
|
|
||||||
int router_is_unreliable(routerinfo_t *router, int need_uptime,
|
int router_is_unreliable(routerinfo_t *router, int need_uptime,
|
||||||
int need_capacity, int need_guard);
|
int need_capacity, int need_guard);
|
||||||
uint32_t router_get_advertised_bandwidth(routerinfo_t *router);
|
uint32_t router_get_advertised_bandwidth(routerinfo_t *router);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NO_WEIGHTING, WEIGHT_FOR_EXIT, WEIGHT_FOR_GUARD
|
NO_WEIGHTING, WEIGHT_FOR_EXIT, WEIGHT_FOR_GUARD
|
||||||
} bandwidth_weight_rule_t;
|
} bandwidth_weight_rule_t;
|
||||||
routerinfo_t *routerlist_sl_choose_by_bandwidth(smartlist_t *sl,
|
routerinfo_t *routerlist_sl_choose_by_bandwidth(smartlist_t *sl,
|
||||||
bandwidth_weight_rule_t rule);
|
bandwidth_weight_rule_t rule);
|
||||||
routerstatus_t *routerstatus_sl_choose_by_bandwidth(smartlist_t *sl);
|
routerstatus_t *routerstatus_sl_choose_by_bandwidth(smartlist_t *sl);
|
||||||
|
|
||||||
routerinfo_t *router_choose_random_node(const char *preferred,
|
routerinfo_t *router_choose_random_node(const char *preferred,
|
||||||
const char *excluded,
|
const char *excluded,
|
||||||
smartlist_t *excludedsmartlist,
|
smartlist_t *excludedsmartlist,
|
||||||
int need_uptime, int need_bandwidth,
|
int need_uptime, int need_capacity,
|
||||||
int need_guard,
|
int need_guard,
|
||||||
int allow_invalid, int strict,
|
int allow_invalid, int strict,
|
||||||
int weight_for_exit);
|
int weight_for_exit);
|
||||||
routerinfo_t *router_get_by_nickname(const char *nickname,
|
routerinfo_t *router_get_by_nickname(const char *nickname,
|
||||||
int warn_if_unnamed);
|
int warn_if_unnamed);
|
||||||
|
int router_digest_version_as_new_as(const char *digest, const char *cutoff);
|
||||||
|
int router_digest_is_trusted_dir_type(const char *digest,
|
||||||
|
authority_type_t type);
|
||||||
|
#define router_digest_is_trusted_dir(d) \
|
||||||
|
router_digest_is_trusted_dir_type((d), 0)
|
||||||
|
|
||||||
|
int router_addr_is_trusted_dir(uint32_t addr);
|
||||||
int hexdigest_to_digest(const char *hexdigest, char *digest);
|
int hexdigest_to_digest(const char *hexdigest, char *digest);
|
||||||
routerinfo_t *router_get_by_hexdigest(const char *hexdigest);
|
routerinfo_t *router_get_by_hexdigest(const char *hexdigest);
|
||||||
routerinfo_t *router_get_by_digest(const char *digest);
|
routerinfo_t *router_get_by_digest(const char *digest);
|
||||||
@ -3543,26 +3582,20 @@ signed_descriptor_t *router_get_by_descriptor_digest(const char *digest);
|
|||||||
signed_descriptor_t *router_get_by_extrainfo_digest(const char *digest);
|
signed_descriptor_t *router_get_by_extrainfo_digest(const char *digest);
|
||||||
signed_descriptor_t *extrainfo_get_by_descriptor_digest(const char *digest);
|
signed_descriptor_t *extrainfo_get_by_descriptor_digest(const char *digest);
|
||||||
const char *signed_descriptor_get_body(signed_descriptor_t *desc);
|
const char *signed_descriptor_get_body(signed_descriptor_t *desc);
|
||||||
int router_digest_version_as_new_as(const char *digest, const char *cutoff);
|
|
||||||
int router_digest_is_trusted_dir_type(const char *digest,
|
|
||||||
authority_type_t type);
|
|
||||||
#define router_digest_is_trusted_dir(d) \
|
|
||||||
router_digest_is_trusted_dir_type((d), 0)
|
|
||||||
int router_addr_is_trusted_dir(uint32_t addr);
|
|
||||||
routerlist_t *router_get_routerlist(void);
|
routerlist_t *router_get_routerlist(void);
|
||||||
void routerlist_reset_warnings(void);
|
|
||||||
void routerlist_free(routerlist_t *routerlist);
|
|
||||||
void dump_routerlist_mem_usage(int severity);
|
|
||||||
void routerlist_remove(routerlist_t *rl, routerinfo_t *ri, int make_old);
|
|
||||||
void routerinfo_free(routerinfo_t *router);
|
void routerinfo_free(routerinfo_t *router);
|
||||||
void extrainfo_free(extrainfo_t *extrainfo);
|
void extrainfo_free(extrainfo_t *extrainfo);
|
||||||
|
void routerlist_free(routerlist_t *rl);
|
||||||
|
void dump_routerlist_mem_usage(int severity);
|
||||||
|
void routerlist_remove(routerlist_t *rl, routerinfo_t *ri, int make_old);
|
||||||
void routerlist_free_all(void);
|
void routerlist_free_all(void);
|
||||||
|
void routerlist_reset_warnings(void);
|
||||||
void router_set_status(const char *digest, int up);
|
void router_set_status(const char *digest, int up);
|
||||||
void routerlist_remove_old_routers(void);
|
|
||||||
int router_add_to_routerlist(routerinfo_t *router, const char **msg,
|
int router_add_to_routerlist(routerinfo_t *router, const char **msg,
|
||||||
int from_cache, int from_fetch);
|
int from_cache, int from_fetch);
|
||||||
void router_add_extrainfo_to_routerlist(extrainfo_t *ei, const char **msg,
|
void router_add_extrainfo_to_routerlist(extrainfo_t *ei, const char **msg,
|
||||||
int from_cache, int from_fetch);
|
int from_cache, int from_fetch);
|
||||||
|
void routerlist_remove_old_routers(void);
|
||||||
int router_load_single_router(const char *s, uint8_t purpose,
|
int router_load_single_router(const char *s, uint8_t purpose,
|
||||||
const char **msg);
|
const char **msg);
|
||||||
void router_load_routers_from_string(const char *s, const char *eos,
|
void router_load_routers_from_string(const char *s, const char *eos,
|
||||||
@ -3572,55 +3605,31 @@ void router_load_routers_from_string(const char *s, const char *eos,
|
|||||||
const char *prepend_annotations);
|
const char *prepend_annotations);
|
||||||
void router_load_extrainfo_from_string(const char *s, const char *eos,
|
void router_load_extrainfo_from_string(const char *s, const char *eos,
|
||||||
saved_location_t saved_location,
|
saved_location_t saved_location,
|
||||||
smartlist_t *requested_fps,
|
smartlist_t *requested_fingerprints,
|
||||||
int descriptor_digests);
|
int descriptor_digests);
|
||||||
|
void routerlist_retry_directory_downloads(time_t now);
|
||||||
int router_exit_policy_all_routers_reject(uint32_t addr, uint16_t port,
|
int router_exit_policy_all_routers_reject(uint32_t addr, uint16_t port,
|
||||||
int need_uptime);
|
int need_uptime);
|
||||||
int router_exit_policy_rejects_all(routerinfo_t *router);
|
int router_exit_policy_rejects_all(routerinfo_t *router);
|
||||||
|
|
||||||
void add_trusted_dir_server(const char *nickname, const char *address,
|
void add_trusted_dir_server(const char *nickname, const char *address,
|
||||||
uint16_t dir_port, uint16_t or_port,
|
uint16_t dir_port, uint16_t or_port,
|
||||||
const char *digest,
|
const char *digest, const char *v3_auth_digest,
|
||||||
const char *v3_auth_digest,
|
authority_type_t type);
|
||||||
authority_type_t type);
|
|
||||||
void clear_trusted_dir_servers(void);
|
void clear_trusted_dir_servers(void);
|
||||||
int any_trusted_dir_is_v1_authority(void);
|
int any_trusted_dir_is_v1_authority(void);
|
||||||
networkstatus_t *networkstatus_get_by_digest(const char *digest);
|
char *compute_recommended_versions(time_t now, int client,
|
||||||
routerstatus_t *router_get_combined_status_by_digest(const char *digest);
|
const char *my_version,
|
||||||
routerstatus_t *router_get_combined_status_by_descriptor_digest(
|
combined_version_status_t *status_out);
|
||||||
const char *digest);
|
|
||||||
|
|
||||||
//routerstatus_t *routerstatus_get_by_hexdigest(const char *hexdigest);
|
|
||||||
int should_delay_dir_fetches(or_options_t *options);
|
|
||||||
void update_networkstatus_downloads(time_t now);
|
|
||||||
void routerlist_retry_directory_downloads(time_t now);
|
|
||||||
void update_router_descriptor_downloads(time_t now);
|
void update_router_descriptor_downloads(time_t now);
|
||||||
void update_extrainfo_downloads(time_t now);
|
void update_extrainfo_downloads(time_t now);
|
||||||
void routers_update_all_from_networkstatus(time_t now);
|
|
||||||
void routers_update_status_from_networkstatus(smartlist_t *routers,
|
|
||||||
int reset_failures);
|
|
||||||
smartlist_t *router_list_superseded(void);
|
|
||||||
int router_have_minimum_dir_info(void);
|
int router_have_minimum_dir_info(void);
|
||||||
void router_dir_info_changed(void);
|
void router_dir_info_changed(void);
|
||||||
void networkstatus_list_update_recent(time_t now);
|
|
||||||
void router_reset_descriptor_download_failures(void);
|
void router_reset_descriptor_download_failures(void);
|
||||||
void router_reset_status_download_failures(void);
|
|
||||||
int router_differences_are_cosmetic(routerinfo_t *r1, routerinfo_t *r2);
|
int router_differences_are_cosmetic(routerinfo_t *r1, routerinfo_t *r2);
|
||||||
int routerinfo_incompatible_with_extrainfo(routerinfo_t *ri, extrainfo_t *ei,
|
int routerinfo_incompatible_with_extrainfo(routerinfo_t *ri, extrainfo_t *ei,
|
||||||
const char **msg);
|
const char **msg);
|
||||||
const char *esc_router_info(routerinfo_t *router);
|
|
||||||
|
|
||||||
char *networkstatus_getinfo_helper_single(routerstatus_t *rs);
|
|
||||||
int getinfo_helper_networkstatus(control_connection_t *conn,
|
|
||||||
const char *question, char **answer);
|
|
||||||
|
|
||||||
void routerlist_assert_ok(routerlist_t *rl);
|
void routerlist_assert_ok(routerlist_t *rl);
|
||||||
void routerlist_check_bug_417(void);
|
const char *esc_router_info(routerinfo_t *router);
|
||||||
|
|
||||||
int trusted_dirs_reload_certs(void);
|
|
||||||
int trusted_dirs_load_certs_from_string(const char *contents, int from_store);
|
|
||||||
void trusted_dirs_flush_certs_to_disk(void);
|
|
||||||
|
|
||||||
/********************************* routerparse.c ************************/
|
/********************************* routerparse.c ************************/
|
||||||
|
|
||||||
@ -3642,28 +3651,6 @@ typedef struct tor_version_t {
|
|||||||
int svn_revision;
|
int svn_revision;
|
||||||
} tor_version_t;
|
} tor_version_t;
|
||||||
|
|
||||||
typedef enum version_status_t {
|
|
||||||
VS_RECOMMENDED=0, /**< This version is listed as recommended. */
|
|
||||||
VS_OLD=1, /**< This version is older than any recommended version. */
|
|
||||||
VS_NEW=2, /**< This version is newer than any recommended version. */
|
|
||||||
VS_NEW_IN_SERIES=3, /**< This version is newer than any recommended version
|
|
||||||
* in its series, but later recommended versions exist.
|
|
||||||
*/
|
|
||||||
VS_UNRECOMMENDED=4 /**< This version is not recommended (general case). */
|
|
||||||
} version_status_t;
|
|
||||||
|
|
||||||
typedef struct combined_version_status_t {
|
|
||||||
/** How many networkstatuses claim to know about versions? */
|
|
||||||
int n_versioning;
|
|
||||||
/** What do the majority of networkstatuses believe about this version? */
|
|
||||||
version_status_t consensus;
|
|
||||||
/** How many networkstatuses constitute the majority? */
|
|
||||||
int n_concurring;
|
|
||||||
} combined_version_status_t;
|
|
||||||
char *compute_recommended_versions(time_t now, int client,
|
|
||||||
const char *my_version,
|
|
||||||
combined_version_status_t *status_out);
|
|
||||||
|
|
||||||
int router_get_router_hash(const char *s, char *digest);
|
int router_get_router_hash(const char *s, char *digest);
|
||||||
int router_get_dir_hash(const char *s, char *digest);
|
int router_get_dir_hash(const char *s, char *digest);
|
||||||
int router_get_runningrouters_hash(const char *s, char *digest);
|
int router_get_runningrouters_hash(const char *s, char *digest);
|
||||||
|
Loading…
Reference in New Issue
Block a user