diff --git a/doc/api/os.markdown b/doc/api/os.markdown index 4c81818c26..928a79e881 100644 --- a/doc/api/os.markdown +++ b/doc/api/os.markdown @@ -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 diff --git a/src/node_os.cc b/src/node_os.cc index d668c16d39..cbce5cc7e5 100644 --- a/src/node_os.cc +++ b/src/node_os.cc @@ -208,6 +208,7 @@ static void GetInterfaceAddresses(const FunctionCallbackInfo& args) { int count, i; char ip[INET6_ADDRSTRLEN]; char netmask[INET6_ADDRSTRLEN]; + char mac[18]; Local ret, o; Local name, family; Local ifarr; @@ -228,6 +229,16 @@ static void GetInterfaceAddresses(const FunctionCallbackInfo& args) { ret->Set(name, ifarr); } + snprintf(mac, + 18, + "%02x:%02x:%02x:%02x:%02x:%02x", + static_cast(interfaces[i].phys_addr[0]), + static_cast(interfaces[i].phys_addr[1]), + static_cast(interfaces[i].phys_addr[2]), + static_cast(interfaces[i].phys_addr[3]), + static_cast(interfaces[i].phys_addr[4]), + static_cast(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& 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"),