Refactor router_dump_exit_policy_to_string

Split out policy_dump_to_string to use it in getinfo_helper_policies.
This commit is contained in:
teor (Tim Wilson-Brown) 2015-11-16 23:02:49 +11:00
parent 10dd592d74
commit 6913bdfcc5
3 changed files with 53 additions and 34 deletions

View File

@ -2027,6 +2027,53 @@ compare_tor_addr_to_node_policy(const tor_addr_t *addr, uint16_t port,
} }
} }
/**
* Given <b>policy_list</b>, a list of addr_policy_t, produce a string
* representation of the list.
* If <b>include_ipv4</b> is true, include IPv4 entries.
* If <b>include_ipv6</b> is true, include IPv6 entries.
*/
char *
policy_dump_to_string(const smartlist_t *policy_list,
int include_ipv4,
int include_ipv6)
{
smartlist_t *policy_string_list;
char *policy_string = NULL;
policy_string_list = smartlist_new();
SMARTLIST_FOREACH_BEGIN(policy_list, addr_policy_t *, tmpe) {
char *pbuf;
int bytes_written_to_pbuf;
if ((tor_addr_family(&tmpe->addr) == AF_INET6) && (!include_ipv6)) {
continue; /* Don't include IPv6 parts of address policy */
}
if ((tor_addr_family(&tmpe->addr) == AF_INET) && (!include_ipv4)) {
continue; /* Don't include IPv4 parts of address policy */
}
pbuf = tor_malloc(POLICY_BUF_LEN);
bytes_written_to_pbuf = policy_write_item(pbuf,POLICY_BUF_LEN, tmpe, 1);
if (bytes_written_to_pbuf < 0) {
log_warn(LD_BUG, "policy_dump_to_string ran out of room!");
tor_free(pbuf);
goto done;
}
smartlist_add(policy_string_list,pbuf);
} SMARTLIST_FOREACH_END(tmpe);
policy_string = smartlist_join_strings(policy_string_list, "\n", 0, NULL);
done:
SMARTLIST_FOREACH(policy_string_list, char *, str, tor_free(str));
smartlist_free(policy_string_list);
return policy_string;
}
/** Implementation for GETINFO control command: knows the answer for questions /** Implementation for GETINFO control command: knows the answer for questions
* about "exit-policy/..." */ * about "exit-policy/..." */
int int

View File

@ -76,6 +76,9 @@ void addr_policy_append_reject_addr_list(smartlist_t **dest,
void policies_set_node_exitpolicy_to_reject_all(node_t *exitrouter); void policies_set_node_exitpolicy_to_reject_all(node_t *exitrouter);
int exit_policy_is_general_exit(smartlist_t *policy); int exit_policy_is_general_exit(smartlist_t *policy);
int policy_is_reject_star(const smartlist_t *policy, sa_family_t family); int policy_is_reject_star(const smartlist_t *policy, sa_family_t family);
char * policy_dump_to_string(const smartlist_t *policy_list,
int include_ipv4,
int include_ipv6);
int getinfo_helper_policies(control_connection_t *conn, int getinfo_helper_policies(control_connection_t *conn,
const char *question, char **answer, const char *question, char **answer,
const char **errmsg); const char **errmsg);

View File

@ -2728,44 +2728,13 @@ router_dump_exit_policy_to_string(const routerinfo_t *router,
int include_ipv4, int include_ipv4,
int include_ipv6) int include_ipv6)
{ {
smartlist_t *exit_policy_strings;
char *policy_string = NULL;
if ((!router->exit_policy) || (router->policy_is_reject_star)) { if ((!router->exit_policy) || (router->policy_is_reject_star)) {
return tor_strdup("reject *:*"); return tor_strdup("reject *:*");
} }
exit_policy_strings = smartlist_new(); return policy_dump_to_string(router->exit_policy,
include_ipv4,
SMARTLIST_FOREACH_BEGIN(router->exit_policy, addr_policy_t *, tmpe) { include_ipv6);
char *pbuf;
int bytes_written_to_pbuf;
if ((tor_addr_family(&tmpe->addr) == AF_INET6) && (!include_ipv6)) {
continue; /* Don't include IPv6 parts of address policy */
}
if ((tor_addr_family(&tmpe->addr) == AF_INET) && (!include_ipv4)) {
continue; /* Don't include IPv4 parts of address policy */
}
pbuf = tor_malloc(POLICY_BUF_LEN);
bytes_written_to_pbuf = policy_write_item(pbuf,POLICY_BUF_LEN, tmpe, 1);
if (bytes_written_to_pbuf < 0) {
log_warn(LD_BUG, "router_dump_exit_policy_to_string ran out of room!");
tor_free(pbuf);
goto done;
}
smartlist_add(exit_policy_strings,pbuf);
} SMARTLIST_FOREACH_END(tmpe);
policy_string = smartlist_join_strings(exit_policy_strings, "\n", 0, NULL);
done:
SMARTLIST_FOREACH(exit_policy_strings, char *, str, tor_free(str));
smartlist_free(exit_policy_strings);
return policy_string;
} }
/** Copy the primary (IPv4) OR port (IP address and TCP port) for /** Copy the primary (IPv4) OR port (IP address and TCP port) for