38print_sockaddr_ex(
const struct sockaddr *sa,
const char *separator,
const unsigned int flags,
42 bool addr_is_defined =
false;
43 char hostaddr[NI_MAXHOST] =
"";
44 char servname[NI_MAXSERV] =
"";
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)
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";
500 unsigned int a, b, c, d;
503 if (sscanf(dotted_quad,
"%u.%u.%u.%u", &a, &b, &c, &d) == 4)
505 if (a < 256 && b < 256 && c < 256 && d < 256)
507 addr->s_addr = htonl(a << 24 | b << 16 | c << 8 | d);
531 if (strlen(dotted_quad) > 15)
540 const char *p = dotted_quad;
545 if (c >=
'0' && c <=
'9')
581 if (strlen(ipv6_text_addr) > INET6_ADDRSTRLEN)
589 return inet_pton(AF_INET6, ipv6_text_addr, &a6) == 1;
598 const size_t len = strlen(addr);
634 if (strlen(mac_addr) > 17)
643 const char *p = mac_addr;
648 if ((c >=
'0' && c <=
'9') || (c >=
'a' && c <=
'f') || (c >=
'A' && c <=
'F'))
bool buf_printf(struct buffer *buf, const char *format,...)
printf-style append to a buffer with overflow check.
bool string_class(const char *str, const unsigned int inclusive, const unsigned int exclusive)
Test whether all characters in a string satisfy a character class filter.
void * gc_malloc(size_t size, bool clear, struct gc_arena *a)
Allocate memory and, optionally, zero it.
void buf_puts(struct buffer *buf, const char *str)
Append a string to a buffer with overflow check.
struct buffer alloc_buf_gc(size_t size, struct gc_arena *gc)
Allocate a buffer of the given size under garbage collection.
#define BSTR(buf)
Return the buffer content pointer cast to char *.
#define CC_DIGIT
digit isdigit()
#define CC_ALNUM
alphanumeric isalnum()
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
static bool dns_addr_safe(const char *addr)
const char * proto2ascii(int proto, sa_family_t af, bool display_form)
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)
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)
const char * addr_family_name(int af)
bool ip_addr_dotted_quad_safe(const char *dotted_quad)
#define IA_EMPTY_IF_UNDEF
#define PS_DONT_SHOW_ADDR
#define PS_SHOW_PORT_IF_DEFINED
#define PS_DONT_SHOW_FAMILY
#define SA_SET_IF_NONZERO
Wrapper structure for dynamically allocated memory.
Garbage collection arena used to keep track of dynamically allocated memory.
struct openvpn_sockaddr dest
union openvpn_sockaddr::@051240265251124304325377241125360350250341115171 addr
const char * display_form
unsigned short sa_family_t