mirror of
https://github.com/isc-projects/bind9.git
synced 2026-02-26 03:11:56 -05:00
Add option to bind to a specified address
This commit is contained in:
parent
fd3594dc7f
commit
4e0dc7b50c
2 changed files with 25 additions and 3 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@
|
|||
* functions in most applications.
|
||||
*/
|
||||
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue