diff --git a/nbase/nbase.h b/nbase/nbase.h index 8988b2ca5..9e0e84866 100644 --- a/nbase/nbase.h +++ b/nbase/nbase.h @@ -459,6 +459,7 @@ int inheritable_socket(int af, int style, int protocol); int dup_socket(int sd); int unblock_socket(int sd); int block_socket(int sd); +int socket_bindtodevice(int sd, const char *device); /* CRC32 Cyclic Redundancy Check */ unsigned long nbase_crc32(unsigned char *buf, int len); diff --git a/nbase/nbase_misc.c b/nbase/nbase_misc.c index 2e410c30f..8bd2e137f 100644 --- a/nbase/nbase_misc.c +++ b/nbase/nbase_misc.c @@ -281,6 +281,18 @@ int block_socket(int sd) { return 1; } +/* Use the SO_BINDTODEVICE sockopt to bind with a specific interface (Linux + only). Pass NULL or an empty string to remove device binding. */ +int socket_bindtodevice(int sd, const char *device) { +#ifdef SO_BINDTODEVICE + /* Linux-specific sockopt asking to use a specific interface. See socket(7). */ + if (setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, device, strlen(device) + 1) < 0) + return 0; +#endif + + return 1; +} + /* Convert a time specification into a count of seconds. A time specification is * a non-negative real number, possibly followed by a units suffix. The suffixes * are "ms" for milliseconds, "s" for seconds, "m" for minutes, or "h" for