34 #include <arpa/inet.h>
43 #include <sys/socket.h>
49 #define G_LOG_DOMAIN "base hosts"
74 struct sockaddr_in sa;
76 return inet_pton (AF_INET, str, &(sa.sin_addr)) == 1;
90 struct sockaddr_in6 sa6;
92 return inet_pton (AF_INET6, str, &(sa6.sin6_addr)) == 1;
107 char *addr_str, *block_str, *p;
109 addr_str = g_strdup (str);
110 block_str = strchr (addr_str,
'/');
111 if (block_str == NULL)
128 block = strtol (block_str, &p, 10);
130 if (*p || block <= 0 || block > 30)
152 if (str == NULL || block == NULL)
155 if (sscanf (str,
"%*[0-9.]/%2u", block) != 1)
173 gchar *addr_str, *tmp;
175 if (str == NULL || addr == NULL)
178 addr_str = g_strdup (str);
179 tmp = strchr (addr_str,
'/');
187 if (inet_pton (AF_INET, addr_str, addr) != 1)
215 if (str == NULL || first == NULL || last == NULL)
225 first->s_addr &= htonl (0xffffffff ^ ((1 << (32 - block)) - 1));
226 first->s_addr = htonl (ntohl (first->s_addr) + 1);
229 last->s_addr = htonl (ntohl (first->s_addr) + (1 << (32 - block)) - 3);
244 char *first_str, *second_str;
247 first_str = g_strdup (str);
248 second_str = strchr (first_str,
'-');
249 if (second_str == NULL)
278 struct in_addr *last)
280 char *first_str, *last_str;
282 if (str == NULL || first == NULL || last == NULL)
285 first_str = g_strdup (str);
286 last_str = strchr (first_str,
'-');
287 if (last_str == NULL)
297 if (inet_pton (AF_INET, first_str, first) != 1
298 || inet_pton (AF_INET, last_str, last) != 1)
320 char *ip_str, *end_str, *p;
322 ip_str = g_strdup (str);
323 end_str = strchr (ip_str,
'-');
341 end = strtol (end_str, &p, 10);
344 if (*p || end < 0 || end > 255)
363 struct in_addr *last)
365 char *first_str, *last_str;
368 if (str == NULL || first == NULL || last == NULL)
371 first_str = g_strdup (str);
372 last_str = strchr (first_str,
'-');
373 if (last_str == NULL)
382 end = atoi (last_str);
385 if (inet_pton (AF_INET, first_str, first) != 1)
392 last->s_addr = htonl ((ntohl (first->s_addr) & 0xffffff00) + end);
412 while (*h && (isalnum (*h) || strchr (
"-_.", *h)))
416 if (*h ==
'\0' && h - str < 256)
434 char *addr6_str, *block_str, *p;
436 addr6_str = g_strdup (str);
437 block_str = strchr (addr6_str,
'/');
438 if (block_str == NULL)
455 block = strtol (block_str, &p, 10);
458 if (*p || block <= 0 || block > 128)
476 if (str == NULL || block == NULL)
479 if (sscanf (str,
"%*[0-9a-fA-F.:]/%3u", block) != 1)
497 gchar *addr6_str, *tmp;
499 if (str == NULL || addr6 == NULL)
502 addr6_str = g_strdup (str);
503 tmp = strchr (addr6_str,
'/');
511 if (inet_pton (AF_INET6, addr6_str, addr6) != 1)
535 if (str == NULL || first == NULL || last == NULL)
543 memcpy (&last->s6_addr, &first->s6_addr, 16);
551 for (i = (128 - block) / 8; i > 0; i--)
553 first->s6_addr[j] = 0;
556 first->s6_addr[j] &= 0xff ^ ((1 << ((128 - block) % 8)) - 1);
560 for (i = (128 - block) / 8; i > 0; i--)
562 last->s6_addr[j] = 0xff;
565 last->s6_addr[j] |= (1 << ((128 - block) % 8)) - 1;
572 for (i = 15; i >= 0; --i)
573 if (first->s6_addr[i] < 255)
579 first->s6_addr[i] = 0;
581 for (i = 15; i >= 0; --i)
582 if (last->s6_addr[i] > 0)
588 last->s6_addr[i] = 0xff;
604 char *first_str, *second_str;
607 first_str = g_strdup (str);
608 second_str = strchr (first_str,
'-');
609 if (second_str == NULL)
638 struct in6_addr *last)
640 char *first_str, *last_str;
642 if (str == NULL || first == NULL || last == NULL)
645 first_str = g_strdup (str);
646 last_str = strchr (first_str,
'-');
647 if (last_str == NULL)
657 if (inet_pton (AF_INET6, first_str, first) != 1
658 || inet_pton (AF_INET6, last_str, last) != 1)
679 char *ip_str, *end_str, *p;
681 ip_str = g_strdup (str);
682 end_str = strchr (ip_str,
'-');
701 while (isxdigit (*p) && p++)
703 if (*p || p - end_str > 4)
726 struct in6_addr *last)
728 char *first_str, *last_str;
731 if (str == NULL || first == NULL || last == NULL)
734 first_str = g_strdup (str);
735 last_str = strchr (first_str,
'-');
736 if (last_str == NULL)
746 if (inet_pton (AF_INET6, first_str, first) != 1)
753 memcpy (last, first,
sizeof (*last));
754 end = strtol (last_str, NULL, 16);
755 memcpy (&last->s6_addr[15], &end, 1);
756 memcpy (&last->s6_addr[14], ((
char *) &end) + 1, 1);
781 if (str_stripped == NULL || *str_stripped ==
'\0')
837 vhost->
value = value;
928 hosts->
orig_str = g_strdup (hosts_str);
945 for (i = 0; i < hosts->
max_size; i++)
947 if (!hosts->
hosts[i])
953 for (j = i + 1; j < hosts->
max_size; j++)
958 hosts->
hosts[j] = NULL;
964 if (!hosts->
hosts[i])
982 GHashTable *name_table;
983 size_t i, duplicates = 0;
987 name_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
989 for (i = 0; i < hosts->
count; i++)
997 host = g_hash_table_lookup (name_table, name);
1004 hosts->
hosts[i] = NULL;
1009 g_hash_table_insert (name_table, name, hosts->
hosts[i]);
1015 g_hash_table_destroy (name_table);
1016 hosts->
count -= duplicates;
1037 gchar **host_element, **split;
1040 if (hosts_str == NULL)
1054 split = g_strsplit (hosts->
orig_str,
",", 0);
1057 host_element = split;
1058 while (*host_element)
1061 gchar *stripped = g_strstrip (*host_element);
1063 if (stripped == NULL || *stripped ==
'\0')
1084 host->
name = g_ascii_strdown (stripped, -1);
1087 if (inet_pton (AF_INET, stripped, &host->
addr) != 1)
1092 if (inet_pton (AF_INET6, stripped, &host->
addr6) != 1)
1102 struct in_addr first, last;
1104 int (*ips_func) (
const char *,
struct in_addr *,
struct in_addr *);
1113 if (ips_func (stripped, &first, &last) == -1)
1117 if (ntohl (first.s_addr) > ntohl (last.s_addr))
1121 current = first.s_addr;
1122 while (ntohl (current) <= ntohl (last.s_addr))
1125 if (max_hosts > 0 && hosts->
count > max_hosts)
1133 host->
addr.s_addr = current;
1136 current = htonl (ntohl (current) + 1);
1144 struct in6_addr first, last;
1145 unsigned char current[16];
1146 int (*ips_func) (
const char *,
struct in6_addr *,
1156 if (ips_func (stripped, &first, &last) == -1)
1160 if (memcmp (&first.s6_addr, &last.s6_addr, 16) > 0)
1164 memcpy (current, &first.s6_addr, 16);
1165 while (memcmp (current, &last.s6_addr, 16) <= 0)
1170 if (max_hosts > 0 && hosts->
count > max_hosts)
1178 memcpy (host->
addr6.s6_addr, current, 16);
1181 for (i = 15; i >= 0; --i)
1182 if (current[i] < 255)
1200 if (max_hosts > 0 && hosts->
count > max_hosts)
1210 if (g_strv_length (split) > 1)
1267 for (i = 0; i < hosts->
count; i++)
1269 g_free (hosts->
hosts);
1290 rand = g_rand_new ();
1291 for (i = 0; i < hosts->
count; i++)
1294 int j = g_rand_int_range (rand, 0, hosts->
count);
1296 tmp = hosts->
hosts[i];
1298 hosts->
hosts[j] = tmp;
1319 for (i = 0, j = hosts->
count - 1; i < j; i++, j--)
1323 hosts->
hosts[j] = tmp;
1341 size_t i, new_entries = 0, resolved = 0;
1342 GSList *unresolved = NULL;
1344 for (i = 0; i < hosts->
count; i++)
1357 struct in6_addr *ip6 = tmp->data;
1361 if (ip6->s6_addr32[0] != 0 || ip6->s6_addr32[1] != 0
1362 || ip6->s6_addr32[2] != htonl (0xffff))
1365 memcpy (&new->addr6, ip6, sizeof (new->addr6));
1370 memcpy (&new->addr6, &ip6->s6_addr32[3], sizeof (new->addr));
1374 new->vhosts = g_slist_prepend (new->vhosts, vhost);
1381 hosts->
hosts[i] = NULL;
1384 unresolved = g_slist_prepend (unresolved, g_strdup (host->
name));
1386 g_slist_free_full (list, g_free);
1390 hosts->
count -= resolved;
1413 if (!host || !excluded_str)
1417 excluded = g_strsplit (excluded_str,
",", 0);
1418 if (!excluded || !*excluded)
1420 g_strfreev (excluded);
1425 char **tmp = excluded;
1426 char *value = ((
gvm_vhost_t *) vhost->data)->value;
1430 if (!strcasecmp (value, g_strstrip (*tmp)))
1433 host->
vhosts = vhost = g_slist_delete_link (host->
vhosts, vhost);
1440 vhost = vhost->next;
1445 g_strfreev (excluded);
1463 unsigned int max_hosts)
1469 GHashTable *name_table;
1470 size_t excluded = 0, i;
1472 if (hosts == NULL || excluded_str == NULL)
1476 if (excluded_hosts == NULL)
1486 name_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
1487 for (i = 0; i < excluded_hosts->
count; i++)
1492 g_hash_table_insert (name_table, name, hosts);
1496 for (i = 0; i < hosts->
count; i++)
1502 if (g_hash_table_lookup (name_table, name))
1505 hosts->
hosts[i] = NULL;
1517 hosts->
count -= excluded;
1520 g_hash_table_destroy (name_table);
1552 gchar hostname[NI_MAXHOST];
1555 struct sockaddr_in sa;
1556 struct sockaddr_in6 sa6;
1564 addrlen =
sizeof (sa);
1565 memset (addr,
'\0', addrlen);
1566 sa.sin_addr = host->
addr;
1567 sa.sin_family = AF_INET;
1572 addrlen =
sizeof (sa6);
1573 memset (&sa6,
'\0', addrlen);
1574 memcpy (&sa6.sin6_addr, &host->
addr6, 16);
1575 sa6.sin6_family = AF_INET6;
1582 int ret = getnameinfo (addr, addrlen, hostname,
sizeof (hostname), NULL,
1585 return g_ascii_strdown (hostname, -1);
1586 if (ret != EAI_AGAIN)
1613 char buffer[INET6_ADDRSTRLEN];
1615 if (!strcasecmp (host_str, buffer))
1623 g_slist_free_full (list, g_free);
1654 if (!strcasecmp (((
gvm_vhost_t *) vhosts->data)->value, value))
1659 vhosts = vhosts->next;
1677 size_t i, count = 0;
1682 for (i = 0; i < hosts->
count; i++)
1689 hosts->
hosts[i] = NULL;
1698 hosts->
count -= count;
1719 size_t i, count = 0;
1720 GHashTable *name_table;
1725 name_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
1726 for (i = 0; i < hosts->
count; i++)
1732 if (g_hash_table_lookup (name_table, name))
1735 hosts->
hosts[i] = NULL;
1742 g_hash_table_insert (name_table, name, hosts);
1749 g_hash_table_destroy (name_table);
1751 hosts->
count -= count;
1766 return hosts ? hosts->
count : 0;
1780 return hosts ? hosts->
removed : 0;
1802 if (host == NULL || hosts == NULL)
1807 for (i = 0; i < hosts->
count; i++)
1812 if (strcasecmp (host_str, tmp) == 0)
1823 struct in6_addr tmpaddr;
1826 if (memcmp (addr->s6_addr, &tmpaddr.s6_addr, 16) == 0)
1885 return g_strdup (host->
name);
1893 const void *srcaddr;
1898 size = INET_ADDRSTRLEN;
1899 srcaddr = &host->
addr;
1904 size = INET6_ADDRSTRLEN;
1905 srcaddr = &host->
addr6;
1908 str = g_malloc0 (size);
1909 if (inet_ntop (family, srcaddr, str, size) == NULL)
1911 perror (
"inet_ntop");
1918 return g_strdup (
"Erroneous host type: Should be Hostname/IPv4/IPv6.");
1957 if (host == NULL || ip6 == NULL)
1963 memcpy (ip6, &host->
addr6, sizeof (
struct in6_addr));