From a8d3ec4e04ed8a94b4d108386d114b89ef94dd60 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Thu, 7 Nov 2013 18:16:34 +0100 Subject: [SERVER] Add --bind parameter to specify bind interface (currently IPv4 only) --- src/server/server.c | 10 ++++++++-- src/server/sockhelper.c | 12 ++++++++++-- src/server/sockhelper.h | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/server/server.c b/src/server/server.c index 51c662b..c469e72 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -77,6 +77,7 @@ void dnbd3_print_help(char *argv_0) printf( "-d or --delay Add a fake network delay of X µs\n" ); #endif printf( "-n or --nodaemon Start server in foreground\n" ); + printf( "-b or --bind Local Address to bind to\n" ); //printf( "-r or --reload Reload configuration file\n" ); //printf( "-s or --stop Stop running dnbd3-server\n" ); //printf( "-i or --info Print connected clients and used images\n" ); @@ -176,6 +177,7 @@ int main(int argc, char *argv[]) int opt = 0; int longIndex = 0; char *paramCreate = NULL; + char *bindAddress = NULL; int64_t paramSize = -1; int paramRevision = -1; static const char *optString = "c:d:nrsihv?"; @@ -188,6 +190,7 @@ int main(int argc, char *argv[]) { "info", no_argument, NULL, 'i' }, { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, + { "bind", required_argument, NULL, 'b' }, { "crc", required_argument, NULL, 'crc4' }, { "assert", no_argument, NULL, 'asrt' }, { "create", required_argument, NULL, 'crat' }, @@ -233,6 +236,9 @@ int main(int argc, char *argv[]) case 'v': dnbd3_print_version(); break; + case 'b': + bindAddress = strdup( optarg ); + break; case 'crc4': return image_generateCrcFile( optarg ) ? 0 : EXIT_FAILURE; case 'asrt': @@ -306,10 +312,10 @@ int main(int argc, char *argv[]) sleep( 2 ); // setup network - sockets[socket_count] = sock_listen_any( PF_INET, PORT ); + sockets[socket_count] = sock_listen_any( PF_INET, PORT, bindAddress ); if ( sockets[socket_count] != -1 ) ++socket_count; #ifdef WITH_IPV6 - sockets[socket_count] = sock_listen_any(PF_INET6, PORT); + sockets[socket_count] = sock_listen_any(PF_INET6, PORT, NULL); if (sockets[socket_count] != -1) ++socket_count; #endif if ( socket_count == 0 ) exit( EXIT_FAILURE ); diff --git a/src/server/sockhelper.c b/src/server/sockhelper.c index b72cf05..ffb34e9 100644 --- a/src/server/sockhelper.c +++ b/src/server/sockhelper.c @@ -81,13 +81,21 @@ void sock_set_timeout(const int sockfd, const int milliseconds) setsockopt( sockfd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv) ); } -int sock_listen_any(int protocol_family, uint16_t port) +int sock_listen_any(int protocol_family, uint16_t port, char* bind_addr) { struct sockaddr_storage addr; + struct in_addr local; + if (bind_addr == NULL) { + if (!inet_aton(bind_addr, &local)) return -1; + } memset( &addr, 0, sizeof(addr) ); if ( protocol_family == PF_INET ) { struct sockaddr_in *v4 = (struct sockaddr_in *)&addr; - v4->sin_addr.s_addr = INADDR_ANY; + if (bind_addr == NULL) { + v4->sin_addr.s_addr = INADDR_ANY; + } else { + v4->sin_addr = local; + } v4->sin_port = htons( port ); v4->sin_family = AF_INET; } diff --git a/src/server/sockhelper.h b/src/server/sockhelper.h index 4f753c9..cef19ec 100644 --- a/src/server/sockhelper.h +++ b/src/server/sockhelper.h @@ -30,7 +30,7 @@ void sock_set_timeout(const int sockfd, const int milliseconds); * @param port port to listen on * @return the socket descriptor if successful, -1 otherwise. */ -int sock_listen_any(int protocol_family, uint16_t port); +int sock_listen_any(int protocol_family, uint16_t port, char* bind_addr); /** * Listen on a specific address and port. -- cgit v1.2.3-55-g7522