117 int i, j, ifaces, numroutes = 0;
120 struct in6_addr network, mask;
125 if (IN6_IS_ADDR_V4MAPPED (addr))
127 for (i = 0; i < ifaces; i++)
129 int if_net = ifs[i].
mask.s6_addr32[3] & ifs[i].
addr6.s6_addr32[3];
130 int addr_net = addr->s6_addr32[3] & ifs[i].
mask.s6_addr32[3];
131 g_debug (
"iface %s", ifs[i].
name);
136 if (if_net == addr_net && addr_net)
142 if (IN6_IS_ADDR_LINKLOCAL (addr))
144 if (IN6_IS_ADDR_LOOPBACK (addr))
148 for (i = 0; i < numroutes; i++)
150 char addr1[INET6_ADDRSTRLEN];
151 char addr2[INET6_ADDRSTRLEN];
155 for (j = 0; j < (int)
sizeof (
struct in6_addr); j++)
156 network.s6_addr[j] = addr->s6_addr[j] & mask.s6_addr[j];
158 g_debug (
"comparing addresses %s and %s",
159 inet_ntop (AF_INET6, &network, addr1,
sizeof (addr1)),
160 inet_ntop (AF_INET6, &myroutes[i].dest6, addr2,
162 if (IN6_ARE_ADDR_EQUAL (&network, &myroutes[i].dest6))
340 struct sockaddr_in *
saddr;
341 struct sockaddr_in6 *
s6addr;
343 int numinterfaces = 0;
344 struct ifaddrs *ifaddr, *ifa;
347 if (getifaddrs (&ifaddr) == -1)
349 perror (
"getifaddrs");
353 for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
355 if (ifa->ifa_addr == NULL)
358 family = ifa->ifa_addr->sa_family;
359 if (family == AF_INET)
361 strncpy (mydevs[numinterfaces].
name, ifa->ifa_name,
362 sizeof (mydevs[numinterfaces].
name) - 1);
363 saddr = (
struct sockaddr_in *) ifa->ifa_addr;
364 g_debug (
"interface name is %s", ifa->ifa_name);
365 g_debug (
"\tAF_INET family");
366 g_debug (
"\taddress is %s", inet_ntoa (
saddr->sin_addr));
367 mydevs[numinterfaces].
addr6.s6_addr32[0] = 0;
368 mydevs[numinterfaces].
addr6.s6_addr32[1] = 0;
369 mydevs[numinterfaces].
addr6.s6_addr32[2] = htonl (0xffff);
370 mydevs[numinterfaces].
addr6.s6_addr32[3] =
saddr->sin_addr.s_addr;
371 saddr = (
struct sockaddr_in *) ifa->ifa_netmask;
372 mydevs[numinterfaces].
mask.s6_addr32[0] = 0;
373 mydevs[numinterfaces].
mask.s6_addr32[1] = 0;
374 mydevs[numinterfaces].
mask.s6_addr32[2] = htonl (0xffff);
375 mydevs[numinterfaces].
mask.s6_addr32[3] =
saddr->sin_addr.s_addr;
376 g_debug (
"\tnetmask is %s", inet_ntoa (
saddr->sin_addr));
379 else if (family == AF_INET6)
381 char ipaddr[INET6_ADDRSTRLEN];
383 strncpy (mydevs[numinterfaces].
name, ifa->ifa_name,
384 sizeof (mydevs[numinterfaces].
name) - 1);
385 s6addr = (
struct sockaddr_in6 *) ifa->ifa_addr;
386 memcpy (&(mydevs[numinterfaces].addr6),
387 (
char *) &(
s6addr->sin6_addr), sizeof (
struct in6_addr));
388 s6addr = (
struct sockaddr_in6 *) ifa->ifa_netmask;
389 memcpy (&(mydevs[numinterfaces].mask),
390 (
char *) &(
s6addr->sin6_addr), sizeof (
struct in6_addr));
392 g_debug (
"\tAF_INET6 family");
393 g_debug (
"interface name is %s", ifa->ifa_name);
394 g_debug (
"\taddress is %s",
395 inet_ntop (AF_INET6, &
s6addr->sin6_addr, ipaddr,
399 g_debug (
"\tfamily is %d", ifa->ifa_addr->sa_family);
401 *howmany = numinterfaces;
403 freeifaddrs (ifaddr);
416 int numinterfaces = 0;
423 struct sockaddr_in *sin;
427 sd = socket (AF_INET, SOCK_DGRAM, 0);
428 bzero (buf,
sizeof (buf));
431 g_message (
"socket in getinterfaces");
435 ifc.ifc_len =
sizeof (buf);
437 if (ioctl (sd, SIOCGIFCONF, &ifc) < 0)
438 g_message (
"Failed to determine your configured interfaces!");
441 if (ifc.ifc_len == 0)
443 "getinterfaces: SIOCGIFCONF claims you have no network interfaces!");
446 len =
sizeof (
struct ifmap);
448 len =
sizeof (
struct sockaddr);
451 for (bufp = buf; bufp && *bufp && (bufp < (buf + ifc.ifc_len));
452 bufp +=
sizeof (ifr->ifr_name) +
len)
454 ifr = (
struct ifreq *) bufp;
455 sin = (
struct sockaddr_in *) &ifr->ifr_addr;
456 memcpy (&(mydevs[numinterfaces].addr), (
char *) &(sin->sin_addr),
457 sizeof (
struct in_addr));
459 if ((p = strchr (ifr->ifr_name,
':')))
464 memcpy (mydevs[numinterfaces].
name, ifr->ifr_name,
465 strlen (ifr->ifr_name));
467 memcpy (mydevs[numinterfaces].
name, ifr->ifr_name,
470 if (numinterfaces == 1023)
472 g_message (
"You seem to have more than 1023 network interfaces."
473 " Things may not work right.");
476 mydevs[numinterfaces].
name[0] =
'\0';
481 *howmany = numinterfaces;
490 struct sockaddr_in sock;
491 unsigned int socklen;
494 p1 = (
unsigned short) rand ();
498 if (IN6_IS_ADDR_V4MAPPED (dst))
500 char name[INET6_ADDRSTRLEN];
502 if ((sd = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
504 perror (
"Socket troubles");
507 bzero (&sock,
sizeof (
struct sockaddr_in));
508 sock.sin_family = AF_INET;
509 sock.sin_addr.s_addr = dst->s6_addr32[3];
510 sock.sin_port = htons (p1);
511 if (connect (sd, (
struct sockaddr *) &sock,
sizeof (
struct sockaddr_in))
517 bzero (&sock,
sizeof (
struct sockaddr_in));
518 socklen =
sizeof (
struct sockaddr_in);
519 if (getsockname (sd, (
struct sockaddr *) &sock, &socklen) == -1)
521 perror (
"getsockname");
526 src->s6_addr32[0] = 0;
527 src->s6_addr32[1] = 0;
528 src->s6_addr32[2] = htonl (0xffff);
529 src->s6_addr32[3] = sock.sin_addr.s_addr;
530 g_debug (
"source address is %s",
531 inet_ntop (AF_INET6, src,
name,
sizeof (
name)));
536 struct sockaddr_in6 sock6;
537 char name[INET6_ADDRSTRLEN];
539 if ((sd = socket (AF_INET6, SOCK_DGRAM, 0)) == -1)
541 perror (
"Socket troubles");
544 bzero (&sock6,
sizeof (sock6));
545 sock6.sin6_family = AF_INET6;
546 sock6.sin6_addr.s6_addr32[0] = dst->s6_addr32[0];
547 sock6.sin6_addr.s6_addr32[1] = dst->s6_addr32[1];
548 sock6.sin6_addr.s6_addr32[2] = dst->s6_addr32[2];
549 sock6.sin6_addr.s6_addr32[3] = dst->s6_addr32[3];
550 sock6.sin6_port = htons (p1);
551 if (connect (sd, (
struct sockaddr *) &sock6,
sizeof (
struct sockaddr_in6))
557 bzero (&sock6,
sizeof (
struct sockaddr_in6));
558 socklen =
sizeof (
struct sockaddr_in6);
559 if (getsockname (sd, (
struct sockaddr *) &sock6, &socklen) == -1)
561 perror (
"getsockname");
566 src->s6_addr32[0] = sock6.sin6_addr.s6_addr32[0];
567 src->s6_addr32[1] = sock6.sin6_addr.s6_addr32[1];
568 src->s6_addr32[2] = sock6.sin6_addr.s6_addr32[2];
569 src->s6_addr32[3] = sock6.sin6_addr.s6_addr32[3];
570 memcpy (src, &sock6.sin6_addr, sizeof (
struct in6_addr));
571 g_debug (
"source addrss is %s",
572 inet_ntop (AF_INET6, src,
name,
sizeof (
name)));
601 struct in_addr inaddr;
609 routez = fopen (
"/proc/net/route",
"r");
615 if (fgets (buf,
sizeof (buf), routez) == NULL)
618 g_message (
"Could not read from /proc/net/route");
622 while (fgets (buf,
sizeof (buf), routez))
624 p = strtok (buf,
" \t\n");
627 g_message (
"Could not find interface in"
628 " /proc/net/route line");
631 strncpy (iface, p,
sizeof (iface));
633 if ((p = strchr (iface,
':')))
637 p = strtok (NULL,
" \t\n");
639 dest = strtoul (p, &endptr, 16);
640 g_debug (
"ipv4 dest is %s", p);
641 if (!endptr || *endptr)
643 g_message (
"Failed to determine Destination from"
647 inaddr.s_addr = dest;
648 myroutes[*numroutes].
dest6.s6_addr32[0] = 0;
649 myroutes[*numroutes].
dest6.s6_addr32[1] = 0;
650 myroutes[*numroutes].
dest6.s6_addr32[2] = htonl (0xffff);
651 myroutes[*numroutes].
dest6.s6_addr32[3] = inaddr.s_addr;
652 for (i = 0; i < 5; i++)
654 p = strtok (NULL,
" \t\n");
660 g_message (
"Failed to find field %d in"
667 myroutes[*numroutes].
metric = strtol (p, &endptr, 10);
668 if (!endptr || *endptr)
670 g_message (
"%s: Failed to determine metric from /proc/net/route",
674 p = strtok (NULL,
" \t\n");
676 mask = strtoul (p, &endptr, 16);
679 while (mask & (1 << i++) && i < 32)
681 myroutes[*numroutes].
mask = ones + 96;
682 g_debug (
"mask is %lu", myroutes[*numroutes].mask);
683 if (!endptr || *endptr)
685 g_message (
"Failed to determine mask from"
690 g_debug (
"#%d: for dev %s, The dest is %lX and the mask is %lX",
691 *numroutes, iface, myroutes[*numroutes].dest,
692 myroutes[*numroutes].mask);
693 for (i = 0; i < numinterfaces; i++)
694 if (!strcmp (iface, mydevs[i].
name))
696 myroutes[*numroutes].
dev = &mydevs[i];
699 if (i == numinterfaces)
701 "Failed to find interface %s mentioned in /proc/net/route",
706 g_message (
"You seem to have WAY to many routes!");
734 struct in6_addr in6addr;
740 char v6addr[INET6_ADDRSTRLEN];
746 routez = fopen (
"/proc/net/ipv6_route",
"r");
750 while (fgets (buf,
sizeof (buf), routez) != NULL)
754 token = strtok (buf,
" \t\n");
757 g_debug (
"first token is %s", token);
758 strncpy (destaddr, token,
sizeof (destaddr) - 1);
759 len = strlen (destaddr);
760 for (i = 0, j = 0; j <
len; j++)
762 v6addr[i++] = destaddr[j];
767 g_debug (
"ipv6 dest is %s", v6addr);
768 if (inet_pton (AF_INET6, v6addr, &in6addr) <= 0)
770 g_message (
"invalid ipv6 addressd");
773 memcpy (&myroutes[*numroutes].dest6, &in6addr,
774 sizeof (
struct in6_addr));
776 token = strtok (NULL,
" \t\n");
780 myroutes[*numroutes].
mask = strtoul (token, &endptr, 16);
787 token = strtok (NULL,
" \t\n");
789 g_message (
"getipv6routes error");
792 myroutes[*numroutes].
metric = strtoul (token, &endptr, 16);
793 if (!endptr || *endptr)
796 "%s: Failed to determine metric from /proc/net/ipv6_route",
805 token = strtok (NULL,
" \t\n");
807 g_message (
"getipv6routes error");
809 bzero (iface,
sizeof (iface));
810 token = strtok (NULL,
" \t\n");
812 strncpy (iface, token,
sizeof (iface) - 1);
813 for (i = 0; i < numinterfaces; i++)
814 if (!strcmp (iface, mydevs[i].
name)
815 && !IN6_IS_ADDR_V4MAPPED (&mydevs[i].addr6))
817 myroutes[*numroutes].
dev = &mydevs[i];
820 if (i == numinterfaces)
822 "Failed to find interface %s mentioned in /proc/net/ipv6_route",
827 g_message (
"You seem to have WAY to many routes!");
836 g_message (
"Didn't find IPv6 routes");
853 static int initialized = 0;
855 struct in6_addr addy;
858 connectsockettechnique,
860 } technique = procroutetechnique;
863 int numinterfaces = 0;
864 static int numroutes = 0;
865 struct in6_addr mask;
866 struct in6_addr network = {0};
868 long best_match = -1;
872 g_message (
"ipaddr2devname passed a NULL dest address");
876 if (IN6_IS_ADDR_V4MAPPED (dest))
877 gvm_source_addr_as_addr6 (&src);
879 gvm_source_addr6 (&src);
886 if (IN6_IS_ADDR_V4MAPPED (dest))
889 technique = connectsockettechnique;
894 technique = connectsockettechnique;
907 if (IN6_IS_ADDR_V4MAPPED (source))
909 source->s6_addr32[0] = 0;
910 source->s6_addr32[1] = 0;
911 source->s6_addr32[2] = htonl (0xffff);
912 source->s6_addr32[3] = htonl (0x7F000001);
916 source->s6_addr32[0] = 0;
917 source->s6_addr32[1] = 0;
918 source->s6_addr32[2] = 0;
919 source->s6_addr32[3] = htonl (1);
924 for (i = 0; i < numinterfaces; i++)
926 if (IN6_IS_ADDR_V4MAPPED (&mydevs[i].addr6))
928 if (mydevs[i].addr6.s6_addr32[3] == htonl (0x7F000001))
929 return mydevs[i].
name;
933 if (IN6_ARE_ADDR_EQUAL (&in6addr_any, &mydevs[i].addr6))
934 return mydevs[i].
name;
940 if (technique == procroutetechnique)
942 char addr1[INET6_ADDRSTRLEN];
943 char addr2[INET6_ADDRSTRLEN];
944 for (i = 0; i < numroutes; i++)
948 g_warning (
"error creating IPv6 mask from prefix: %ld",
952 for (
int j = 0; j < (int)
sizeof (
struct in6_addr); j++)
953 network.s6_addr[j] = dest->s6_addr[j] & mask.s6_addr[j];
956 "comparing addresses %s and %s",
957 inet_ntop (AF_INET6, &network, addr1,
sizeof (addr1)),
958 inet_ntop (AF_INET6, &myroutes[i].dest6, addr2,
sizeof (addr2)));
960 if (IN6_ARE_ADDR_EQUAL (&network, &myroutes[i].dest6))
963 if (-1 == best_match)
970 if (myroutes[i].mask > myroutes[best_match].mask)
975 else if ((myroutes[i].mask == myroutes[best_match].mask)
976 && (myroutes[i].metric
977 < myroutes[best_match].metric))
986 if (!IN6_ARE_ADDR_EQUAL (&src, &in6addr_any))
987 memcpy (source, &src,
sizeof (
struct in6_addr));
990 if (myroutes[best_match].dev != NULL)
992 memcpy (source, &myroutes[best_match].dev->addr6,
993 sizeof (
struct in6_addr));
998 "%s: Best matching route with dst '%s' metric '%ld' and interface '%s'",
1000 inet_ntop (AF_INET6, &myroutes[best_match].dest6, addr1,
1002 myroutes[best_match].mask, myroutes[best_match].dev->name);
1003 if (best_match != -1)
1004 return myroutes[best_match].
dev->
name;
1006 technique = connectsockettechnique;
1008 if (technique == connectsockettechnique)
1012 if (IN6_ARE_ADDR_EQUAL (&addy, &network))
1014 struct hostent *myhostent = NULL;
1015 char myname[MAXHOSTNAMELEN + 1];
1017 myhostent = gethostbyname (myname);
1018 if (gethostname (myname, MAXHOSTNAMELEN) || !myhostent)
1019 g_message (
"Cannot get hostname!");
1020 else if (myhostent->h_addrtype == AF_INET)
1022 addy.s6_addr32[0] = 0;
1023 addy.s6_addr32[1] = 0;
1024 addy.s6_addr32[2] = htonl (0xffff);
1025 memcpy (&addy.s6_addr32[0], myhostent->h_addr_list[0],
1026 sizeof (
struct in6_addr));
1029 memcpy (&addy, myhostent->h_addr_list[0], sizeof (
struct in6_addr));
1033 for (i = 0; i < numinterfaces; i++)
1035 char addr1[INET6_ADDRSTRLEN];
1036 char addr2[INET6_ADDRSTRLEN];
1039 "comparing addresses %s and %s",
1040 inet_ntop (AF_INET6, &mydevs[i].addr6, addr1,
sizeof (addr1)),
1041 inet_ntop (AF_INET6, &addy, addr2,
sizeof (addr2)));
1042 if (IN6_ARE_ADDR_EQUAL (&mydevs[i].addr6, &addy))
1046 memcpy (source, &addy,
sizeof (
struct in6_addr));
1048 return mydevs[i].
name;
1054 g_message (
"%s: Provided technique is neither proc route nor"
1072 static int initialized = 0;
1083 int numinterfaces = 0;
1086 static int numroutes = 0;
1088 long best_match = -1;
1092 gvm_source_addr (&src);
1095 g_message (
"ipaddr2devname passed a NULL dest address");
1107 routez = fopen (
"/proc/net/route",
"r");
1112 if (fgets (buf,
sizeof (buf), routez)
1114 g_message (
"Could not read from /proc/net/route");
1115 while (fgets (buf,
sizeof (buf), routez))
1117 p = strtok (buf,
" \t\n");
1120 g_message (
"Could not find interface in"
1121 " /proc/net/route line");
1124 strncpy (iface, p,
sizeof (iface));
1126 if ((p = strchr (iface,
':')))
1130 p = strtok (NULL,
" \t\n");
1132 myroutes[numroutes].dest = strtoul (p, &endptr, 16);
1133 if (!endptr || *endptr)
1136 "Failed to determine Destination from /proc/net/route");
1139 for (i = 0; i < 5; i++)
1141 p = strtok (NULL,
" \t\n");
1147 g_message (
"Failed to find field %d in"
1153 myroutes[numroutes].metric = strtol (p, &endptr, 10);
1154 if (!endptr || *endptr)
1156 g_message (
"Failed to determine metric from /proc/net/route");
1159 p = strtok (NULL,
" \t\n");
1161 myroutes[numroutes].mask = strtoul (p, &endptr, 16);
1162 if (!endptr || *endptr)
1164 g_message (
"Failed to determine mask"
1165 " from /proc/net/route");
1169 g_debug (
"#%d: for dev %s, The dest is %lX and the mask is %lX",
1170 numroutes, iface, myroutes[numroutes].dest,
1171 myroutes[numroutes].mask);
1172 for (i = 0; i < numinterfaces; i++)
1173 if (!strcmp (iface, mydevs[i].
name))
1175 myroutes[numroutes].dev = &mydevs[i];
1178 if (i == numinterfaces)
1180 "Failed to find interface %s mentioned in /proc/net/route",
1185 g_message (
"You seem to have WAY to many routes!");
1193 g_message (
"Could not read from /proc/net/route");
1204 source->s_addr = htonl (0x7F000001);
1207 for (i = 0; i < numinterfaces; i++)
1209 if (mydevs[i].addr.s_addr == htonl (0x7F000001))
1211 return mydevs[i].
name;
1217 for (i = 0; i < numroutes; i++)
1220 if ((dest->s_addr & myroutes[i].mask) == myroutes[i].dest)
1223 if (-1 == best_match)
1230 if (myroutes[i].mask > myroutes[best_match].mask)
1235 else if ((myroutes[i].mask == myroutes[best_match].mask)
1236 && (myroutes[i].metric < myroutes[best_match].metric))
1248 if (src.s_addr != INADDR_ANY)
1249 source->s_addr = src.s_addr;
1251 else if (best_match != -1)
1252 source->s_addr = myroutes[best_match].dev->addr.s_addr;
1257 if (myroutes[0].dev)
1259 source->s_addr = myroutes[0].dev->addr.s_addr;
1264 source->s_addr = INADDR_ANY;
1268 if (best_match != -1)
1269 return myroutes[best_match].dev->name;
1282 char errbuf[PCAP_ERRBUF_SIZE];
1283 pcap_if_t *alldevsp1 = NULL, *devs_aux = NULL;
1284 char *if_name = NULL;
1286 if (pcap_findalldevs (&alldevsp1, errbuf) == -1)
1287 g_debug (
"Error for pcap_findalldevs(): %s", errbuf);
1289 devs_aux = alldevsp1;
1292 pcap_addr_t *addr_aux = NULL;
1294 addr_aux = devs_aux->addresses;
1297 char buffer[INET6_ADDRSTRLEN];
1299 if (((
struct sockaddr *) addr_aux->addr)->sa_family == AF_INET)
1301 &(((
struct sockaddr_in *) addr_aux->addr)->sin_addr),
1302 buffer, INET_ADDRSTRLEN);
1303 else if (((
struct sockaddr *) addr_aux->addr)->sa_family == AF_INET6)
1304 inet_ntop (AF_INET6,
1305 &(((
struct sockaddr_in6 *) addr_aux->addr)->sin6_addr),
1306 buffer, INET6_ADDRSTRLEN);
1308 if (!g_strcmp0 (buffer, local_ip))
1310 if_name = g_strdup (devs_aux->name);
1313 addr_aux = addr_aux->next;
1318 devs_aux = devs_aux->next;
1320 pcap_freealldevs (alldevsp1);
1321 g_debug (
"returning %s as device", if_name);