Browse Source

OS_MAC: ifconfig

hewei.it 5 years ago
parent
commit
6281e8f997
6 changed files with 73 additions and 16 deletions
  1. 1 1
      CMakeLists.txt
  2. 0 1
      base/hbase.c
  3. 62 7
      base/ifconfig.cpp
  4. 6 4
      base/ifconfig.h
  5. 2 2
      hconfig.h
  6. 2 1
      unittest/ifconfig_test.cpp

+ 1 - 1
CMakeLists.txt

@@ -30,8 +30,8 @@ include(vars)
 
 # see configure
 # Checks for header files
-check_header("stdint.h")
 check_header("stdbool.h")
+check_header("stdint.h")
 check_header("sys/types.h")
 check_header("sys/stat.h")
 check_header("sys/time.h")

+ 0 - 1
base/hbase.c

@@ -6,7 +6,6 @@
 
 #ifdef OS_DARWIN
 #include <mach-o/dyld.h> // for _NSGetExecutablePath
-#define environ (*_NSGetEnviron())
 #endif
 
 unsigned int g_alloc_cnt = 0;

+ 62 - 7
base/ifconfig.cpp

@@ -42,7 +42,6 @@ int ifconfig(std::vector<ifconfig_t>& ifcs) {
     struct ifreq ifr;
     ifcs.clear();
     ifconfig_t tmp;
-    char macaddr[32] = {'\0'};
     for (int i = 0; i < cnt; ++i) {
         // name
         strcpy(ifr.ifr_name, ifc.ifc_req[i].ifr_name);
@@ -64,21 +63,21 @@ int ifconfig(std::vector<ifconfig_t>& ifcs) {
         //printf("netmask: %s\n", netmask);
         strncpy(tmp.mask, netmask, sizeof(tmp.mask));
         // broadaddr
-        //iRet = ioctl(sock, SIOCGIFBRDADDR, &ifr);
-        //addr = (struct sockaddr_in*)&ifr.ifr_broadaddr;
-        //char* broadaddr = inet_ntoa(addr->sin_addr);
+        iRet = ioctl(sock, SIOCGIFBRDADDR, &ifr);
+        addr = (struct sockaddr_in*)&ifr.ifr_broadaddr;
+        char* broadaddr = inet_ntoa(addr->sin_addr);
         //printf("broadaddr: %s\n", broadaddr);
+        strncpy(tmp.broadcast, broadaddr, sizeof(tmp.broadcast));
         // hwaddr
         iRet = ioctl(sock, SIOCGIFHWADDR, &ifr);
-        snprintf(macaddr, sizeof(macaddr), "%02x:%02x:%02x:%02x:%02x:%02x",
+        snprintf(tmp.mac, sizeof(tmp.mac), "%02x:%02x:%02x:%02x:%02x:%02x",
             (unsigned char)ifr.ifr_hwaddr.sa_data[0],
             (unsigned char)ifr.ifr_hwaddr.sa_data[1],
             (unsigned char)ifr.ifr_hwaddr.sa_data[2],
             (unsigned char)ifr.ifr_hwaddr.sa_data[3],
             (unsigned char)ifr.ifr_hwaddr.sa_data[4],
             (unsigned char)ifr.ifr_hwaddr.sa_data[5]);
-        //printf("mac: %s\n", macaddr);
-        strncpy(tmp.mac, macaddr, sizeof(tmp.mac));
+        //printf("mac: %s\n", tmp.mac);
         //printf("\n");
 
         if (strcmp(tmp.ip, "0.0.0.0") == 0 ||
@@ -168,6 +167,62 @@ int ifconfig(std::vector<ifconfig_t>& ifcs) {
 
     return 0;
 }
+#elif defined(OS_MAC)
+#include <ifaddrs.h>
+#include <net/if_dl.h>
+int ifconfig(std::vector<ifconfig_t>& ifcs) {
+    struct ifaddrs *ifas, *ifap;
+    int ret = getifaddrs(&ifas);
+    if (ret != 0) return ret;
+    ifconfig_s tmp;
+    for (ifap = ifas; ifap != NULL; ifap = ifap->ifa_next) {
+        if (ifap->ifa_addr->sa_family == AF_INET) {
+            // ipv4
+            struct sockaddr_in* addr = (struct sockaddr_in*)ifap->ifa_addr;
+            char* ip = inet_ntoa(addr->sin_addr);
+            // filter
+            if (strcmp(ip, "0.0.0.0") == 0 || strcmp(ip, "127.0.0.1") == 0) {
+                continue;
+            }
+            memset(&tmp, 0, sizeof(tmp));
+            strncpy(tmp.name, ifap->ifa_name, sizeof(tmp.name));
+            strncpy(tmp.ip, ip, sizeof(tmp.ip));
+            // netmask
+            addr = (struct sockaddr_in*)ifap->ifa_netmask;
+            char* netmask = inet_ntoa(addr->sin_addr);
+            strncpy(tmp.mask, netmask, sizeof(tmp.mask));
+            // broadaddr
+            addr = (struct sockaddr_in*)ifap->ifa_broadaddr;
+            char* broadaddr = inet_ntoa(addr->sin_addr);
+            strncpy(tmp.broadcast, broadaddr, sizeof(tmp.broadcast));
+            // push_back
+            ifcs.push_back(tmp);
+        }
+    }
+
+    for (ifap = ifas; ifap != NULL; ifap = ifap->ifa_next) {
+        if (ifap->ifa_addr->sa_family == AF_LINK) {
+            // hwaddr
+            for (auto iter = ifcs.begin(); iter != ifcs.end(); ++iter) {
+                if (strcmp(iter->name, ifap->ifa_name) == 0) {
+                    struct sockaddr_dl* addr = (struct sockaddr_dl*)ifap->ifa_addr;
+                    unsigned char* pmac = (unsigned char*)LLADDR(addr);
+                    snprintf(iter->mac, sizeof(iter->mac), "%02x:%02x:%02x:%02x:%02x:%02x",
+                        pmac[0], pmac[1], pmac[2], pmac[3], pmac[4], pmac[5]);
+                    // filter
+                    if (strcmp(iter->mac, "00:00:00:00:00:00") == 0) {
+                        ifcs.erase(iter);
+                    }
+                    break;
+                }
+            }
+        }
+    }
+
+    freeifaddrs(ifas);
+    return 0;
+}
+
 #else
 int ifconfig(std::vector<ifconfig_t>& ifcs) {
     return -10; // unimplemented

+ 6 - 4
base/ifconfig.h

@@ -5,9 +5,10 @@
 
 typedef struct ifconfig_s {
     char name[128];
-    char ip[32];
-    char mask[32];
-    char mac[32];
+    char ip[16];
+    char mask[16];
+    char broadcast[16];
+    char mac[20];
 } ifconfig_t;
 
 /*
@@ -15,10 +16,11 @@ typedef struct ifconfig_s {
     std::vector<ifconfig_t> ifcs;
     ifconfig(ifcs);
     for (auto& item : ifcs) {
-        printf("%s\nip: %s\nmask: %s\nmac: %s\n\n",
+        printf("%s\nip: %s\nmask: %s\nbroadcast: %s\nmac: %s\n\n",
                 item.name,
                 item.ip,
                 item.mask,
+                item.broadcast,
                 item.mac);
     }
  */

+ 2 - 2
hconfig.h

@@ -34,11 +34,11 @@
 #endif
 
 #ifndef HAVE_STRLCPY
-#define HAVE_STRLCPY 0
+#define HAVE_STRLCPY 1
 #endif
 
 #ifndef HAVE_STRLCAT
-#define HAVE_STRLCAT 0
+#define HAVE_STRLCAT 1
 #endif
 
 #ifndef HAVE_CLOCK_GETTIME

+ 2 - 1
unittest/ifconfig_test.cpp

@@ -6,10 +6,11 @@ int main() {
     std::vector<ifconfig_t> ifcs;
     ifconfig(ifcs);
     for (auto& item : ifcs) {
-        printf("%s\nip: %s\nmask: %s\nmac: %s\n\n",
+        printf("%s\nip: %s\nmask: %s\nbroadcast: %s\nmac: %s\n\n",
                 item.name,
                 item.ip,
                 item.mask,
+                item.broadcast,
                 item.mac);
     }
     return 0;