@@ -100,46 +100,93 @@ exports.getHostByName = function (domain, callback) {
100100var net ;
101101
102102// Easy DNS A/AAAA look up
103- exports . lookup = function ( domain , callback ) {
104- var addressType = dns . isIP ( domain ) ;
105- if ( addressType ) {
106- process . nextTick ( function ( ) {
107- callback ( null , domain , addressType ) ;
108- } ) ;
103+ // lookup(domain, [family,] callback)
104+ exports . lookup = function ( domain , family , callback ) {
105+ if ( arguments . length === 2 ) {
106+ callback = family ;
107+ family = undefined ;
108+ } else if ( family && family !== 4 && family !== 6 ) {
109+ family = parseInt ( family ) ;
110+ if ( family === dns . AF_INET ) {
111+ family = 4 ;
112+ } else if ( family === dns . AF_INET6 ) {
113+ family = 6 ;
114+ } else if ( family !== 4 && family !== 6 ) {
115+ throw new Error ( 'invalid argument: "family" must be 4 or 6' ) ;
116+ }
117+ }
118+ if ( ! domain ) {
119+ callback ( null , null , family === 6 ? 6 : 4 ) ;
120+ return ;
121+ }
122+ var matchedFamily = dns . isIP ( domain ) ;
123+ if ( matchedFamily ) {
124+ callback ( null , domain , matchedFamily ) ;
109125 } else {
110- if ( / \w \. l o c a l \. ? $ / . test ( domain ) ) {
126+ if ( / \w \. l o c a l \. ? $ / . test ( domain ) ) {
111127 // ANNOYING: In the case of mDNS domains use NSS in the thread pool.
112128 // I wish c-ares had better support.
113129 process . binding ( 'net' ) . getaddrinfo ( domain , 4 , function ( err , domains4 ) {
114130 callback ( err , domains4 [ 0 ] , 4 ) ;
115131 } ) ;
116132 } else {
117- channel . getHostByName ( domain , dns . AF_INET , function ( err , domains4 ) {
118- if ( domains4 && domains4 . length ) {
119- callback ( null , domains4 [ 0 ] , 4 ) ;
120- } else {
121- channel . getHostByName ( domain , dns . AF_INET6 , function ( err , domains6 ) {
122- if ( domains6 && domains6 . length ) {
123- callback ( null , domains6 [ 0 ] , 6 ) ;
133+ if ( family ) {
134+ // resolve names for explicit address family
135+ var af = ( family === 4 ) ? dns . AF_INET : dns . AF_INET6 ;
136+ channel . getHostByName ( domain , af , function ( err , domains ) {
137+ if ( ! err && domains && domains . length ) {
138+ if ( family !== dns . isIP ( domains [ 0 ] ) ) {
139+ callback ( new Error ( 'not found' ) , [ ] ) ;
124140 } else {
125- callback ( err , [ ] ) ;
141+ callback ( null , domains [ 0 ] , family ) ;
126142 }
127- } ) ;
128- }
129- } ) ;
143+ } else {
144+ callback ( err , [ ] ) ;
145+ }
146+ } ) ;
147+ } else {
148+ // first resolve names for v4 and if that fails, try v6
149+ channel . getHostByName ( domain , dns . AF_INET , function ( err , domains4 ) {
150+ if ( domains4 && domains4 . length ) {
151+ callback ( null , domains4 [ 0 ] , 4 ) ;
152+ } else {
153+ channel . getHostByName ( domain , dns . AF_INET6 ,
154+ function ( err , domains6 ) {
155+ if ( domains6 && domains6 . length ) {
156+ callback ( null , domains6 [ 0 ] , 6 ) ;
157+ } else {
158+ callback ( err , [ ] ) ;
159+ }
160+ } ) ;
161+ }
162+ } ) ;
163+ }
130164 }
131165 }
132166} ;
133167
134168
135- exports . resolve4 = function ( domain , callback ) { channel . query ( domain , dns . A , callback ) } ;
136- exports . resolve6 = function ( domain , callback ) { channel . query ( domain , dns . AAAA , callback ) } ;
137- exports . resolveMx = function ( domain , callback ) { channel . query ( domain , dns . MX , callback ) } ;
138- exports . resolveTxt = function ( domain , callback ) { channel . query ( domain , dns . TXT , callback ) } ;
139- exports . resolveSrv = function ( domain , callback ) { channel . query ( domain , dns . SRV , callback ) } ;
140- exports . reverse = function ( domain , callback ) { channel . query ( domain , dns . PTR , callback ) } ;
141- exports . resolveNs = function ( domain , callback ) { channel . query ( domain , dns . NS , callback ) } ;
142-
169+ exports . resolve4 = function ( domain , callback ) {
170+ channel . query ( domain , dns . A , callback ) ;
171+ } ;
172+ exports . resolve6 = function ( domain , callback ) {
173+ channel . query ( domain , dns . AAAA , callback ) ;
174+ } ;
175+ exports . resolveMx = function ( domain , callback ) {
176+ channel . query ( domain , dns . MX , callback ) ;
177+ } ;
178+ exports . resolveTxt = function ( domain , callback ) {
179+ channel . query ( domain , dns . TXT , callback ) ;
180+ } ;
181+ exports . resolveSrv = function ( domain , callback ) {
182+ channel . query ( domain , dns . SRV , callback ) ;
183+ } ;
184+ exports . reverse = function ( domain , callback ) {
185+ channel . query ( domain , dns . PTR , callback ) ;
186+ } ;
187+ exports . resolveNs = function ( domain , callback ) {
188+ channel . query ( domain , dns . NS , callback ) ;
189+ } ;
143190
144191var resolveMap = {
145192 'A' : exports . resolve4 ,
0 commit comments