27 #include <arpa/inet.h>
31 #include <glib/gstdio.h>
37 #include <sys/socket.h>
41 #include <netinet/in.h>
42 #define s6_addr32 __u6_addr.__u6_addr32
68 struct ifaddrs *ifaddr, *ifa;
78 if (getifaddrs (&ifaddr) == -1)
82 for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
84 if (ifa->ifa_addr && strcmp (iface, ifa->ifa_name) == 0)
86 if (ifa->ifa_addr->sa_family == AF_INET)
88 struct in_addr *addr =
89 &((
struct sockaddr_in *) ifa->ifa_addr)->sin_addr;
94 else if (ifa->ifa_addr->sa_family == AF_INET6)
96 struct sockaddr_in6 *addr;
98 addr = (
struct sockaddr_in6 *) ifa->ifa_addr;
100 sizeof (
struct in6_addr));
110 freeifaddrs (ifaddr);
137 if (family == AF_INET)
139 struct sockaddr_in addr;
141 bzero (&addr,
sizeof (addr));
143 addr.sin_port = htons (port);
144 addr.sin_family = AF_INET;
146 if (bind (socket, (
struct sockaddr *) &addr,
sizeof (addr)) < 0)
149 else if (family == AF_INET6)
151 struct sockaddr_in6 addr6;
153 bzero (&addr6,
sizeof (addr6));
155 addr6.sin6_port = htons (port);
156 addr6.sin6_family = AF_INET6;
158 if (bind (socket, (
struct sockaddr *) &addr6,
sizeof (addr6)) < 0)
212 char *str = g_malloc0 (INET_ADDRSTRLEN);
226 char *str = g_malloc0 (INET6_ADDRSTRLEN);
244 if (ip4 == NULL || ip6 == NULL)
247 ip6->s6_addr32[0] = 0;
248 ip6->s6_addr32[1] = 0;
249 ip6->s6_addr32[2] = htonl (0xffff);
250 memcpy (&ip6->s6_addr32[3], ip4, sizeof (
struct in_addr));
264 if (IN6_IS_ADDR_V4MAPPED (addr6))
265 inet_ntop (AF_INET, &addr6->s6_addr32[3], str, INET6_ADDRSTRLEN);
267 inet_ntop (AF_INET6, addr6, str, INET6_ADDRSTRLEN);
285 str = g_malloc0 (INET6_ADDRSTRLEN);
302 if (addr->ss_family == AF_INET)
304 struct sockaddr_in *saddr = (
struct sockaddr_in *) addr;
305 inet_ntop (AF_INET, &saddr->sin_addr, str, INET6_ADDRSTRLEN);
307 else if (addr->ss_family == AF_INET6)
309 struct sockaddr_in6 *s6addr = (
struct sockaddr_in6 *) addr;
310 if (IN6_IS_ADDR_V4MAPPED (&s6addr->sin6_addr))
311 inet_ntop (AF_INET, &s6addr->sin6_addr.s6_addr[12], str,
314 inet_ntop (AF_INET6, &s6addr->sin6_addr, str, INET6_ADDRSTRLEN);
316 else if (addr->ss_family == AF_UNIX)
318 g_snprintf (str, INET6_ADDRSTRLEN,
"unix_socket");
320 else if (addr->ss_family == AF_UNSPEC)
322 g_snprintf (str, INET6_ADDRSTRLEN,
"unknown_socket");
326 g_snprintf (str, INET6_ADDRSTRLEN,
"type_%d_socket", addr->ss_family);
340 struct addrinfo hints, *info, *p;
346 bzero (&hints,
sizeof (hints));
347 hints.ai_family = AF_UNSPEC;
348 hints.ai_socktype = SOCK_STREAM;
349 hints.ai_protocol = 0;
350 if ((getaddrinfo (name, NULL, &hints, &info)) != 0)
358 if (p->ai_family == AF_INET)
360 struct sockaddr_in *addrin = (
struct sockaddr_in *) p->ai_addr;
362 list = g_slist_prepend (list, g_memdup (&dst,
sizeof (dst)));
364 else if (p->ai_family == AF_INET6)
366 struct sockaddr_in6 *addrin = (
struct sockaddr_in6 *) p->ai_addr;
367 memcpy (&dst, &(addrin->sin6_addr),
sizeof (
struct in6_addr));
368 list = g_slist_prepend (list, g_memdup (&dst,
sizeof (dst)));
390 struct addrinfo hints, *info, *p;
392 if (name == NULL || dst == NULL
393 || (family != AF_INET && family != AF_INET6 && family != AF_UNSPEC))
396 bzero (&hints,
sizeof (hints));
397 hints.ai_family = family;
398 hints.ai_socktype = SOCK_STREAM;
399 hints.ai_protocol = 0;
400 if ((getaddrinfo (name, NULL, &hints, &info)) != 0)
406 if (p->ai_family == family || family == AF_UNSPEC)
408 if (p->ai_family == AF_INET && family == AF_UNSPEC)
410 struct sockaddr_in *addrin = (
struct sockaddr_in *) p->ai_addr;
413 else if (p->ai_family == AF_INET)
415 struct sockaddr_in *addrin = (
struct sockaddr_in *) p->ai_addr;
416 memcpy (dst, &(addrin->sin_addr),
sizeof (
struct in_addr));
418 else if (p->ai_family == AF_INET6)
420 struct sockaddr_in6 *addrin = (
struct sockaddr_in6 *) p->ai_addr;
421 memcpy (dst, &(addrin->sin6_addr),
sizeof (
struct in6_addr));
461 gchar **split, **point, *
range, *range_start;
466 while (*port_range && isblank (*port_range))
468 if (*port_range ==
'\0')
472 range = range_start = g_strdup (port_range);
480 split = g_strsplit (range_start,
",", 0);
481 g_free (range_start);
486 gchar *hyphen, *element;
490 element = g_strstrip (*point);
494 if ((strlen (element) >= 2)
495 && ((element[0] ==
'T') || (element[0] ==
'U'))
496 && (element[1] ==
':'))
497 element = element + 2;
501 hyphen = strchr (element,
'-');
504 long int number1, number2;
513 while (*first && isblank (*first))
519 number1 = strtol (first, &end, 10);
520 while (*end && isblank (*end))
522 if (errno || (*end !=
'-'))
531 while (*hyphen && isblank (*hyphen))
537 number2 = strtol (hyphen, &end, 10);
538 while (*end && isblank (*end))
547 if (number1 > number2)
559 while (*only && isblank (*only))
565 number = strtol (only, &end, 10);
566 while (*end && isblank (*end))
597 gchar **split, **point, *range_start, *current;
606 while (*port_range && isblank (*port_range))
614 range_start = current = g_strdup (port_range);
617 if (*current ==
'\n')
623 split = g_strsplit (range_start,
",", 0);
624 g_free (range_start);
629 gchar *hyphen, *element;
632 element = g_strstrip (*point);
633 if (strlen (element) >= 2)
635 if ((element[0] ==
'T') && (element[1] ==
':'))
638 element = element + 2;
640 else if ((element[0] ==
'U') && (element[1] ==
':'))
643 element = element + 2;
649 while (*element && isblank (*element))
652 hyphen = strchr (element,
'-');
657 while (*hyphen && isblank (*hyphen))
706 if (pranges == NULL || pnum < 0 || pnum > 65536)
709 for (i = 0; i < pranges->len; i++)
714 if (
range->
start <= pnum && pnum <= range->end)
728 int sock = socket (PF_INET6, SOCK_STREAM, 0);
732 if (errno == EAFNOSUPPORT)