1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-20 22:49:01 +00:00

Add nsock_setdevice function.

This function allows setting the device that will be used in
SO_BINDTODEVICE setsockopt calls for all new sockets.
This commit is contained in:
david
2012-10-03 15:43:16 +00:00
parent b0c3b7b1f4
commit 3e9f862ce3
4 changed files with 23 additions and 0 deletions

View File

@@ -183,6 +183,9 @@ void nsp_settrace(nsock_pool nsp, FILE *file, int level, const struct timeval *b
* sockets (value of optval will be used directly in the setsockopt() call). */ * sockets (value of optval will be used directly in the setsockopt() call). */
void nsp_setbroadcast(nsock_pool nsp, int optval); void nsp_setbroadcast(nsock_pool nsp, int optval);
/* Sets the name of the interface for new sockets to bind to. */
void nsp_setdevice(nsock_pool nsp, const char *device);
/* Initializes an Nsock pool to create SSL connections. This sets an internal /* Initializes an Nsock pool to create SSL connections. This sets an internal
* SSL_CTX, which is like a template that sets options for all connections that * SSL_CTX, which is like a template that sets options for all connections that
* are made from it. Returns the SSL_CTX so you can set your own options. */ * are made from it. Returns the SSL_CTX so you can set your own options. */

View File

@@ -95,6 +95,15 @@ static int nsock_make_socket(mspool *ms, msiod *iod, int family, int proto) {
nsock_trace(ms, "Setting of IP options failed (IOD #%li)", iod->id); nsock_trace(ms, "Setting of IP options failed (IOD #%li)", iod->id);
} }
} }
if (ms->device) {
#ifdef SO_BINDTODEVICE
errno = 0;
if (setsockopt(iod->sd, SOL_SOCKET, SO_BINDTODEVICE, ms->device, strlen(ms->device) + 1) == -1) {
if ((errno != EPERM && ms->tracelevel > 0) || ms->tracelevel > 5)
nsock_trace(ms, "Setting of SO_BROADCAST failed (IOD #%li)", iod->id);
}
#endif
}
if (ms->broadcast) { if (ms->broadcast) {
if (setsockopt(iod->sd, SOL_SOCKET, SO_BROADCAST, (const char *)&(ms->broadcast), sizeof(int)) == -1) { if (setsockopt(iod->sd, SOL_SOCKET, SO_BROADCAST, (const char *)&(ms->broadcast), sizeof(int)) == -1) {
if (ms->tracelevel > 0) if (ms->tracelevel > 0)

View File

@@ -205,6 +205,9 @@ typedef struct {
/* If true, new sockets will have SO_BROADCAST set */ /* If true, new sockets will have SO_BROADCAST set */
int broadcast; int broadcast;
/* Interface to bind to; only supported on Linux with SO_BINDTODEVICE sockopt. */
const char *device;
/* If true, exit the next iteration of nsock_loop with a status of /* If true, exit the next iteration of nsock_loop with a status of
* NSOCK_LOOP_QUIT. */ * NSOCK_LOOP_QUIT. */
int quit; int quit;

View File

@@ -147,6 +147,12 @@ void nsp_setbroadcast(nsock_pool nsp, int optval) {
mt->broadcast = optval; mt->broadcast = optval;
} }
/* Sets the name of the interface for new sockets to bind to. */
void nsp_setdevice(nsock_pool nsp, const char *device) {
mspool *mt = (mspool *)nsp;
mt->device = device;
}
/* And here is how you create an nsock_pool. This allocates, initializes, and /* And here is how you create an nsock_pool. This allocates, initializes, and
* returns an nsock_pool event aggregator. In the case of error, NULL will be * returns an nsock_pool event aggregator. In the case of error, NULL will be
* returned. If you do not wish to immediately associate any userdata, pass in * returned. If you do not wish to immediately associate any userdata, pass in
@@ -192,6 +198,8 @@ nsock_pool nsp_new(void *userdata) {
nsp->next_event_serial = 1; nsp->next_event_serial = 1;
nsp->device = NULL;
#if HAVE_OPENSSL #if HAVE_OPENSSL
nsp->sslctx = NULL; nsp->sslctx = NULL;
#endif #endif