summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSimon Rettberg2013-11-07 18:16:34 +0100
committerSimon Rettberg2013-11-07 18:16:34 +0100
commita8d3ec4e04ed8a94b4d108386d114b89ef94dd60 (patch)
treec9f081b6333288b1bf65d634e84b8d58a14d9d71 /src
parent[KERNEL] Tweak better server selection a bit by also adding a constant delay ... (diff)
downloaddnbd3-a8d3ec4e04ed8a94b4d108386d114b89ef94dd60.tar.gz
dnbd3-a8d3ec4e04ed8a94b4d108386d114b89ef94dd60.tar.xz
dnbd3-a8d3ec4e04ed8a94b4d108386d114b89ef94dd60.zip
[SERVER] Add --bind parameter to specify bind interface (currently IPv4 only)
Diffstat (limited to 'src')
-rw-r--r--src/server/server.c10
-rw-r--r--src/server/sockhelper.c12
-rw-r--r--src/server/sockhelper.h2
3 files changed, 19 insertions, 5 deletions
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.