30 #include <glib/gstdio.h> 55 struct ifaddrs *ifaddr, *ifa;
65 if (getifaddrs (&ifaddr) == -1)
69 for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
71 if (ifa->ifa_addr && strcmp (iface, ifa->ifa_name) == 0)
73 if (ifa->ifa_addr->sa_family == AF_INET)
75 struct in_addr *addr = &((
struct sockaddr_in *)
76 ifa->ifa_addr)->sin_addr;
81 else if (ifa->ifa_addr->sa_family == AF_INET6)
83 struct sockaddr_in6 *addr;
85 addr = (
struct sockaddr_in6 *) ifa->ifa_addr;
87 sizeof (
struct in6_addr));
119 if (family == AF_INET)
121 struct sockaddr_in addr;
124 addr.sin_port = htons (port);
125 addr.sin_family = AF_INET;
127 if (bind (socket, (
struct sockaddr *) &addr,
sizeof (addr)) < 0)
130 else if (family == AF_INET6)
132 struct sockaddr_in6 addr6;
135 addr6.sin6_port = htons (port);
136 addr6.sin6_family = AF_INET6;
138 if (bind (socket, (
struct sockaddr *) &addr6,
sizeof (addr6)) < 0)
192 char *str = g_malloc0 (INET_ADDRSTRLEN);
206 char *str = g_malloc0 (INET6_ADDRSTRLEN);
224 if (ip4 == NULL || ip6 == NULL)
227 ip6->s6_addr32[0] = 0;
228 ip6->s6_addr32[1] = 0;
229 ip6->s6_addr32[2] = htonl (0xffff);
230 memcpy (&ip6->s6_addr32[3], ip4, sizeof (
struct in_addr));
241 str = g_malloc0 (INET6_ADDRSTRLEN);
242 if (IN6_IS_ADDR_V4MAPPED (addr6))
243 inet_ntop (AF_INET, &addr6->s6_addr32[3], str, INET6_ADDRSTRLEN);
245 inet_ntop (AF_INET6, addr6, str, INET6_ADDRSTRLEN);
261 if (addr->ss_family == AF_INET)
263 struct sockaddr_in *saddr = (
struct sockaddr_in *) addr;
264 inet_ntop (AF_INET, &saddr->sin_addr, str, INET6_ADDRSTRLEN);
266 else if (addr->ss_family == AF_INET6)
268 struct sockaddr_in6 *s6addr = (
struct sockaddr_in6 *) addr;
269 if (IN6_IS_ADDR_V4MAPPED (&s6addr->sin6_addr))
270 inet_ntop (AF_INET, &s6addr->sin6_addr.s6_addr[12],
271 str, INET6_ADDRSTRLEN);
273 inet_ntop (AF_INET6, &s6addr->sin6_addr, str, INET6_ADDRSTRLEN);
275 else if (addr->ss_family == AF_UNIX)
277 g_snprintf (str, INET6_ADDRSTRLEN,
"unix_socket");
279 else if (addr->ss_family == AF_UNSPEC)
281 g_snprintf (str, INET6_ADDRSTRLEN,
"unknown_socket");
285 g_snprintf (str, INET6_ADDRSTRLEN,
286 "type_%d_socket", addr->ss_family);
303 struct addrinfo hints, *info, *p;
305 if (
name == NULL || dst == NULL
306 || (family != AF_INET && family != AF_INET6 && family != AF_UNSPEC))
309 bzero (&hints,
sizeof (hints));
310 hints.ai_family = family;
311 hints.ai_socktype = SOCK_STREAM;
312 hints.ai_protocol = 0;
313 if ((getaddrinfo (
name, NULL, &hints, &info)) != 0)
319 if (p->ai_family == family || family == AF_UNSPEC)
321 if (p->ai_family == AF_INET && family == AF_UNSPEC)
323 struct sockaddr_in *addrin = (
struct sockaddr_in *) p->ai_addr;
326 else if (p->ai_family == AF_INET)
328 struct sockaddr_in *addrin = (
struct sockaddr_in *) p->ai_addr;
329 memcpy (dst, &(addrin->sin_addr),
sizeof (
struct in_addr));
331 else if (p->ai_family == AF_INET6)
333 struct sockaddr_in6 *addrin = (
struct sockaddr_in6 *) p->ai_addr;
334 memcpy (dst, &(addrin->sin6_addr),
sizeof (
struct in6_addr));
374 gchar **split, **point, *
range, *range_start;
379 while (*port_range && isblank (*port_range)) port_range++;
380 if (*port_range ==
'\0')
384 range = range_start = g_strdup (port_range);
391 split = g_strsplit (range_start,
",", 0);
392 g_free (range_start);
397 gchar *hyphen, *element;
401 element = g_strstrip (*point);
405 if ((strlen (element) >= 2)
406 && ((element[0] ==
'T') || (element[0] ==
'U'))
407 && (element[1] ==
':'))
408 element = element + 2;
412 hyphen = strchr (element,
'-');
415 long int number1, number2;
424 while (*first && isblank (*first)) first++;
429 number1 = strtol (first, &end, 10);
430 while (*end && isblank (*end)) end++;
431 if (errno || (*end !=
'-'))
440 while (*hyphen && isblank (*hyphen)) hyphen++;
445 number2 = strtol (hyphen, &end, 10);
446 while (*end && isblank (*end)) end++;
454 if (number1 > number2)
466 while (*only && isblank (*only)) only++;
471 number = strtol (only, &end, 10);
472 while (*end && isblank (*end)) end++;
502 gchar **split, **point, *range_start, *current;
511 while (*port_range && isblank (*port_range)) port_range++;
518 range_start = current = g_strdup (port_range);
521 if (*current ==
'\n') *current =
',';
526 split = g_strsplit (range_start,
",", 0);
527 g_free (range_start);
532 gchar *hyphen, *element;
535 element = g_strstrip (*point);
536 if (strlen (element) >= 2)
538 if ((element[0] ==
'T') && (element[1] ==
':'))
541 element = element + 2;
543 else if ((element[0] ==
'U') && (element[1] ==
':'))
546 element = element + 2;
552 while (*element && isblank (*element)) element++;
554 hyphen = strchr (element,
'-');
559 while (*hyphen && isblank (*hyphen)) hyphen++;
607 if (pranges == NULL || pnum < 0 || pnum > 65536)
610 for (i = 0; i < pranges->len; i++)
615 if (
range->
start <= pnum && pnum <= range->end)
629 int sock = socket (PF_INET6, SOCK_STREAM, 0);
631 if (sock == -1 && errno == EAFNOSUPPORT)
void openvas_source_addr6(void *addr6)
Gives the source IPv6 address.
int port_in_port_ranges(int pnum, port_protocol_t ptype, array_t *pranges)
Checks if a port num is in port ranges array.
char * openvas_source_addr_str(void)
Gives the source IPv4 address in string format.
void sockaddr_as_str(const struct sockaddr_storage *addr, char *str)
Convert an IP address to string format.
int validate_port_range(const char *port_range)
Validate a port range string.
void openvas_source_addr(void *addr)
Gives the source IPv4 address.
char * openvas_source_addr6_str(void)
Gives the source IPv6 address in string format.
int openvas_resolve(const char *name, void *dst, int family)
Resolves a hostname to an IPv4 or IPv6 address.
char * addr6_as_str(const struct in6_addr *addr6)
port_protocol_t
Possible port types.
char global_source_iface[IFNAMSIZ]
int openvas_source_set_socket(int socket, int port, int family)
Binds a socket to use the global source address.
int ipv6_is_enabled()
Checks if IPv6 support is enabled.
int openvas_resolve_as_addr6(const char *name, struct in6_addr *ip6)
Resolves a hostname to an IPv4-mapped IPv6 or IPv6 address.
void openvas_source_addr_as_addr6(struct in6_addr *addr6)
Gives the source IPv4 mapped as an IPv6 address. eg. 192.168.20.10 would map to ::ffff:192....
void array_add(array_t *array, gpointer pointer)
Push a generic pointer onto an array.
int openvas_source_iface_is_set(void)
struct in6_addr global_source_addr6
int openvas_source_iface_init(const char *iface)
Initializes the source network interface name and related information.
GPtrArray * make_array()
Make a global array.
void ipv4_as_ipv6(const struct in_addr *ip4, struct in6_addr *ip6)
Maps an IPv4 address as an IPv6 address. eg. 192.168.10.20 would map to ::ffff:192....
struct in_addr global_source_addr
array_t * port_range_ranges(const char *port_range)
Create a range array from a port_range string.