@@ -100,46 +100,93 @@ exports.getHostByName = function (domain, callback) {
100
100
var net ;
101
101
102
102
// 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 ) ;
109
125
} else {
110
- if ( / \w \. l o c a l \. ? $ / . test ( domain ) ) {
126
+ if ( / \w \. l o c a l \. ? $ / . test ( domain ) ) {
111
127
// ANNOYING: In the case of mDNS domains use NSS in the thread pool.
112
128
// I wish c-ares had better support.
113
129
process . binding ( 'net' ) . getaddrinfo ( domain , 4 , function ( err , domains4 ) {
114
130
callback ( err , domains4 [ 0 ] , 4 ) ;
115
131
} ) ;
116
132
} 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' ) , [ ] ) ;
124
140
} else {
125
- callback ( err , [ ] ) ;
141
+ callback ( null , domains [ 0 ] , family ) ;
126
142
}
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
+ }
130
164
}
131
165
}
132
166
} ;
133
167
134
168
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
+ } ;
143
190
144
191
var resolveMap = {
145
192
'A' : exports . resolve4 ,
0 commit comments