Skip to content

Commit 444707a

Browse files
author
Ron Korving
committed
Merge pull request #84 from ronkorving/master
Get node_mdns up to speed
2 parents c67c793 + 95205d6 commit 444707a

13 files changed

Lines changed: 174 additions & 28 deletions

CHANGES

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,34 @@
11
CHANGES
22

3+
Version 2.1.4 to 2.2.0
4+
5+
- moved the repository back from Wizcorp/node_mdns to agnat/node_mdns
6+
7+
Version 2.1.3 to 2.1.4
8+
9+
- added service to errors from the resolver (bjornstar)
10+
11+
Version 2.1.2 to 2.1.3
12+
13+
- applied the fix from 2.1.0 to remaining parts of the code base (achingbrain)
14+
15+
Version 2.1.1 to 2.1.2
16+
17+
- fixed an exception that was thrown when a service went down along with its network interface (achingbrain)
18+
19+
Version 2.1.0 to 2.1.1
20+
21+
- fixed the interfaceIndex patch by mrose17 as it was breaking on Node 0.8 (ronkorving)
22+
23+
Version 2.0.0-dev to 2.1.0
24+
25+
- errno was broken in Node v0.10 (mrose17)
26+
- allow interfaceIndex to be "really big" (mrose17)
27+
28+
Version 1.1.0 to 2.0.0-dev
29+
30+
- empty version release (agnat)
31+
332
Version 1.0.0 to 1.1.0
433

534
- better handling of network interfaces

README.textile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ h1. mdns -- node.js Service Discovery
22

33
|_. Package: | mdns |
44
|_. Description: | multicast DNS service discovery |
5-
|_. Version: | 2.0.0-dev |
5+
|_. Version: | 2.2.0 |
66
|_. Installation: | @npm install mdns@ (see below) |
77
|_. Documentation: | "mdns user guide":http://agnat.github.com/node_mdns/user_guide.html |
88
|_. License: | "MIT":http://github.com/agnat/node_mdns/blob/master/LICENSE |
@@ -34,7 +34,7 @@ var all_the_types = mdns.browseThemAll(); // all_the_types is just another brows
3434

3535
h2. Installation
3636

37-
On Linux and other systems using the avahi daemon the avahi dns_sd compat library and its header files are required. On debianesque systems the package name is @libavahi-compat-libdnssd-dev@. On other platforms Apples "mDNSResponder":http://opensource.apple.com/tarballs/mDNSResponder/ is recommended. Care should be taken not to install more than one mDNS stack on a system.
37+
On Linux and other systems using the avahi daemon the avahi dns_sd compat library and its header files are required. On debianesque systems the package name is @libavahi-compat-libdnssd-dev@. On other platforms Apples "mDNSResponder":http://opensource.apple.com/tarballs/mDNSResponder/ is recommended. Care should be taken not to install more than one mDNS stack on a system.
3838

3939
On Windows you are going to need Apples "Bonjour SDK for Windows". You can download it either from Apple (registration required) or various unofficial sources. Take your pick. After installing the SDK restart your shell or command prompt and make sure the @BONJOUR_SDK_HOME@ environment variable is set. You'll also need a compiler. Microsoft Visual Studio Express will do. On Windows node >=0.7.9 is required.
4040

examples/osc_devices.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/usr/bin/env node
2+
var mdns = require('../lib/mdns')
3+
, listOfOscDevices = { /*name: {adresses: ['192.168.0.24', 'fe80::0:18'], port: 10001}}*/ }
4+
;
5+
6+
var mdnsBrowser = mdns.createBrowser(mdns.udp('osc'));
7+
8+
mdnsBrowser.on('serviceUp', function(service) {
9+
// ignore duplicate ups
10+
if(listOfOscDevices[service.name]) return;
11+
12+
listOfOscDevices[service.name] = {'addresses': service.addresses, 'port': service.port};
13+
var cnt = Object.keys(listOfOscDevices).length;
14+
15+
console.log('osc device "'+service.name+' up at '+service.addresses[0]+':'+service.port+', now '+cnt+' devices on the net');
16+
});
17+
18+
mdnsBrowser.on('serviceDown', function(service) {
19+
// ignore duplicate downs
20+
if(!listOfOscDevices[service.name]) return;
21+
22+
var device = listOfOscDevices[service.name];
23+
24+
delete listOfOscDevices[service.name];
25+
var cnt = Object.keys(listOfOscDevices).length;
26+
27+
console.log('osc device "'+service.name+' up at '+device.addresses[0]+':'+device.port+', now '+cnt+' devices on the net');
28+
});
29+
30+
console.log('listening for osc-compatible devices on the net')
31+
mdnsBrowser.start();

lib/advertisement.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ function Advertisement(serviceType, port, options, callback) {
4747
, domain: domain
4848
, flags: flags
4949
}, context);
50-
}
50+
}
5151
if (error) {
5252
self.emit('error', error);
5353
}

lib/browser.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ var Browser = exports.Browser = function Browser(serviceType, options) {
1818
, requested_type = st.makeServiceType( serviceType );
1919
;
2020

21+
var interfaceNames = [];
22+
2123
function on_service_changed(sdRef, flags, ifaceIdx, errorCode, serviceName,
2224
serviceType, replyDomain, context)
2325
{
2426
function on_resolver_done(error, service) {
2527
if (error) {
26-
self.emit('error', error);
28+
self.emit('error', error, service);
2729
} else {
2830
self.emit('serviceChanged', service, context);
2931
self.emit('serviceUp', service, context);
@@ -42,10 +44,20 @@ var Browser = exports.Browser = function Browser(serviceType, options) {
4244
};
4345
if (serviceName) service.name = serviceName;
4446

45-
if (typeof dns_sd.if_indextoname !== 'undefined' && ifaceIdx > 0) {
46-
service.networkInterface = dns_sd.if_indextoname(ifaceIdx);
47-
} else if (dns_sd.kDNSServiceInterfaceIndexLocalOnly === ifaceIdx) {
47+
if (dns_sd.kDNSServiceInterfaceIndexLocalOnly === ifaceIdx) {
4848
service.networkInterface = nif.loopbackName();
49+
} else if (typeof dns_sd.if_indextoname !== 'undefined' && ifaceIdx > 0) {
50+
try {
51+
service.networkInterface = dns_sd.if_indextoname(ifaceIdx);
52+
53+
interfaceNames[ifaceIdx] = service.networkInterface;
54+
} catch(e) {
55+
if(typeof interfaceNames[ifaceIdx] !== "undefined") {
56+
service.networkInterface = interfaceNames[ifaceIdx];
57+
} else {
58+
throw e;
59+
}
60+
}
4961
}
5062

5163
if (flags & dns_sd.kDNSServiceFlagsAdd) {
@@ -75,7 +87,7 @@ var resolve = exports.resolve = function resolve(service, sequence, callback) {
7587

7688
function next(error) {
7789
if (error) {
78-
callback(error);
90+
callback(error, service);
7991
return;
8092
}
8193
if (sequence.length === step) {

lib/resolver_sequence_tasks.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,10 @@ try {
106106
_getaddrinfo = function getaddrinfo_v06x(host, family, cb) {
107107
var wrap = cares.getaddrinfo(host, family);
108108
if ( ! wrap) {
109-
throw errnoException(errno, 'getaddrinfo');
109+
throw errnoException(process._errno || global.errno, 'getaddrinfo');
110110
}
111111
wrap.oncomplete = function(addresses) {
112+
var errno = process._errno || global.errno;
112113

113114
if (addresses) {
114115
cb(undefined, addresses);

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
{ "name": "mdns"
2-
, "version": "2.0.0-dev"
2+
, "version": "2.2.0"
33
, "description": "multicast DNS service discovery"
44
, "main": "./lib/mdns.js"
55
, "scripts":
66
{ "test": "node utils/testrun"
77
}
88
, "keywords": ["zeroconf", "bonjour", "dns_sd", "mDNSResponder"]
9-
, "devDependencies":
9+
, "devDependencies":
1010
{ "ejs": "*"
1111
, "less": "*"
1212
, "mkdirp": "*"
@@ -15,6 +15,7 @@
1515
, "glob": "*"
1616
, "ncp": "*"
1717
, "minimatch": "*"
18+
, "proxyquire": "~0.5"
1819
}
1920
, "repository":
2021
{ "type": "git"

src/dns_service_browse.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ OnServiceChanged(DNSServiceRef sdRef, DNSServiceFlags flags,
2626
Local<Value> args[argc];
2727
args[0] = Local<Object>::New(serviceRef->handle_);
2828
args[1] = Integer::New(flags);
29-
args[2] = Integer::New(interfaceIndex);
29+
args[2] = Integer::NewFromUnsigned(interfaceIndex);
3030
args[3] = Integer::New(errorCode);
3131
args[4] = stringOrUndefined(serviceName);
3232
args[5] = stringOrUndefined(serviceType);
@@ -59,10 +59,10 @@ DNSServiceBrowse(Arguments const& args) {
5959
}
6060
DNSServiceFlags flags = args[1]->ToInteger()->Int32Value();
6161

62-
if ( ! args[2]->IsInt32()) {
62+
if ( ! args[2]->IsUint32() && ! args[2]->IsInt32()) {
6363
return throwTypeError("argument 3 must be an integer (interfaceIndex)");
6464
}
65-
uint32_t interfaceIndex = args[2]->ToInteger()->Int32Value();
65+
uint32_t interfaceIndex = args[2]->ToInteger()->Uint32Value();
6666

6767
if ( ! args[3]->IsString()) {
6868
return throwTypeError("argument 4 must be a string (service type)");

src/dns_service_enumerate_domains.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ OnEnumeration(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceInde
2222
Local<Value> args[argc];
2323
args[0] = Local<Object>::New(serviceRef->handle_);
2424
args[1] = Integer::New(flags);
25-
args[2] = Integer::New(interfaceIndex);
25+
args[2] = Integer::NewFromUnsigned(interfaceIndex);
2626
args[3] = Integer::New(errorCode);
2727
args[4] = stringOrUndefined(replyDomain);
2828
args[5] = Local<Value>::New(serviceRef->GetContext());
@@ -49,10 +49,10 @@ DNSServiceEnumerateDomains(Arguments const& args) {
4949
}
5050
DNSServiceFlags flags = args[1]->ToInteger()->Int32Value();
5151

52-
if ( ! args[2]->IsInt32()) {
53-
return throwTypeError("argument 3 must be an integer (interfaceIndex)");
52+
if ( ! args[2]->IsUint32() && ! args[2]->IsInt32()) {
53+
return throwTypeError("argument 3 must be an integer (interfaceIndex)");
5454
}
55-
uint32_t interfaceIndex = args[2]->ToInteger()->Int32Value();
55+
uint32_t interfaceIndex = args[2]->ToInteger()->Uint32Value();
5656

5757
if ( ! args[3]->IsFunction()) {
5858
return throwTypeError("argument 4 must be a function (callBack)");

src/dns_service_get_addr_info.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ OnAddressInfo(DNSServiceRef sdRef, DNSServiceFlags flags,
3636
Local<Value> args[argc];
3737
args[0] = Local<Object>::New(serviceRef->handle_);
3838
args[1] = Integer::New(flags);
39-
args[2] = Integer::New(interfaceIndex);
39+
args[2] = Integer::NewFromUnsigned(interfaceIndex);
4040
args[3] = Integer::New(errorCode);
4141
args[4] = stringOrUndefined(hostname);
4242
args[5] = String::Empty();
@@ -89,10 +89,10 @@ DNSServiceGetAddrInfo(Arguments const& args) {
8989
}
9090
DNSServiceFlags flags = args[1]->ToInteger()->Int32Value();
9191

92-
if ( ! args[2]->IsInt32()) {
93-
return throwTypeError("argument 3 must be an integer (interfaceIndex)");
92+
if ( ! args[2]->IsUint32() && ! args[2]->IsInt32()) {
93+
return throwTypeError("argument 3 must be an integer (interfaceIndex)");
9494
}
95-
uint32_t interfaceIndex = args[2]->ToInteger()->Int32Value();
95+
uint32_t interfaceIndex = args[2]->ToInteger()->Uint32Value();
9696

9797
if ( ! args[3]->IsInt32()) {
9898
return throwTypeError("argument 4 must be an integer (DNSServiceProtocol)");

0 commit comments

Comments
 (0)