38print_sockaddr_ex(
const struct sockaddr *sa,
const char *separator,
const unsigned int flags,
48 switch (sa->sa_family)
55 salen =
sizeof(
struct sockaddr_in);
56 addr_is_defined = ((
struct sockaddr_in *)sa)->sin_addr.s_addr != 0;
64 salen =
sizeof(
struct sockaddr_in6);
65 addr_is_defined = !IN6_IS_ADDR_UNSPECIFIED(&((
struct sockaddr_in6 *)sa)->sin6_addr);
82 status = getnameinfo(sa, salen, hostaddr,
sizeof(hostaddr), servname,
sizeof(servname),
83 NI_NUMERICHOST | NI_NUMERICSERV);
123#define IF_NAMESIZE 16
128 const unsigned int flags,
struct gc_arena *
gc)
139 switch (
act->dest.addr.sa.sa_family)
145 sa.addr.in4.sin_family = AF_INET;
146#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
147 sa.addr.in4.sin_addr = act->pi.in4.ipi_spec_dst;
148 if_indextoname(act->pi.in4.ipi_ifindex, ifname);
149#elif defined(IP_RECVDSTADDR)
150 sa.addr.in4.sin_addr = act->pi.in4;
153#error ENABLE_IP_PKTINFO is set without IP_PKTINFO xor IP_RECVDSTADDR (fix syshead.h)
162 struct sockaddr_in6 sin6;
163 char buf[INET6_ADDRSTRLEN] =
"[undef]";
165 sin6.sin6_family = AF_INET6;
166 sin6.sin6_addr = act->pi.in6.ipi6_addr;
167 if_indextoname(act->pi.in6.ipi6_ifindex, ifname);
168 if (getnameinfo((
struct sockaddr *)&sin6,
sizeof(
struct sockaddr_in6), buf,
169 sizeof(buf), NULL, 0, NI_NUMERICHOST)
172 buf_printf(&out,
" (via %s%%%s)", buf, ifname);
176 buf_printf(&out,
" (via [getnameinfo() err]%%%s)", ifname);
204 ia.s_addr = (flags &
IA_NET_ORDER) ? addr : htonl(addr);
206 inet_ntop(AF_INET, &ia, out, INET_ADDRSTRLEN);
222 inet_ntop(AF_INET6, &a6, out, INET6_ADDRSTRLEN);
244 for (
int i = 15;
i >= 0 && add > 0;
i--)
246 register uint32_t carry;
250 base.s6_addr[
i] = (h + add) & UINT8_MAX;
255 carry = ((h & 0xff) + (add & 0xff)) >> 8;
256 add = (add >> 8) + carry;
264 const unsigned int flags)
268 char buf[INET6_ADDRSTRLEN];
269 switch (addr->
addr.
sa.sa_family)
274 snprintf(name_buf,
sizeof(name_buf),
"%s_ip", name_prefix);
278 snprintf(name_buf,
sizeof(name_buf),
"%s", name_prefix);
281 inet_ntop(AF_INET, &addr->
addr.
in4.sin_addr, buf,
sizeof(buf));
286 snprintf(name_buf,
sizeof(name_buf),
"%s_port", name_prefix);
292 if (IN6_IS_ADDR_V4MAPPED(&addr->
addr.
in6.sin6_addr))
295 memcpy(&ia.s_addr, &addr->
addr.
in6.sin6_addr.s6_addr[12],
sizeof(ia.s_addr));
296 snprintf(name_buf,
sizeof(name_buf),
"%s_ip", name_prefix);
297 inet_ntop(AF_INET, &ia, buf,
sizeof(buf));
301 snprintf(name_buf,
sizeof(name_buf),
"%s_ip6", name_prefix);
302 inet_ntop(AF_INET6, &addr->
addr.
in6.sin6_addr, buf,
sizeof(buf));
308 snprintf(name_buf,
sizeof(name_buf),
"%s_port", name_prefix);
317 const unsigned int flags)
323 si.
addr.
in4.sin_family = AF_INET;
331 const unsigned int flags)
337 si.
addr.
in6.sin6_family = AF_INET6;
364 {
"proto-uninitialized",
"proto-NONE", AF_UNSPEC,
PROTO_NONE },
376 {
"udp6",
"UDPv6", AF_INET6,
PROTO_UDP },
379 {
"tcp6",
"TCPv6", AF_INET6,
PROTO_TCP },
426 return "[unknown protocol]";
482 return "TCPv4_SERVER";
486 return "TCPv4_CLIENT";
541 struct addrinfo hints;
546 const char *print_hostname;
547 const char *print_servname;
551 ASSERT(hostname || servname);
556 print_servname = servname;
575 hints.ai_flags = AI_NUMERICHOST;
579 hints.ai_flags |= AI_PASSIVE;
584 hints.ai_socktype = SOCK_DGRAM;
588 hints.ai_socktype = SOCK_STREAM;
595 hints.ai_family = ai_family;
598 status = getaddrinfo(hostname, servname, &hints,
res);
602 const int fail_wait_interval = 5;
604 int resolve_retries =
605 (flags &
GETADDR_TRY_ONCE) ? 1 : ((resolve_retry_seconds + 4) / fail_wait_interval);
611 hints.ai_family = ai_family;
620 print_hostname = hostname;
624 print_hostname =
"undefined";
627 fmt =
"RESOLVE: Cannot resolve host address: %s:%s%s (%s)";
630 fmt =
"RESOLVE: Cannot resolve host address: %s:%s%s (%s)"
631 "(I would have retried this name query if you had "
632 "specified the --resolv-retry option.)";
637 msg(msglevel,
"RESOLVE: Cannot parse IP address: %s:%s (%s)", print_hostname,
638 print_servname, gai_strerror(
status));
642#ifdef ENABLE_MANAGEMENT
663 hints.ai_flags &= ~AI_NUMERICHOST;
665 hints.ai_family, hints.ai_socktype);
666 status = getaddrinfo(hostname, servname, &hints,
res);
676 msg(level,
"RESOLVE: Ignored SIGUSR1 signal received during "
677 "DNS resolution attempt");
704 if (resolve_retries > 0)
712 if (--resolve_retries <= 0)
734 msg(
M_WARN,
"WARNING: ignoring --remote-random-hostname because the "
735 "hostname is an IP address");
751 msg(level,
"RESOLVE: signal received during DNS resolution attempt");
765 unsigned int a, b, c, d;
768 if (sscanf(dotted_quad,
"%u.%u.%u.%u", &a, &b, &c, &d) == 4)
770 if (a < 256 && b < 256 && c < 256 && d < 256)
772 addr->s_addr = htonl(a << 24 | b << 16 | c << 8 | d);
796 if (strlen(dotted_quad) > 15)
805 const char *p = dotted_quad;
810 if (c >=
'0' && c <=
'9')
846 if (strlen(ipv6_text_addr) > INET6_ADDRSTRLEN)
854 return inet_pton(AF_INET6, ipv6_text_addr, &a6) == 1;
863 const size_t len = strlen(addr);
899 if (strlen(mac_addr) > 17)
908 const char *p = mac_addr;
913 if ((c >=
'0' && c <=
'9') || (c >=
'a' && c <=
'f') || (c >=
'A' && c <=
'F'))
bool buf_printf(struct buffer *buf, const char *format,...)
bool buf_puts(struct buffer *buf, const char *str)
bool string_class(const char *str, const unsigned int inclusive, const unsigned int exclusive)
char * format_hex_ex(const uint8_t *data, int size, int maxoutput, unsigned int space_break_flags, const char *separator, struct gc_arena *gc)
void * gc_malloc(size_t size, bool clear, struct gc_arena *a)
struct buffer alloc_buf_gc(size_t size, struct gc_arena *gc)
#define CC_DIGIT
digit isdigit()
static void gc_free(struct gc_arena *a)
#define CC_ALNUM
alphanumeric isalnum()
static struct gc_arena gc_new(void)
void prng_bytes(uint8_t *output, int len)
Data Channel Cryptography Module.
void setenv_int(struct env_set *es, const char *name, int value)
void setenv_str(struct env_set *es, const char *name, const char *value)
static SERVICE_STATUS status
void management_set_state(struct management *man, const int state, const char *detail, const in_addr_t *tun_local_ip, const struct in6_addr *tun_local_ip6, const struct openvpn_sockaddr *local, const struct openvpn_sockaddr *remote)
void management_sleep(const int n)
A sleep function that services the management layer for n seconds rather than doing nothing.
#define OPENVPN_STATE_RESOLVE
int signal_reset(struct signal_info *si, int signum)
Clear the signal if its current value equals signum.
static void get_signal(volatile int *sig)
Copy the global signal_received (if non-zero) to the passed-in argument sig.
static bool dns_addr_safe(const char *addr)
const char * proto2ascii(int proto, sa_family_t af, bool display_form)
int openvpn_getaddrinfo(unsigned int flags, const char *hostname, const char *servname, int resolve_retry_seconds, struct signal_info *sig_info, int ai_family, struct addrinfo **res)
bool mac_addr_safe(const char *mac_addr)
void setenv_in_addr_t(struct env_set *es, const char *name_prefix, in_addr_t addr, const unsigned int flags)
const char * print_sockaddr_ex(const struct sockaddr *sa, const char *separator, const unsigned int flags, struct gc_arena *gc)
const char * print_in_port_t(in_port_t port, struct gc_arena *gc)
static const char * hostname_randomize(const char *hostname, struct gc_arena *gc)
const char * proto2ascii_all(struct gc_arena *gc)
void setenv_link_socket_actual(struct env_set *es, const char *name_prefix, const struct link_socket_actual *act, const unsigned int flags)
void setenv_in6_addr(struct env_set *es, const char *name_prefix, const struct in6_addr *addr, const unsigned int flags)
const char * print_link_socket_actual(const struct link_socket_actual *act, struct gc_arena *gc)
void setenv_sockaddr(struct env_set *es, const char *name_prefix, const struct openvpn_sockaddr *addr, const unsigned int flags)
const char * print_link_socket_actual_ex(const struct link_socket_actual *act, const char *separator, const unsigned int flags, struct gc_arena *gc)
struct in6_addr add_in6_addr(struct in6_addr base, uint32_t add)
sa_family_t ascii2af(const char *proto_name)
int openvpn_inet_aton(const char *dotted_quad, struct in_addr *addr)
const char * proto_remote(int proto, bool remote)
bool ipv6_addr_safe(const char *ipv6_text_addr)
const char * print_in6_addr(struct in6_addr a6, unsigned int flags, struct gc_arena *gc)
bool ip_or_dns_addr_safe(const char *addr, const bool allow_fqdn)
int ascii2proto(const char *proto_name)
const char * print_in_addr_t(in_addr_t addr, unsigned int flags, struct gc_arena *gc)
static const char * getaddrinfo_addr_family_name(int af)
Small helper function for openvpn_getaddrinfo to print the address family when resolving fails.
const char * addr_family_name(int af)
bool ip_addr_dotted_quad_safe(const char *dotted_quad)
#define IA_EMPTY_IF_UNDEF
#define GETADDR_MSG_VIRT_OUT
#define GETADDR_UPDATE_MANAGEMENT_STATE
#define PS_DONT_SHOW_ADDR
#define GETADDR_HOST_ORDER
#define PS_SHOW_PORT_IF_DEFINED
#define GETADDR_RANDOMIZE
#define GETADDR_FATAL_ON_SIGNAL
static bool addr_defined_ipi(const struct link_socket_actual *lsa)
#define PS_DONT_SHOW_FAMILY
#define SA_SET_IF_NONZERO
#define GETADDR_MENTION_RESOLVE_RETRY
#define GETADDR_WARN_ON_SIGNAL
Wrapper structure for dynamically allocated memory.
int len
Length in bytes of the actual content within the allocated memory.
Garbage collection arena used to keep track of dynamically allocated memory.
struct openvpn_sockaddr dest
union openvpn_sockaddr::@27 addr
const char * display_form
volatile int signal_received
unsigned short sa_family_t