tor  0.4.1.0-alpha-dev
Macros | Functions | Variables
address.c File Reference
#include "orconfig.h"
#include "lib/net/address.h"
#include "lib/net/socket.h"
#include "lib/cc/ctassert.h"
#include "lib/container/smartlist.h"
#include "lib/ctime/di_ops.h"
#include "lib/log/log.h"
#include "lib/log/escape.h"
#include "lib/malloc/malloc.h"
#include "lib/net/inaddr.h"
#include "lib/string/compat_ctype.h"
#include "lib/string/compat_string.h"
#include "lib/string/parse_int.h"
#include "lib/string/printf.h"
#include "lib/string/util_string.h"
#include "ext/siphash.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

Go to the source code of this file.

Macros

#define ADDRESS_PRIVATE
 
#define MAX_ADDRESS_LENGTH   (TOR_ADDR_BUF_LEN+2+(1+INET_NTOA_BUF_LEN)+12+1)
 
#define TRISTATE(a, b)   (((a)<(b))?-1: (((a)==(b))?0:1))
 

Functions

 CTASSERT (AF_UNSPEC==0)
 
socklen_t tor_addr_to_sockaddr (const tor_addr_t *a, uint16_t port, struct sockaddr *sa_out, socklen_t len)
 
static void tor_addr_make_af_unix (tor_addr_t *a)
 
int tor_addr_from_sockaddr (tor_addr_t *a, const struct sockaddr *sa, uint16_t *port_out)
 
char * tor_sockaddr_to_str (const struct sockaddr *sa)
 
void tor_addr_make_unspec (tor_addr_t *a)
 
void tor_addr_make_null (tor_addr_t *a, sa_family_t family)
 
int tor_addr_is_internal_ (const tor_addr_t *addr, int for_listening, const char *filename, int lineno)
 
const char * tor_addr_to_str (char *dest, const tor_addr_t *addr, size_t len, int decorate)
 
int tor_addr_parse_PTR_name (tor_addr_t *result, const char *address, int family, int accept_regular)
 
int tor_addr_to_PTR_name (char *out, size_t outlen, const tor_addr_t *addr)
 
int tor_addr_parse_mask_ports (const char *s, unsigned flags, tor_addr_t *addr_out, maskbits_t *maskbits_out, uint16_t *port_min_out, uint16_t *port_max_out)
 
int tor_addr_is_v4 (const tor_addr_t *addr)
 
int tor_addr_is_null (const tor_addr_t *addr)
 
int tor_addr_is_loopback (const tor_addr_t *addr)
 
int tor_addr_is_valid (const tor_addr_t *addr, int for_listening)
 
int tor_addr_is_valid_ipv4n (uint32_t v4n_addr, int for_listening)
 
int tor_port_is_valid (uint16_t port, int for_listening)
 
void tor_addr_from_ipv4n (tor_addr_t *dest, uint32_t v4addr)
 
void tor_addr_from_ipv6_bytes (tor_addr_t *dest, const char *ipv6_bytes)
 
void tor_addr_from_in6 (tor_addr_t *dest, const struct in6_addr *in6)
 
void tor_addr_copy (tor_addr_t *dest, const tor_addr_t *src)
 
void tor_addr_copy_tight (tor_addr_t *dest, const tor_addr_t *src)
 
int tor_addr_compare (const tor_addr_t *addr1, const tor_addr_t *addr2, tor_addr_comparison_t how)
 
int tor_addr_compare_masked (const tor_addr_t *addr1, const tor_addr_t *addr2, maskbits_t mbits, tor_addr_comparison_t how)
 
uint64_t tor_addr_hash (const tor_addr_t *addr)
 
uint64_t tor_addr_keyed_hash (const struct sipkey *key, const tor_addr_t *addr)
 
char * tor_addr_to_str_dup (const tor_addr_t *addr)
 
const char * fmt_addr_impl (const tor_addr_t *addr, int decorate)
 
const char * fmt_addrport (const tor_addr_t *addr, uint16_t port)
 
const char * fmt_addr32 (uint32_t addr)
 
int tor_addr_parse (tor_addr_t *addr, const char *src)
 
 MOCK_IMPL (smartlist_t *, get_interface_addresses_raw,(int severity, sa_family_t family))
 
int tor_addr_is_multicast (const tor_addr_t *a)
 
 MOCK_IMPL (int, get_interface_address6_via_udp_socket_hack,(int severity, sa_family_t family, tor_addr_t *addr))
 
 MOCK_IMPL (int, get_interface_address6,(int severity, sa_family_t family, tor_addr_t *addr))
 
void interface_address6_list_free_ (smartlist_t *addrs)
 
 MOCK_IMPL (smartlist_t *, get_interface_address6_list,(int severity, sa_family_t family, int include_internal))
 
int tor_addr_port_parse (int severity, const char *addrport, tor_addr_t *address_out, uint16_t *port_out, int default_port)
 
int tor_addr_port_split (int severity, const char *addrport, char **address_out, uint16_t *port_out)
 
int addr_mask_get_bits (uint32_t mask)
 
int parse_port_range (const char *port, uint16_t *port_min_out, uint16_t *port_max_out)
 
char * tor_dup_ip (uint32_t addr)
 
 MOCK_IMPL (int, get_interface_address,(int severity, uint32_t *addr))
 
int tor_addr_hostname_is_local (const char *name)
 
tor_addr_port_ttor_addr_port_new (const tor_addr_t *addr, uint16_t port)
 
int tor_addr_port_eq (const tor_addr_port_t *a, const tor_addr_port_t *b)
 
int string_is_valid_ipv4_address (const char *string)
 
int string_is_valid_ipv6_address (const char *string)
 
int string_is_valid_dest (const char *string)
 
int string_is_valid_nonrfc_hostname (const char *string)
 

Variables

static const uint32_t unspec_hash_input [] = { 0x4e4df09f, 0x92985342 }
 

Detailed Description

Functions to use and manipulate the tor_addr_t structure.

This module doesn't have any support for the libc resolver: that is all in resolve.c.

Definition in file address.c.

Function Documentation

◆ addr_mask_get_bits()

int addr_mask_get_bits ( uint32_t  mask)

If mask is an address mask for a bit-prefix, return the number of bits. Otherwise, return -1.

Definition at line 1819 of file address.c.

◆ fmt_addr32()

const char* fmt_addr32 ( uint32_t  addr)

Like fmt_addr(), but takes addr as a host-order IPv4 addresses. Also not thread-safe, also clobbers its return buffer on repeated calls.

Definition at line 1180 of file address.c.

References INET_NTOA_BUF_LEN, and tor_inet_ntoa().

◆ fmt_addr_impl()

const char* fmt_addr_impl ( const tor_addr_t addr,
int  decorate 
)

Return a string representing the address addr. This string is statically allocated, and must not be freed. Each call to fmt_addr_impl invalidates the last result of the function. This function is not thread-safe. If decorate is set, add brackets to IPv6 addresses.

It's better to use the wrapper macros of this function: fmt_addr() and fmt_and_decorate_addr().

Definition at line 1153 of file address.c.

References TOR_ADDR_BUF_LEN, and tor_addr_to_str().

◆ fmt_addrport()

const char* fmt_addrport ( const tor_addr_t addr,
uint16_t  port 
)

Return a string representing the pair addr and port. This calls fmt_and_decorate_addr internally, so IPv6 addresses will have brackets, and the caveats of fmt_addr_impl apply.

Definition at line 1168 of file address.c.

References fmt_and_decorate_addr, TOR_ADDR_BUF_LEN, and tor_snprintf().

Referenced by bridge_resolve_conflicts(), and pt_get_extra_info_descriptor_string().

◆ interface_address6_list_free_()

void interface_address6_list_free_ ( smartlist_t addrs)

Free a smartlist of IP addresses returned by get_interface_address6_list.

Definition at line 1628 of file address.c.

References SMARTLIST_FOREACH, and tor_free.

◆ MOCK_IMPL() [1/5]

MOCK_IMPL ( smartlist_t ,
get_interface_addresses_raw  ,
(int severity, sa_family_t family)   
)

Try to ask our network interfaces what addresses they are bound to. Return a new smartlist of tor_addr_t on success, and NULL on failure. (An empty smartlist indicates that we successfully learned that we have no addresses.) Log failure messages at severity. Only return the interface addresses of requested family and ignore the addresses of other address families.

Definition at line 1476 of file address.c.

◆ MOCK_IMPL() [2/5]

MOCK_IMPL ( int  ,
get_interface_address6_via_udp_socket_hack  ,
(int severity, sa_family_t family, tor_addr_t *addr)   
)

Attempt to retrieve IP address of current host by utilizing some UDP socket trickery. Only look for address of given family (only AF_INET and AF_INET6 are supported). Set result to *addr. Return 0 on success, -1 on failure.

Definition at line 1519 of file address.c.

◆ MOCK_IMPL() [3/5]

MOCK_IMPL ( int  ,
get_interface_address6  ,
(int severity, sa_family_t family, tor_addr_t *addr)   
)

Set *addr to an arbitrary IP address (if any) of an interface that connects to the Internet. Prefer public IP addresses to internal IP addresses. This address should only be used in checking whether our address has changed, as it may be an internal IP address. Return 0 on success, -1 on failure. Prefer get_interface_address6_list for a list of all addresses on all interfaces which connect to the Internet.

Definition at line 1597 of file address.c.

References SMARTLIST_FOREACH_BEGIN, tor_addr_copy(), and tor_assert().

◆ MOCK_IMPL() [4/5]

MOCK_IMPL ( smartlist_t ,
get_interface_address6_list  ,
(int severity, sa_family_t family, int include_internal)   
)

Return a smartlist of the IP addresses of type family from all interfaces on the server. Excludes loopback and multicast addresses. Only includes internal addresses if include_internal is true. (Note that a relay behind NAT may use an internal address to connect to the Internet.) An empty smartlist means that there are no addresses of the selected type matching these criteria. Returns NULL on failure. Use interface_address6_list_free to free the returned list.

Definition at line 1645 of file address.c.

References SMARTLIST_DEL_CURRENT_KEEPORDER, SMARTLIST_FOREACH_BEGIN, tor_addr_is_loopback(), tor_addr_is_multicast(), and tor_free.

◆ MOCK_IMPL() [5/5]

MOCK_IMPL ( int  ,
get_interface_address  ,
(int severity, uint32_t *addr)   
)

Set *addr to a host-order IPv4 address (if any) of an interface that connects to the Internet. Prefer public IP addresses to internal IP addresses. This address should only be used in checking whether our address has changed, as it may be an internal IPv4 address. Return 0 on success, -1 on failure. Prefer get_interface_address_list6 for a list of all IPv4 and IPv6 addresses on all interfaces which connect to the Internet.

Definition at line 1909 of file address.c.

References tor_addr_to_ipv4h().

◆ parse_port_range()

int parse_port_range ( const char *  port,
uint16_t *  port_min_out,
uint16_t *  port_max_out 
)

Parse a string s in the format of (*|port(-maxport)?)?, setting the various *out pointers as appropriate. Return 0 on success, -1 on failure.

Definition at line 1838 of file address.c.

References tor_assert(), and tor_parse_long().

Referenced by router_parse_addr_policy_private().

◆ string_is_valid_dest()

int string_is_valid_dest ( const char *  string)

Return true iff string is a valid destination address, i.e. either a DNS hostname or IPv4/IPv6 address string.

Definition at line 1980 of file address.c.

◆ string_is_valid_ipv4_address()

int string_is_valid_ipv4_address ( const char *  string)

Return true if string represents a valid IPv4 adddress in 'a.b.c.d' form.

Definition at line 1958 of file address.c.

References tor_inet_pton().

Referenced by string_is_valid_nonrfc_hostname().

◆ string_is_valid_ipv6_address()

int string_is_valid_ipv6_address ( const char *  string)

Return true if string represents a valid IPv6 address in a form that inet_pton() can parse.

Definition at line 1969 of file address.c.

References tor_inet_pton().

◆ string_is_valid_nonrfc_hostname()

int string_is_valid_nonrfc_hostname ( const char *  string)

Return true iff string matches a pattern of DNS names that we allow Tor clients to connect to.

Note: This allows certain technically invalid characters ('_') to cope with misconfigured zones that have been encountered in the wild.

Definition at line 2013 of file address.c.

References smartlist_split_string(), and string_is_valid_ipv4_address().

◆ tor_addr_compare()

int tor_addr_compare ( const tor_addr_t addr1,
const tor_addr_t addr2,
tor_addr_comparison_t  how 
)

Given two addresses addr1 and addr2, return 0 if the two addresses are equivalent under the mask mbits, less than 0 if addr1 precedes addr2, and greater than 0 otherwise.

Different address families (IPv4 vs IPv6) are always considered unequal if how is CMP_EXACT; otherwise, IPv6-mapped IPv4 addresses are considered equivalent to their IPv4 equivalents.

As a special case, all pointer-wise distinct AF_UNIX addresses are always considered unequal since tor_addr_t currently does not contain the information required to make the comparison.

Definition at line 953 of file address.c.

References tor_addr_compare_masked().

Referenced by compare_orports_(), geoip_add_entry(), get_configured_bridge_by_addr_port_digest(), get_configured_bridge_by_exact_addr_port_digest(), get_configured_bridge_by_orports_digest(), and rewrite_node_address_for_bridge().

◆ tor_addr_compare_masked()

int tor_addr_compare_masked ( const tor_addr_t addr1,
const tor_addr_t addr2,
maskbits_t  mbits,
tor_addr_comparison_t  how 
)

As tor_addr_compare(), but only looks at the first mask bits of the address.

Reduce over-specific masks (>128 for ipv6, >32 for ipv4) to 128 or 32.

The mask is interpreted relative to addr1, so that if a is ::ffff:1.2.3.4, and b is 3.4.5.6, tor_addr_compare_masked(a,b,100,CMP_SEMANTIC) is the same as -tor_addr_compare_masked(b,a,4,CMP_SEMANTIC).

We guarantee that the ordering from tor_addr_compare_masked is a total order on addresses, but not that it is any particular order, or that it will be the same from one version to the next.

Helper: Evaluates to -1 if a is less than b, 0 if a equals b, or 1 if a is greater than b. May evaluate a and b more than once.

Definition at line 974 of file address.c.

References tor_addr_family(), tor_addr_to_ipv4h(), and tor_assert().

Referenced by addr_policy_covers(), addr_policy_intersects(), addrs_in_same_network_family(), get_random_virtual_addr(), and tor_addr_compare().

◆ tor_addr_copy()

void tor_addr_copy ( tor_addr_t dest,
const tor_addr_t src 
)

◆ tor_addr_copy_tight()

void tor_addr_copy_tight ( tor_addr_t dest,
const tor_addr_t src 
)

Copy a tor_addr_t from src to dest, taking extra care to copy only the well-defined portions. Used for computing hashes of addresses.

Definition at line 917 of file address.c.

References tor_addr_family(), tor_assert(), and tor_fragile_assert.

Referenced by policy_hash().

◆ tor_addr_from_in6()

void tor_addr_from_in6 ( tor_addr_t dest,
const struct in6_addr in6 
)

Set dest equal to the IPv6 address in the in6_addr in6.

Definition at line 895 of file address.c.

References tor_addr_from_ipv6_bytes().

Referenced by tor_addr_from_sockaddr(), and tor_addr_parse_PTR_name().

◆ tor_addr_from_ipv4n()

void tor_addr_from_ipv4n ( tor_addr_t dest,
uint32_t  v4addr 
)

Set dest to equal the IPv4 address in v4addr (given in network order).

Definition at line 873 of file address.c.

References tor_assert().

Referenced by get_random_virtual_addr(), and tor_addr_from_sockaddr().

◆ tor_addr_from_ipv6_bytes()

void tor_addr_from_ipv6_bytes ( tor_addr_t dest,
const char *  ipv6_bytes 
)

Set dest to equal the IPv6 address in the 16 bytes at ipv6_bytes.

Definition at line 884 of file address.c.

References tor_assert().

Referenced by get_random_virtual_addr(), and tor_addr_from_in6().

◆ tor_addr_from_sockaddr()

int tor_addr_from_sockaddr ( tor_addr_t a,
const struct sockaddr *  sa,
uint16_t *  port_out 
)

Set the tor_addr_t in a to contain the socket address contained in sa. IF port_out is non-NULL and sa contains a port, set *port_out to that port. Return 0 on success and -1 on failure.

Definition at line 165 of file address.c.

References tor_addr_from_in6(), tor_addr_from_ipv4n(), tor_addr_make_af_unix(), tor_addr_make_unspec(), and tor_assert().

Referenced by tor_addr_from_getsockname().

◆ tor_addr_hash()

uint64_t tor_addr_hash ( const tor_addr_t addr)

Return a hash code based on the address addr. DOCDOC extra

Definition at line 1092 of file address.c.

References tor_addr_family(), tor_fragile_assert, and unspec_hash_input.

◆ tor_addr_hostname_is_local()

int tor_addr_hostname_is_local ( const char *  name)

Return true if we can tell that name is a canonical name for the loopback address. Return true also for *.local hostnames, which are multicast DNS names for hosts on the local network.

Definition at line 1927 of file address.c.

◆ tor_addr_is_internal_()

int tor_addr_is_internal_ ( const tor_addr_t addr,
int  for_listening,
const char *  filename,
int  lineno 
)

Return true iff ip is an IP reserved to localhost or local networks.

If ip is in RFC1918 or RFC4193 or RFC4291, we will return true. (fec0::/10, deprecated by RFC3879, is also treated as internal for now and will return true.)

If ip is 0.0.0.0 or 100.64.0.0/10 (RFC6598), we will act as:

  • Internal if for_listening is 0, as these addresses are not routable on the internet and we won't be publicly accessible to clients.
  • External if for_listening is 1, as clients could connect to us from the internet (in the case of 0.0.0.0) or a service provider's internal network (in the case of RFC6598).

Definition at line 255 of file address.c.

References tor_addr_family(), tor_addr_is_v4(), tor_addr_to_in6_addr32, tor_addr_to_ipv4h(), and tor_assert().

◆ tor_addr_is_loopback()

int tor_addr_is_loopback ( const tor_addr_t addr)

Return true iff addr is a loopback address

Definition at line 794 of file address.c.

References tor_addr_family(), tor_addr_to_in6_addr32, tor_addr_to_ipv4h(), tor_assert(), and tor_fragile_assert.

Referenced by MOCK_IMPL(), and warn_nonlocal_controller_ports().

◆ tor_addr_is_multicast()

int tor_addr_is_multicast ( const tor_addr_t a)

Return true iff a is a multicast address.

Definition at line 1499 of file address.c.

References tor_addr_family(), tor_addr_to_in6_addr8, and tor_addr_to_ipv4h().

Referenced by MOCK_IMPL().

◆ tor_addr_is_null()

int tor_addr_is_null ( const tor_addr_t addr)

◆ tor_addr_is_v4()

int tor_addr_is_v4 ( const tor_addr_t addr)

Determine whether an address is IPv4, either native or IPv4-mapped IPv6. Note that this is about representation only, as any decent stack will reject IPv4-mapped addresses received on the wire (and won't use them on the wire either).

Definition at line 748 of file address.c.

References tor_addr_family(), tor_addr_to_in6_addr32, and tor_assert().

Referenced by get_first_listener_addrport_string(), and tor_addr_is_internal_().

◆ tor_addr_keyed_hash()

uint64_t tor_addr_keyed_hash ( const struct sipkey *  key,
const tor_addr_t addr 
)

As tor_addr_hash, but use a particular siphash key.

Definition at line 1111 of file address.c.

References tor_addr_family(), tor_fragile_assert, and unspec_hash_input.

◆ tor_addr_make_af_unix()

static void tor_addr_make_af_unix ( tor_addr_t a)
static

Set address a to zero. This address belongs to the AF_UNIX family.

Definition at line 154 of file address.c.

Referenced by tor_addr_from_sockaddr().

◆ tor_addr_make_null()

void tor_addr_make_null ( tor_addr_t a,
sa_family_t  family 
)

Set address a to the null address in address family family. The null address for AF_INET is 0.0.0.0. The null address for AF_INET6 is [::]. AF_UNSPEC is all null.

Definition at line 235 of file address.c.

Referenced by connection_ap_get_begincell_flags(), fascist_firewall_choose_address_base(), fascist_firewall_choose_address_dir_server(), fascist_firewall_choose_address_ipv4h(), fascist_firewall_choose_address_node(), and fascist_firewall_choose_address_rs().

◆ tor_addr_make_unspec()

void tor_addr_make_unspec ( tor_addr_t a)

Set address a to the unspecified address. This address belongs to no family.

Definition at line 225 of file address.c.

Referenced by connected_cell_parse(), parse_port_config(), and tor_addr_from_sockaddr().

◆ tor_addr_parse()

int tor_addr_parse ( tor_addr_t addr,
const char *  src 
)

Convert the string in src to a tor_addr_t addr. The string may be an IPv4 address, an IPv6 address, or an IPv6 address surrounded by square brackets.

Return an address family on success, or -1 if an invalid address string is provided.

Definition at line 1196 of file address.c.

References tor_assert().

Referenced by address_is_in_virtual_range(), address_is_invalid_destination(), addressmap_rewrite_reverse(), adjust_exit_policy_from_exitpolicy_failure(), circuit_is_acceptable(), client_dns_set_addressmap(), client_dns_set_reverse_addressmap(), parse_port_config(), router_new_address_suggestion(), tor_addr_parse_PTR_name(), tor_addr_port_parse(), and tor_addr_port_split().

◆ tor_addr_parse_mask_ports()

int tor_addr_parse_mask_ports ( const char *  s,
unsigned  flags,
tor_addr_t addr_out,
maskbits_t maskbits_out,
uint16_t *  port_min_out,
uint16_t *  port_max_out 
)

Parse a string s containing an IPv4/IPv6 address, and possibly a mask and port or port range. Store the parsed address in addr_out, a mask (if any) in mask_out, and port(s) (if any) in port_min_out and port_max_out.

The syntax is: Address OptMask OptPortRange Address ::= IPv4Address / "[" IPv6Address "]" / "*" OptMask ::= "/" Integer / OptPortRange ::= ":*" / ":" Integer / ":" Integer "-" Integer /

  • If mask, minport, or maxport are NULL, we do not want these options to be set; treat them as an error if present.
  • If the string has no mask, the mask is set to /32 (IPv4) or /128 (IPv6).
  • If the string has one port, it is placed in both min and max port variables.
  • If the string has no port(s), port_(min|max)_out are set to 1 and 65535.

Return an address family on success, or -1 if an invalid address string is provided.

If 'flags & TAPMP_EXTENDED_STAR' is false, then the wildcard address '*' yield an IPv4 wildcard.

If 'flags & TAPMP_EXTENDED_STAR' is true, then the wildcard address '*' yields an AF_UNSPEC wildcard address, which expands to corresponding wildcard IPv4 and IPv6 rules, and the following change is made in the grammar above: Address ::= IPv4Address / "[" IPv6Address "]" / "*" / "*4" / "*6" with the new "*4" and "*6" productions creating a wildcard to match IPv4 or IPv6 addresses.

If 'flags & TAPMP_EXTENDED_STAR' and 'flags & TAPMP_STAR_IPV4_ONLY' are both true, then the wildcard address '*' yields an IPv4 wildcard.

If 'flags & TAPMP_EXTENDED_STAR' and 'flags & TAPMP_STAR_IPV6_ONLY' are both true, then the wildcard address '*' yields an IPv6 wildcard.

TAPMP_STAR_IPV4_ONLY and TAPMP_STAR_IPV6_ONLY are mutually exclusive.

Longest possible length for an address, mask, and port-range combination. Includes IP, [], /mask, :, ports

Definition at line 542 of file address.c.

References tor_assert().

Referenced by find_single_ipv6_orport(), and policy_expand_private().

◆ tor_addr_parse_PTR_name()

int tor_addr_parse_PTR_name ( tor_addr_t result,
const char *  address,
int  family,
int  accept_regular 
)

Parse an .in-addr.arpa or .ip6.arpa address from address. Return 0 if this is not an .in-addr.arpa address or an .ip6.arpa address. Return -1 if this is an ill-formed .in-addr.arpa address or an .ip6.arpa address. Also return -1 if family is not AF_UNSPEC, and the parsed address family does not match family. On success, return 1, and store the result, if any, into result, if provided.

If accept_regular is set and the address is in neither recognized reverse lookup hostname format, try parsing the address as a regular IPv4 or IPv6 address too.

Definition at line 379 of file address.c.

References hex_decode_digit(), INET_NTOA_BUF_LEN, strcasecmpend(), tor_addr_from_in, tor_addr_from_in6(), tor_addr_parse(), and tor_inet_aton().

◆ tor_addr_port_eq()

int tor_addr_port_eq ( const tor_addr_port_t a,
const tor_addr_port_t b 
)

Return true iff a and b are the same address and port

Definition at line 1948 of file address.c.

References tor_addr_eq.

◆ tor_addr_port_new()

tor_addr_port_t* tor_addr_port_new ( const tor_addr_t addr,
uint16_t  port 
)

Return a newly allocated tor_addr_port_t with addr and port filled in.

Definition at line 1937 of file address.c.

◆ tor_addr_port_parse()

int tor_addr_port_parse ( int  severity,
const char *  addrport,
tor_addr_t address_out,
uint16_t *  port_out,
int  default_port 
)

Given an address of the form "ip:port", try to divide it into its ip and port portions, setting *address_out to a newly allocated string holding the address portion and *port_out to the port.

Don't do DNS lookups and don't allow domain names in the "ip" field.

If default_port is less than 0, don't accept addrport of the form "ip" or "ip:0". Otherwise, accept those forms, and set *port_out to default_port.

Return 0 on success, -1 on failure.

Definition at line 1723 of file address.c.

References tor_addr_parse(), tor_addr_port_split(), tor_assert(), and tor_free.

◆ tor_addr_port_split()

int tor_addr_port_split ( int  severity,
const char *  addrport,
char **  address_out,
uint16_t *  port_out 
)

Given an address of the form "host[:port]", try to divide it into its host and port portions, setting *address_out to a newly allocated string holding the address portion and *port_out to the port (or 0 if no port is given). Return 0 on success, -1 on failure.

Definition at line 1762 of file address.c.

References tor_addr_parse(), and tor_assert().

Referenced by tor_addr_port_parse().

◆ tor_addr_to_PTR_name()

int tor_addr_to_PTR_name ( char *  out,
size_t  outlen,
const tor_addr_t addr 
)

Convert addr to an in-addr.arpa name or a .ip6.arpa name, and store the result in the outlen-byte buffer at out. Returns a non-negative integer on success. Returns -1 on failure.

Definition at line 469 of file address.c.

References REVERSE_LOOKUP_NAME_BUF_LEN, tor_addr_to_in6_addr8, tor_addr_to_ipv4h(), tor_assert(), and tor_snprintf().

◆ tor_addr_to_sockaddr()

socklen_t tor_addr_to_sockaddr ( const tor_addr_t a,
uint16_t  port,
struct sockaddr *  sa_out,
socklen_t  len 
)

Convert the tor_addr_t in a, with port in port, into a sockaddr object in *sa_out of object size len. If not enough room is available in sa_out, or on error, return 0. On success, return the length of the sockaddr.

Interface note: ordinarily, we return -1 for error. We can't do that here, since socklen_t is unsigned on some platforms.

Definition at line 113 of file address.c.

References tor_addr_family(), tor_addr_to_in6_assert(), and tor_addr_to_ipv4n().

◆ tor_addr_to_str()

const char* tor_addr_to_str ( char *  dest,
const tor_addr_t addr,
size_t  len,
int  decorate 
)

Convert a tor_addr_t addr into a string, and store it in dest of size len. Returns a pointer to dest on success, or NULL on failure. If decorate, surround IPv6 addresses with brackets.

Definition at line 328 of file address.c.

References tor_addr_family(), tor_assert(), tor_inet_ntop(), and tor_snprintf().

Referenced by client_dns_set_addressmap(), fmt_addr_impl(), get_pt_proxy_uri(), policy_write_item(), remap_event_helper(), and tor_addr_to_str_dup().

◆ tor_addr_to_str_dup()

char* tor_addr_to_str_dup ( const tor_addr_t addr)

Return a newly allocated string with a representation of addr.

Definition at line 1133 of file address.c.

References TOR_ADDR_BUF_LEN, and tor_addr_to_str().

◆ tor_dup_ip()

char* tor_dup_ip ( uint32_t  addr)

Given a host-order addr, call tor_inet_ntop() on it and return a strdup of the resulting address.

Definition at line 1890 of file address.c.

References TOR_ADDR_BUF_LEN, and tor_inet_ntop().

Referenced by inform_testing_reachability(), reachability_warnings_callback(), router_dirport_found_reachable(), and router_orport_found_reachable().

◆ tor_sockaddr_to_str()

char* tor_sockaddr_to_str ( const struct sockaddr *  sa)

Return a newly allocated string holding the address described in sa. AF_UNIX, AF_UNSPEC, AF_INET, and AF_INET6 are supported.

Definition at line 198 of file address.c.

References TOR_ADDR_BUF_LEN, and tor_asprintf().

Variable Documentation

◆ unspec_hash_input

const uint32_t unspec_hash_input[] = { 0x4e4df09f, 0x92985342 }
static

Input for siphash, to produce some output for an unspec value.

Definition at line 1088 of file address.c.

Referenced by tor_addr_hash(), and tor_addr_keyed_hash().