@@ -157,6 +157,8 @@ ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n)
157157 cln -> handler = ngx_resolver_cleanup ;
158158 cln -> data = r ;
159159
160+ r -> ipv4 = 1 ;
161+
160162 ngx_rbtree_init (& r -> name_rbtree , & r -> name_sentinel ,
161163 ngx_resolver_rbtree_insert_value );
162164
@@ -225,6 +227,23 @@ ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n)
225227 }
226228
227229#if (NGX_HAVE_INET6 )
230+ if (ngx_strncmp (names [i ].data , "ipv4=" , 5 ) == 0 ) {
231+
232+ if (ngx_strcmp (& names [i ].data [5 ], "on" ) == 0 ) {
233+ r -> ipv4 = 1 ;
234+
235+ } else if (ngx_strcmp (& names [i ].data [5 ], "off" ) == 0 ) {
236+ r -> ipv4 = 0 ;
237+
238+ } else {
239+ ngx_conf_log_error (NGX_LOG_EMERG , cf , 0 ,
240+ "invalid parameter: %V" , & names [i ]);
241+ return NULL ;
242+ }
243+
244+ continue ;
245+ }
246+
228247 if (ngx_strncmp (names [i ].data , "ipv6=" , 5 ) == 0 ) {
229248
230249 if (ngx_strcmp (& names [i ].data [5 ], "on" ) == 0 ) {
@@ -273,6 +292,14 @@ ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n)
273292 }
274293 }
275294
295+ #if (NGX_HAVE_INET6 )
296+ if (r -> ipv4 + r -> ipv6 == 0 ) {
297+ ngx_conf_log_error (NGX_LOG_EMERG , cf , 0 ,
298+ "\"ipv4\" and \"ipv6\" cannot both be \"off\"" );
299+ return NULL ;
300+ }
301+ #endif
302+
276303 if (n && r -> connections .nelts == 0 ) {
277304 ngx_conf_log_error (NGX_LOG_EMERG , cf , 0 , "no name servers defined" );
278305 return NULL ;
@@ -836,7 +863,7 @@ ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx,
836863 r -> last_connection = 0 ;
837864 }
838865
839- rn -> naddrs = (u_short ) - 1 ;
866+ rn -> naddrs = r -> ipv4 ? (u_short ) - 1 : 0 ;
840867 rn -> tcp = 0 ;
841868#if (NGX_HAVE_INET6 )
842869 rn -> naddrs6 = r -> ipv6 ? (u_short ) - 1 : 0 ;
@@ -1263,7 +1290,7 @@ ngx_resolver_send_query(ngx_resolver_t *r, ngx_resolver_node_t *rn)
12631290 rec -> log .action = "resolving" ;
12641291 }
12651292
1266- if (rn -> naddrs == (u_short ) - 1 ) {
1293+ if (rn -> query && rn -> naddrs == (u_short ) - 1 ) {
12671294 rc = rn -> tcp ? ngx_resolver_send_tcp_query (r , rec , rn -> query , rn -> qlen )
12681295 : ngx_resolver_send_udp_query (r , rec , rn -> query , rn -> qlen );
12691296
@@ -1765,10 +1792,13 @@ ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, size_t n,
17651792 q = ngx_queue_next (q ))
17661793 {
17671794 rn = ngx_queue_data (q , ngx_resolver_node_t , queue );
1768- qident = (rn -> query [0 ] << 8 ) + rn -> query [1 ];
17691795
1770- if (qident == ident ) {
1771- goto dns_error_name ;
1796+ if (rn -> query ) {
1797+ qident = (rn -> query [0 ] << 8 ) + rn -> query [1 ];
1798+
1799+ if (qident == ident ) {
1800+ goto dns_error_name ;
1801+ }
17721802 }
17731803
17741804#if (NGX_HAVE_INET6 )
@@ -3645,7 +3675,7 @@ ngx_resolver_create_name_query(ngx_resolver_t *r, ngx_resolver_node_t *rn,
36453675 len = sizeof (ngx_resolver_hdr_t ) + nlen + sizeof (ngx_resolver_qs_t );
36463676
36473677#if (NGX_HAVE_INET6 )
3648- p = ngx_resolver_alloc (r , r -> ipv6 ? len * 2 : len );
3678+ p = ngx_resolver_alloc (r , len * ( r -> ipv4 + r -> ipv6 ) );
36493679#else
36503680 p = ngx_resolver_alloc (r , len );
36513681#endif
@@ -3658,19 +3688,21 @@ ngx_resolver_create_name_query(ngx_resolver_t *r, ngx_resolver_node_t *rn,
36583688
36593689#if (NGX_HAVE_INET6 )
36603690 if (r -> ipv6 ) {
3661- rn -> query6 = p + len ;
3691+ rn -> query6 = r -> ipv4 ? ( p + len ) : p ;
36623692 }
36633693#endif
36643694
36653695 query = (ngx_resolver_hdr_t * ) p ;
36663696
3667- ident = ngx_random ();
3697+ if (r -> ipv4 ) {
3698+ ident = ngx_random ();
36683699
3669- ngx_log_debug2 (NGX_LOG_DEBUG_CORE , r -> log , 0 ,
3670- "resolve: \"%V\" A %i" , name , ident & 0xffff );
3700+ ngx_log_debug2 (NGX_LOG_DEBUG_CORE , r -> log , 0 ,
3701+ "resolve: \"%V\" A %i" , name , ident & 0xffff );
36713702
3672- query -> ident_hi = (u_char ) ((ident >> 8 ) & 0xff );
3673- query -> ident_lo = (u_char ) (ident & 0xff );
3703+ query -> ident_hi = (u_char ) ((ident >> 8 ) & 0xff );
3704+ query -> ident_lo = (u_char ) (ident & 0xff );
3705+ }
36743706
36753707 /* recursion query */
36763708 query -> flags_hi = 1 ; query -> flags_lo = 0 ;
@@ -3731,7 +3763,9 @@ ngx_resolver_create_name_query(ngx_resolver_t *r, ngx_resolver_node_t *rn,
37313763
37323764 p = rn -> query6 ;
37333765
3734- ngx_memcpy (p , rn -> query , rn -> qlen );
3766+ if (r -> ipv4 ) {
3767+ ngx_memcpy (p , rn -> query , rn -> qlen );
3768+ }
37353769
37363770 query = (ngx_resolver_hdr_t * ) p ;
37373771
0 commit comments