From c5a0addb961244f4a902c68e82625d79042a0441 Mon Sep 17 00:00:00 2001 From: John Regan Date: Wed, 11 Apr 2018 14:48:30 -0400 Subject: change localip is6 flag based on destination ip By default, the localip flag is initialized with the is6 flag set to 0. The only time the flag is changed to 1 is when a user specifies a local IPv6 address to use. Because of this, socket_tcp46 always creates an IPv4 socket. This patch corrects that - if the user hasn't specified a local address, then the local 'is6' flag is updated to match the destination 'is6' flag. Signed-off-by: Laurent Bercot --- src/conn-tools/s6-tcpclient.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/conn-tools/s6-tcpclient.c') diff --git a/src/conn-tools/s6-tcpclient.c b/src/conn-tools/s6-tcpclient.c index 062047c..5fdd7f0 100644 --- a/src/conn-tools/s6-tcpclient.c +++ b/src/conn-tools/s6-tcpclient.c @@ -56,6 +56,7 @@ static tain_t deadline ; int main (int argc, char const *const *argv) { int s ; + int localip = 0; tflags flags = TFLAGS_DEFAULT ; uint16_t remoteport ; PROG = "s6-tcpclient" ; @@ -97,7 +98,7 @@ int main (int argc, char const *const *argv) if (!uint0_scan(l.arg + n + 1, &flags.timeoutconn[1])) usage() ; break ; } - case 'i' : if (!ip46_scan(l.arg, &flags.localip)) usage() ; break ; + case 'i' : if (!ip46_scan(l.arg, &flags.localip)) usage() ; localip = 1 ; break ; case 'p' : if (!uint160_scan(l.arg, &flags.localport)) usage() ; break ; default : usage() ; } @@ -222,7 +223,10 @@ int main (int argc, char const *const *argv) for (; i < n[j] ; i++) { tain_t localdeadline ; - s = socket_tcp46(ip46_is6(&flags.localip)) ; +#ifdef SKALIBS_IPV6_ENABLED + if(!localip) flags.localip.is6 = ip46_is6(&ip[j][i]); +#endif + s = socket_tcp46(ip46_is6(&flags.localip)); if (s < 0) strerr_diefu1sys(111, "create socket") ; if (socket_bind46(s, &flags.localip, flags.localport) < 0) strerr_diefu1sys(111, "bind socket") ; -- cgit v1.2.3