diff --git a/one.cpp b/one.cpp index f582f94f9..d8a53dcd4 100644 --- a/one.cpp +++ b/one.cpp @@ -47,6 +47,11 @@ #include #include #include +#include +#include +#include +#include +#include #ifndef ZT_NO_CAPABILITIES #include #include @@ -1044,9 +1049,81 @@ static int cli(int argc,char **argv) free(addresses); addresses = NULL; } +#elif defined(__LINUX__) + struct ifreq ifr; + struct ifconf ifc; + char buf[1024]; + char stringBuffer[128]; + int success = 0; + + int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); + + ifc.ifc_len = sizeof(buf); + ifc.ifc_buf = buf; + ioctl(sock, SIOCGIFCONF, &ifc); + + struct ifreq *it = ifc.ifc_req; + const struct ifreq * const end = it + (ifc.ifc_len / sizeof(struct ifreq)); + int count = 0; + for(; it != end; ++it) { + strcpy(ifr.ifr_name, it->ifr_name); + if(ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) { + if (!(ifr.ifr_flags & IFF_LOOPBACK)) { // skip loopback + dump << "Interface " << count++ << ZT_EOL_S << "-----------" << ZT_EOL_S; + dump << "Name: " << ifr.ifr_name << ZT_EOL_S; + if (ioctl(sock, SIOCGIFMTU, &ifr) == 0) { + dump << "MTU: " << ifr.ifr_mtu << ZT_EOL_S; + } + if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) { + unsigned char mac_addr[6]; + memcpy(mac_addr, ifr.ifr_hwaddr.sa_data, 6); + char macStr[16]; + sprintf(macStr, "%02x:%02x:%02x:%02x:%02x:%02x", + mac_addr[0], + mac_addr[1], + mac_addr[2], + mac_addr[3], + mac_addr[4], + mac_addr[5]); + dump << "MAC: " << macStr << ZT_EOL_S; + } + + dump << "Addresses: " << ZT_EOL_S; + struct ifaddrs *ifap, *ifa; + void *addr; + getifaddrs(&ifap); + for(ifa = ifap; ifa; ifa = ifa->ifa_next) { + if(strcmp(ifr.ifr_name, ifa->ifa_name) == 0) { + if(ifa->ifa_addr->sa_family == AF_INET) { + struct sockaddr_in *ipv4 = (struct sockaddr_in*)ifa->ifa_addr; + addr = &ipv4->sin_addr; + } else if (ifa->ifa_addr->sa_family == AF_INET6) { + struct sockaddr_in6 *ipv6 = (struct sockaddr_in6*)ifa->ifa_addr; + addr = &ipv6->sin6_addr; + } else { + continue; + } + inet_ntop(ifa->ifa_addr->sa_family, addr, stringBuffer, sizeof(stringBuffer)); + dump << stringBuffer << ZT_EOL_S; + } + } + } + } + } + close(sock); + char cwd[PATH_MAX]; + getcwd(cwd, sizeof(cwd)); + sprintf(cwd, "%s%szerotier_dump.txt", cwd, ZT_PATH_SEPARATOR_S); + fprintf(stdout, "Writing dump to: %s\n", cwd); + int fd = open(cwd, O_CREAT|O_RDWR,0664); + if (fd == -1) { + fprintf(stderr, "Error creating file.\n"); + } + write(fd, dump.str().c_str(), dump.str().size()); + close(fd); #endif - fprintf(stderr, "%s\n", dump.str().c_str()); + // fprintf(stderr, "%s\n", dump.str().c_str()); } else { cliPrintHelp(argv[0],stderr);