@@ -60,7 +60,7 @@ static void help (int level) {
60
60
printf (" general usage: supernode <config file> (see supernode.conf)\n"
61
61
"\n"
62
62
" or supernode "
63
- "[-p <local port>] "
63
+ "[-p [<local bind ip address>:] <local port>] "
64
64
"\n "
65
65
"[-F <federation name>] "
66
66
"\n options for under- "
@@ -113,7 +113,8 @@ static void help (int level) {
113
113
);
114
114
printf (" OPTIONS FOR THE UNDERLYING NETWORK CONNECTION\n" );
115
115
printf (" ---------------------------------------------\n\n" );
116
- printf (" -p <local port> | fixed local UDP port, defaults to %u\n" , N2N_SN_LPORT_DEFAULT );
116
+ printf (" -p [<ip>:]<port> | fixed local UDP port (defaults to %u) and optionally\n"
117
+ " | bind to sepcified local IP address only ('any' by default)\n" , N2N_SN_LPORT_DEFAULT );
117
118
printf (" -F <fed name> | name of the supernode's federation, defaults to\n"
118
119
" | '%s'\n" , (char * )FEDERATION_NAME );
119
120
printf (" -l <host:port> | ip address or name, and port of known supernode\n" );
@@ -167,14 +168,39 @@ static int setOption (int optkey, char *_optarg, n2n_sn_t *sss) {
167
168
//traceEvent(TRACE_NORMAL, "Option %c = %s", optkey, _optarg ? _optarg : "");
168
169
169
170
switch (optkey ) {
170
- case 'p' : /* local-port */
171
- sss -> lport = atoi (_optarg );
172
-
173
- if (sss -> lport == 0 )
174
- traceEvent (TRACE_WARNING , "bad local port format, defaulting to %u" , N2N_SN_LPORT_DEFAULT );
175
- // default is made sure in sn_init()
176
-
171
+ case 'p' : { /* local-port */
172
+ char * colon = strpbrk (_optarg , ":" );
173
+ if (colon ) { /*ip address:port */
174
+ * colon = 0 ;
175
+ sss -> bind_address = ntohl (inet_addr (_optarg ));
176
+ sss -> lport = atoi (++ colon );
177
+
178
+ if (sss -> bind_address == INADDR_NONE ) {
179
+ traceEvent (TRACE_WARNING , "bad address to bind to, binding to any IP address" );
180
+ sss -> bind_address = INADDR_ANY ;
181
+ }
182
+ if (sss -> lport == 0 ) {
183
+ traceEvent (TRACE_WARNING , "bad local port format, defaulting to %u" , N2N_SN_LPORT_DEFAULT );
184
+ sss -> lport = N2N_SN_LPORT_DEFAULT ;
185
+ }
186
+ } else { /* ip address or port only */
187
+ char * dot = strpbrk (_optarg , "." );
188
+ if (dot ) { /* ip address only */
189
+ sss -> bind_address = ntohl (inet_addr (_optarg ));
190
+ if (sss -> bind_address == INADDR_NONE ) {
191
+ traceEvent (TRACE_WARNING , "bad address to bind to, binding to any IP address" );
192
+ sss -> bind_address = INADDR_ANY ;
193
+ }
194
+ } else { /* port only */
195
+ sss -> lport = atoi (_optarg );
196
+ if (sss -> lport == 0 ) {
197
+ traceEvent (TRACE_WARNING , "bad local port format, defaulting to %u" , N2N_SN_LPORT_DEFAULT );
198
+ sss -> lport = N2N_SN_LPORT_DEFAULT ;
199
+ }
200
+ }
201
+ }
177
202
break ;
203
+ }
178
204
179
205
case 't' : /* mgmt-port */
180
206
sss -> mport = atoi (_optarg );
@@ -603,7 +629,7 @@ int main (int argc, char * const argv[]) {
603
629
604
630
traceEvent (TRACE_DEBUG , "traceLevel is %d" , getTraceLevel ());
605
631
606
- sss_node .sock = open_socket (sss_node .lport , INADDR_ANY , 0 /* UDP */ );
632
+ sss_node .sock = open_socket (sss_node .lport , sss_node . bind_address , 0 /* UDP */ );
607
633
if (-1 == sss_node .sock ) {
608
634
traceEvent (TRACE_ERROR , "failed to open main socket. %s" , strerror (errno ));
609
635
exit (-2 );
@@ -612,7 +638,7 @@ int main (int argc, char * const argv[]) {
612
638
}
613
639
614
640
#ifdef N2N_HAVE_TCP
615
- sss_node .tcp_sock = open_socket (sss_node .lport , INADDR_ANY , 1 /* TCP */ );
641
+ sss_node .tcp_sock = open_socket (sss_node .lport , sss_node . bind_address , 1 /* TCP */ );
616
642
if (-1 == sss_node .tcp_sock ) {
617
643
traceEvent (TRACE_ERROR , "failed to open auxiliary TCP socket, %s" , strerror (errno ));
618
644
exit (-2 );
0 commit comments