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";
500 unsigned int a,
b,
c,
d;
505 if (
a < 256 &&
b < 256 &&
c < 256 &&
d < 256)
507 addr->s_addr =
htonl(
a << 24 |
b << 16 |
c << 8 |
d);
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.
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
unsigned short sa_family_t