diff --git a/bin/dig/dig.c b/bin/dig/dig.c index ad712ea24c..291957db54 100644 --- a/bin/dig/dig.c +++ b/bin/dig/dig.c @@ -36,7 +36,7 @@ extern ISC_LIST(dig_lookup_t) lookup_list; extern ISC_LIST(dig_server_t) server_list; extern ISC_LIST(dig_searchlist_t) search_list; -extern isc_boolean_t have_ipv6, show_details, +extern isc_boolean_t have_ipv6, show_details, specified_source, usesearch, qr; extern in_port_t port; extern unsigned int timeout; @@ -57,6 +57,7 @@ extern char fixeddomain[MXNAME]; extern isc_boolean_t twiddle; #endif extern int exitcode; +extern isc_sockaddr_t bind_address; isc_boolean_t short_form = ISC_FALSE, printcmd = ISC_TRUE; @@ -537,6 +538,7 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) { dig_lookup_t *lookup = NULL; char *batchname = NULL; char batchline[MXNAME]; + char address[MXNAME]; FILE *fp = NULL; int bargc; char *bargv[16]; @@ -926,6 +928,18 @@ parse_args(isc_boolean_t is_batchfile, int argc, char **argv) { rv++; rc--; } + } else if (strncmp(rv[0], "-b", 2) == 0) { + if (rv[0][2]!=0) { + strncpy(address, &rv[0][2], + MXRD); + } else { + strncpy(address, rv[1], + MXRD); + rv++; + rc--; + } + get_address(address, 0, &bind_address); + specified_source = ISC_TRUE; } else if (strncmp(rv[0], "-h", 2) == 0) { show_usage(); exit (exitcode); diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c index 0b78aba626..b5f95c6ca9 100644 --- a/bin/dig/dighost.c +++ b/bin/dig/dighost.c @@ -24,7 +24,6 @@ * functions in most applications. */ - #include #include @@ -53,7 +52,7 @@ ISC_LIST(dig_lookup_t) lookup_list; ISC_LIST(dig_server_t) server_list; ISC_LIST(dig_searchlist_t) search_list; -isc_boolean_t have_ipv6 = ISC_FALSE, +isc_boolean_t have_ipv6 = ISC_FALSE, specified_source = ISC_FALSE, free_now = ISC_FALSE, show_details = ISC_FALSE, usesearch=ISC_TRUE, qr = ISC_FALSE; #ifdef TWIDDLE @@ -66,6 +65,7 @@ isc_taskmgr_t *taskmgr = NULL; isc_task_t *task = NULL; isc_timermgr_t *timermgr = NULL; isc_socketmgr_t *socketmgr = NULL; +isc_sockaddr_t bind_address; char *rootspace[BUFSIZE]; isc_buffer_t rootbuf; int sendcount = 0; @@ -1500,6 +1500,10 @@ do_lookup_tcp(dig_lookup_t *lookup) { isc_sockaddr_pf(&query->sockaddr), isc_sockettype_tcp, &query->sock) ; check_result(result, "isc_socket_create"); + if (specified_source) { + result = isc_socket_bind(query->sock, &bind_address); + check_result(result, "isc_socket_bind"); + } result = isc_socket_connect(query->sock, &query->sockaddr, task, connect_done, query); check_result (result, "isc_socket_connect"); @@ -1529,6 +1533,10 @@ do_lookup_udp(dig_lookup_t *lookup) { isc_sockaddr_pf(&query->sockaddr), isc_sockettype_udp, &query->sock) ; check_result(result, "isc_socket_create"); + if (specified_source) { + result = isc_socket_bind(query->sock, &bind_address); + check_result(result, "isc_socket_bind"); + } } send_udp(lookup);