os: add mac address to networkInterfaces() output
authorBrian White <mscdex@mscdex.net>
Wed, 31 Jul 2013 23:13:36 +0000 (19:13 -0400)
committerBen Noordhuis <info@bnoordhuis.nl>
Thu, 1 Aug 2013 10:47:05 +0000 (12:47 +0200)
doc/api/os.markdown
src/node_os.cc

index 4c81818..928a79e 100644 (file)
@@ -128,24 +128,28 @@ Example inspection of os.cpus:
 
 Get a list of network interfaces:
 
-    { lo0:
-       [ { address: 'fe80::1', netmask: 'ffff:ffff:ffff:ffff::',
-           family: 'IPv6', internal: true },
-         { address: '127.0.0.1', netmask: '255.0.0.0',
-           family: 'IPv4', internal: true },
-         { address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
-           family: 'IPv6', internal: true } ],
-      en1:
-       [ { address: 'fe80::226:8ff:fedc:1dd', netmask: 'ffff:ffff:ffff:ffff::',
-           family: 'IPv6', internal: false },
-         { address: '10.0.1.6', netmask: '255.255.255.0',
-           family: 'IPv4', internal: false } ],
-      vmnet1:
-       [ { address: '192.168.252.1', netmask: '255.255.255.0',
-           family: 'IPv4', internal: false } ],
-      vmnet8:
-       [ { address: '192.168.207.1', netmask: '255.255.255.0',
-           family: 'IPv4', internal: false } ] }
+    { lo:
+       [ { address: '127.0.0.1',
+           netmask: '255.0.0.0',
+           family: 'IPv4',
+           mac: '00:00:00:00:00:00',
+           internal: true },
+         { address: '::1',
+           netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
+           family: 'IPv6',
+           mac: '00:00:00:00:00:00',
+           internal: true } ],
+      eth0:
+       [ { address: '192.168.1.108',
+           netmask: '255.255.255.0',
+           family: 'IPv4',
+           mac: '01:02:03:0a:0b:0c',
+           internal: false },
+         { address: 'fe80::a00:27ff:fe4e:66a1',
+           netmask: 'ffff:ffff:ffff:ffff::',
+           family: 'IPv6',
+           mac: '01:02:03:0a:0b:0c',
+           internal: false } ] }
 
 ## os.EOL
 
index d668c16..cbce5cc 100644 (file)
@@ -208,6 +208,7 @@ static void GetInterfaceAddresses(const FunctionCallbackInfo<Value>& args) {
   int count, i;
   char ip[INET6_ADDRSTRLEN];
   char netmask[INET6_ADDRSTRLEN];
+  char mac[18];
   Local<Object> ret, o;
   Local<String> name, family;
   Local<Array> ifarr;
@@ -228,6 +229,16 @@ static void GetInterfaceAddresses(const FunctionCallbackInfo<Value>& args) {
       ret->Set(name, ifarr);
     }
 
+    snprintf(mac,
+             18,
+             "%02x:%02x:%02x:%02x:%02x:%02x",
+             static_cast<unsigned char>(interfaces[i].phys_addr[0]),
+             static_cast<unsigned char>(interfaces[i].phys_addr[1]),
+             static_cast<unsigned char>(interfaces[i].phys_addr[2]),
+             static_cast<unsigned char>(interfaces[i].phys_addr[3]),
+             static_cast<unsigned char>(interfaces[i].phys_addr[4]),
+             static_cast<unsigned char>(interfaces[i].phys_addr[5]));
+
     if (interfaces[i].address.address4.sin_family == AF_INET) {
       uv_ip4_name(&interfaces[i].address.address4, ip, sizeof(ip));
       uv_ip4_name(&interfaces[i].netmask.netmask4, netmask, sizeof(netmask));
@@ -245,6 +256,7 @@ static void GetInterfaceAddresses(const FunctionCallbackInfo<Value>& args) {
     o->Set(String::New("address"), String::New(ip));
     o->Set(String::New("netmask"), String::New(netmask));
     o->Set(String::New("family"), family);
+    o->Set(String::New("mac"), String::New(mac));
 
     const bool internal = interfaces[i].is_internal;
     o->Set(String::New("internal"),