mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-30 23:53:32 +01:00
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:
parent
10dd592d74
commit
6913bdfcc5
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user