Tor  0.4.7.0-alpha-dev
Macros | Functions | Variables
address.c File Reference

Functions to use and manipulate the tor_addr_t structure. More...

#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_v6 (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 uint8_t *ipv6_bytes)
 
void tor_addr_from_in6 (tor_addr_t *dest, const struct in6_addr *in6)
 
void tor_addr_copy_ipv6_bytes (uint8_t *dest, const tor_addr_t *src)
 
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)
 
const char * fmt_addr32_port (uint32_t addr, uint16_t port)
 
const char * fmt_af_family (sa_family_t family)
 
const char * fmt_addr_family (const tor_addr_t *addr)
 
static int tor_addr_parse_impl (tor_addr_t *addr, const char *src, bool allow_ipv6_without_brackets)
 
int tor_addr_parse (tor_addr_t *addr, const char *src)
 
smartlist_tget_interface_addresses_raw (int severity, sa_family_t family)
 
int tor_addr_is_multicast (const tor_addr_t *a)
 
int get_interface_address6_via_udp_socket_hack (int severity, sa_family_t family, tor_addr_t *addr)
 
int get_interface_address6 (int severity, sa_family_t family, tor_addr_t *addr)
 
void interface_address6_list_free_ (smartlist_t *addrs)
 
smartlist_tget_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)
 
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)
 
void tor_addr_port_copy (tor_addr_port_t *dest, const tor_addr_port_t *source)
 
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 1975 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. Clean internal buffer and return empty string on failure.

Definition at line 1210 of file address.c.

Referenced by fmt_addr32_port().

◆ fmt_addr32_port()

const char* fmt_addr32_port ( uint32_t  addr,
uint16_t  port 
)

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

Definition at line 1233 of file address.c.

◆ fmt_addr_family()

const char* fmt_addr_family ( const tor_addr_t addr)

Return a string representing the family of addr.

This string is a string constant, and must not be freed. This function is thread-safe.

Definition at line 1276 of file address.c.

◆ 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 1184 of file address.c.

◆ 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 1199 of file address.c.

Referenced by bridge_resolve_conflicts().

◆ fmt_af_family()

const char* fmt_af_family ( sa_family_t  family)

Return a string representing family.

This string is a string constant, and must not be freed. This function is thread-safe.

Definition at line 1246 of file address.c.

Referenced by fmt_addr_family(), and router_do_orport_reachability_checks().

◆ get_interface_address()

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 2073 of file address.c.

◆ get_interface_address6()

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 1723 of file address.c.

Referenced by get_interface_address().

◆ get_interface_address6_list()

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 1777 of file address.c.

Referenced by get_interface_address6(), and get_interface_address_list().

◆ get_interface_address6_via_udp_socket_hack()

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 1647 of file address.c.

◆ get_interface_addresses_raw()

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 1602 of file address.c.

Referenced by get_interface_address6_list().

◆ 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 1757 of file address.c.

◆ 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 1994 of file address.c.

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 2155 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 address in 'a.b.c.d' form.

Definition at line 2133 of file address.c.

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 2144 of file address.c.

◆ 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 2188 of file address.c.

◆ 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 984 of file address.c.

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

◆ 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 1005 of file address.c.

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

◆ tor_addr_copy()

void tor_addr_copy ( tor_addr_t dest,
const tor_addr_t src 
)

◆ tor_addr_copy_ipv6_bytes()

void tor_addr_copy_ipv6_bytes ( uint8_t *  dest,
const tor_addr_t src 
)

Set the 16 bytes at dest to equal the IPv6 address src. src must be an IPv6 address, if it is not, log a warning, and clear dest.

Definition at line 920 of file address.c.

◆ 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 947 of file address.c.

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 911 of file address.c.

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 889 of file address.c.

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 uint8_t *  ipv6_bytes 
)

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

Definition at line 900 of file address.c.

Referenced by connected_cell_parse(), 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.

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 1123 of file address.c.

◆ 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 2090 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.

◆ 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 805 of file address.c.

Referenced by get_interface_address6_list(), 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 1624 of file address.c.

Referenced by get_interface_address6_list().

◆ 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 750 of file address.c.

Referenced by get_first_listener_addrport_string(), and tor_addr_is_internal_().

◆ tor_addr_is_v6()

int tor_addr_is_v6 ( const tor_addr_t addr)

Determine whether an address addr is an IPv6 (AF_INET6). Return true if so else false.

Definition at line 770 of file address.c.

◆ 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 1142 of file address.c.

Referenced by bloomfilt_addr_hash().

◆ 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_can_use_exit(), connection_ap_get_begincell_flags(), hs_get_extend_info_from_lspecs(), reachable_addr_choose_base(), reachable_addr_choose_from_dir_server(), reachable_addr_choose_from_node(), reachable_addr_choose_from_rs(), resolved_addr_reset_last(), and routerconf_find_ipv6_or_ap().

◆ 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 circuit_send_intermediate_onion_skin(), connected_cell_parse(), relay_find_addr_to_publish(), 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.

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

Definition at line 1349 of file address.c.

Referenced by address_is_in_virtual_range(), address_is_invalid_destination(), addressmap_rewrite_reverse(), adjust_exit_policy_from_exitpolicy_failure(), client_dns_set_addressmap(), connection_ap_can_use_exit(), connection_ap_fail_onehop(), getinfo_helper_geoip(), http_set_address_origin(), tor_addr_lookup(), tor_addr_parse_PTR_name(), tor_addr_port_lookup(), and tor_addr_port_split().

◆ tor_addr_parse_impl()

static int tor_addr_parse_impl ( tor_addr_t addr,
const char *  src,
bool  allow_ipv6_without_brackets 
)
static

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

If allow_ipv6_without_brackets is true, also allow IPv6 addresses without brackets.

Always rejects IPv4 addresses with brackets.

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

Definition at line 1295 of file address.c.

Referenced by tor_addr_parse(), and tor_addr_port_parse().

◆ 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 543 of file address.c.

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. This mode will accept IPv6 addresses with or without square brackets.

Definition at line 380 of file address.c.

◆ tor_addr_port_copy()

void tor_addr_port_copy ( tor_addr_port_t dest,
const tor_addr_port_t source 
)

Copy a tor_addr_port_t from source to dest.

Definition at line 2121 of file address.c.

◆ 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 2111 of file address.c.

◆ 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 2100 of file address.c.

Referenced by connection_haproxy_proxy_connect().

◆ 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.

This function accepts:

  • IPv6 address and port, when the IPv6 address is in square brackets,
  • IPv6 address with square brackets,
  • IPv6 address without square brackets.

Return 0 on success, -1 on failure.

Definition at line 1857 of file address.c.

Referenced by tor_addr_port_lookup().

◆ 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.

Like tor_addr_port_parse(), this function accepts:

  • IPv6 address and port, when the IPv6 address is in square brackets,
  • IPv6 address with square brackets,
  • IPv6 address without square brackets.

Sets *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 1916 of file address.c.

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 470 of file address.c.

◆ 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.

◆ 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.

Referenced by client_dns_set_addressmap(), fmt_addr_impl(), get_pt_proxy_uri(), node_get_address_string(), 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 1164 of file address.c.

Referenced by reachability_warnings_callback().

◆ 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. Return NULL if tor_inet_ntop() fails.

Definition at line 2047 of file address.c.

◆ 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.

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 1119 of file address.c.

Referenced by tor_addr_hash(), and tor_addr_keyed_hash().