Skip to content

Commit 8a407f5

Browse files
wanderviewtjfontaine
authored andcommitted
os: Include netmask in os.networkInterfaces()
re nodejs#3765 and nodejs#5432 fixes nodejs#4743
1 parent fbf4641 commit 8a407f5

File tree

3 files changed

+29
-13
lines changed

3 files changed

+29
-13
lines changed

doc/api/os.markdown

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -127,17 +127,24 @@ Example inspection of os.cpus:
127127

128128
Get a list of network interfaces:
129129

130-
{ lo0:
131-
[ { address: '::1', family: 'IPv6', internal: true },
132-
{ address: 'fe80::1', family: 'IPv6', internal: true },
133-
{ address: '127.0.0.1', family: 'IPv4', internal: true } ],
134-
en1:
135-
[ { address: 'fe80::cabc:c8ff:feef:f996', family: 'IPv6',
136-
internal: false },
137-
{ address: '10.0.1.123', family: 'IPv4', internal: false } ],
138-
vmnet1: [ { address: '10.99.99.254', family: 'IPv4', internal: false } ],
139-
vmnet8: [ { address: '10.88.88.1', family: 'IPv4', internal: false } ],
140-
ppp0: [ { address: '10.2.0.231', family: 'IPv4', internal: false } ] }
130+
{ lo0:
131+
[ { address: 'fe80::1', netmask: 'ffff:ffff:ffff:ffff::',
132+
family: 'IPv6', internal: true },
133+
{ address: '127.0.0.1', netmask: '255.0.0.0',
134+
family: 'IPv4', internal: true },
135+
{ address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
136+
family: 'IPv6', internal: true } ],
137+
en1:
138+
[ { address: 'fe80::226:8ff:fedc:1dd', netmask: 'ffff:ffff:ffff:ffff::',
139+
family: 'IPv6', internal: false },
140+
{ address: '10.0.1.6', netmask: '255.255.255.0',
141+
family: 'IPv4', internal: false } ],
142+
vmnet1:
143+
[ { address: '192.168.252.1', netmask: '255.255.255.0',
144+
family: 'IPv4', internal: false } ],
145+
vmnet8:
146+
[ { address: '192.168.207.1', netmask: '255.255.255.0',
147+
family: 'IPv4', internal: false } ] }
141148

142149
## os.EOL
143150

src/node_os.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ static Handle<Value> GetInterfaceAddresses(const Arguments& args) {
204204
uv_interface_address_t* interfaces;
205205
int count, i;
206206
char ip[INET6_ADDRSTRLEN];
207+
char netmask[INET6_ADDRSTRLEN];
207208
Local<Object> ret, o;
208209
Local<String> name, family;
209210
Local<Array> ifarr;
@@ -226,9 +227,11 @@ static Handle<Value> GetInterfaceAddresses(const Arguments& args) {
226227

227228
if (interfaces[i].address.address4.sin_family == AF_INET) {
228229
uv_ip4_name(&interfaces[i].address.address4,ip, sizeof(ip));
230+
uv_ip4_name(&interfaces[i].netmask.netmask4, netmask, sizeof(netmask));
229231
family = String::New("IPv4");
230232
} else if (interfaces[i].address.address4.sin_family == AF_INET6) {
231233
uv_ip6_name(&interfaces[i].address.address6, ip, sizeof(ip));
234+
uv_ip6_name(&interfaces[i].netmask.netmask6, netmask, sizeof(netmask));
232235
family = String::New("IPv6");
233236
} else {
234237
strncpy(ip, "<unknown sa family>", INET6_ADDRSTRLEN);
@@ -237,6 +240,7 @@ static Handle<Value> GetInterfaceAddresses(const Arguments& args) {
237240

238241
o = Object::New();
239242
o->Set(String::New("address"), String::New(ip));
243+
o->Set(String::New("netmask"), String::New(netmask));
240244
o->Set(String::New("family"), family);
241245

242246
const bool internal = interfaces[i].is_internal;

test/simple/test-os.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,18 @@ switch (platform) {
8585
case 'linux':
8686
var filter = function(e) { return e.address == '127.0.0.1'; };
8787
var actual = interfaces.lo.filter(filter);
88-
var expected = [{ address: '127.0.0.1', family: 'IPv4', internal: true }];
88+
var expected = [{ address: '127.0.0.1', netmask: '255.0.0.0',
89+
family: 'IPv4', internal: true }];
8990
assert.deepEqual(actual, expected);
9091
break;
9192
case 'win32':
9293
var filter = function(e) { return e.address == '127.0.0.1'; };
9394
var actual = interfaces['Loopback Pseudo-Interface 1'].filter(filter);
94-
var expected = [{ address: '127.0.0.1', family: 'IPv4', internal: true }];
95+
// NOTE: Windows does not set a prefix or netmask on 127.0.0.1, so we
96+
// default to /32 here. We could put in a special case to force
97+
// to /8 if desired.
98+
var expected = [{ address: '127.0.0.1', netmask: '255.255.255.255',
99+
family: 'IPv4', internal: true }];
95100
assert.deepEqual(actual, expected);
96101
break;
97102
}

0 commit comments

Comments
 (0)