Commit cf6c5c22 authored by Peter Wu's avatar Peter Wu Committed by Daniel Stenberg
Browse files

sws: move away from IPv4/IPv4-only assumption



Instead of depending the socket domain type on use_ipv6, specify the
domain type (AF_INET / AF_INET6) as variable. An enum is used here with
switch to avoid compiler warnings in connect_to, complaining that rc
is possibly undefined (which is not possible as socket_domain is
always set).

Besides abstracting the socket type, make the debugging messages be
independent on IP (introduce location_str which points to "port XXXXX").
Rename "ipv_inuse" to "socket_type" and tighten the scope (main).

Signed-off-by: default avatarPeter Wu <peter@lekensteyn.nl>
parent aba5888f
Loading
Loading
Loading
Loading
+39 −49
Original line number Diff line number Diff line
@@ -65,11 +65,13 @@
#define ERANGE  34 /* errno.h value */
#endif

static enum {
  socket_domain_inet = AF_INET,
#ifdef ENABLE_IPV6
static bool use_ipv6 = FALSE;
  socket_domain_inet6 = AF_INET6
#endif
} socket_domain = AF_INET;
static bool use_gopher = FALSE;
static const char *ipv_inuse = "IPv4";
static int serverlogslocked = 0;
static bool is_proxy = FALSE;

@@ -1289,7 +1291,7 @@ static curl_socket_t connect_to(const char *ipaddr, unsigned short port)
#endif

#ifdef ENABLE_IPV6
  if(use_ipv6) {
  if(socket_domain == AF_INET6) {
    op_br = "[";
    cl_br = "]";
  }
@@ -1301,14 +1303,8 @@ static curl_socket_t connect_to(const char *ipaddr, unsigned short port)
  logmsg("about to connect to %s%s%s:%hu",
         op_br, ipaddr, cl_br, port);

#ifdef ENABLE_IPV6
  if(!use_ipv6)
#endif
    serverfd = socket(AF_INET, SOCK_STREAM, 0);
#ifdef ENABLE_IPV6
  else
    serverfd = socket(AF_INET6, SOCK_STREAM, 0);
#endif

  serverfd = socket(socket_domain, SOCK_STREAM, 0);
  if(CURL_SOCKET_BAD == serverfd) {
    error = SOCKERRNO;
    logmsg("Error creating socket for server conection: (%d) %s",
@@ -1326,9 +1322,8 @@ static curl_socket_t connect_to(const char *ipaddr, unsigned short port)
    logmsg("TCP_NODELAY set for server conection");
#endif

#ifdef ENABLE_IPV6
  if(!use_ipv6) {
#endif
  switch(socket_domain) {
  case AF_INET:
    memset(&serveraddr.sa4, 0, sizeof(serveraddr.sa4));
    serveraddr.sa4.sin_family = AF_INET;
    serveraddr.sa4.sin_port = htons(port);
@@ -1339,9 +1334,9 @@ static curl_socket_t connect_to(const char *ipaddr, unsigned short port)
    }

    rc = connect(serverfd, &serveraddr.sa, sizeof(serveraddr.sa4));
    break;
#ifdef ENABLE_IPV6
  }
  else {
  case AF_INET6:
    memset(&serveraddr.sa6, 0, sizeof(serveraddr.sa6));
    serveraddr.sa6.sin6_family = AF_INET6;
    serveraddr.sa6.sin6_port = htons(port);
@@ -1352,8 +1347,9 @@ static curl_socket_t connect_to(const char *ipaddr, unsigned short port)
    }

    rc = connect(serverfd, &serveraddr.sa, sizeof(serveraddr.sa6));
  }
    break;
#endif /* ENABLE_IPV6 */
  }

  if(got_exit_signal) {
    sclose(serverfd);
@@ -1942,6 +1938,9 @@ int main(int argc, char *argv[])
  int arg=1;
  long pid;
  const char *connecthost = "127.0.0.1";
  const char *socket_type = "IPv4";
  char port_str[11];
  const char *location_str = port_str;

  /* a default CONNECT port is basically pointless but still ... */
  size_t socket_idx;
@@ -1950,13 +1949,9 @@ int main(int argc, char *argv[])

  while(argc>arg) {
    if(!strcmp("--version", argv[arg])) {
      printf("sws IPv4%s"
             "\n"
             ,
      puts("sws IPv4"
#ifdef ENABLE_IPV6
             "/IPv6"
#else
             ""
#endif
          );
      return 0;
@@ -1977,16 +1972,16 @@ int main(int argc, char *argv[])
      end_of_headers = "\r\n"; /* gopher style is much simpler */
    }
    else if(!strcmp("--ipv4", argv[arg])) {
#ifdef ENABLE_IPV6
      ipv_inuse = "IPv4";
      use_ipv6 = FALSE;
#endif
      socket_type = "IPv4";
      socket_domain = AF_INET;
      location_str = port_str;
      arg++;
    }
    else if(!strcmp("--ipv6", argv[arg])) {
#ifdef ENABLE_IPV6
      ipv_inuse = "IPv6";
      use_ipv6 = TRUE;
      socket_type = "IPv6";
      socket_domain = AF_INET6;
      location_str = port_str;
#endif
      arg++;
    }
@@ -2039,6 +2034,8 @@ int main(int argc, char *argv[])
    }
  }

  snprintf(port_str, sizeof(port_str), "port %hu", port);

#ifdef WIN32
  win32_init();
  atexit(win32_cleanup);
@@ -2048,14 +2045,7 @@ int main(int argc, char *argv[])

  pid = (long)getpid();

#ifdef ENABLE_IPV6
  if(!use_ipv6)
#endif
    sock = socket(AF_INET, SOCK_STREAM, 0);
#ifdef ENABLE_IPV6
  else
    sock = socket(AF_INET6, SOCK_STREAM, 0);
#endif
  sock = socket(socket_domain, SOCK_STREAM, 0);

  all_sockets[0] = sock;
  num_sockets = 1;
@@ -2082,33 +2072,33 @@ int main(int argc, char *argv[])
    goto sws_cleanup;
  }

#ifdef ENABLE_IPV6
  if(!use_ipv6) {
#endif
  switch(socket_domain) {
  case AF_INET:
    memset(&me.sa4, 0, sizeof(me.sa4));
    me.sa4.sin_family = AF_INET;
    me.sa4.sin_addr.s_addr = INADDR_ANY;
    me.sa4.sin_port = htons(port);
    rc = bind(sock, &me.sa, sizeof(me.sa4));
    break;
#ifdef ENABLE_IPV6
  }
  else {
  case AF_INET6:
    memset(&me.sa6, 0, sizeof(me.sa6));
    me.sa6.sin6_family = AF_INET6;
    me.sa6.sin6_addr = in6addr_any;
    me.sa6.sin6_port = htons(port);
    rc = bind(sock, &me.sa, sizeof(me.sa6));
  }
    break;
#endif /* ENABLE_IPV6 */
  }
  if(0 != rc) {
    error = SOCKERRNO;
    logmsg("Error binding socket on port %hu: (%d) %s",
           port, error, strerror(error));
    logmsg("Error binding socket on %s: (%d) %s",
           location_str, error, strerror(error));
    goto sws_cleanup;
  }

  logmsg("Running %s %s version on port %d",
         use_gopher?"GOPHER":"HTTP", ipv_inuse, (int)port);
  logmsg("Running %s %s version on %s",
         use_gopher?"GOPHER":"HTTP", socket_type, location_str);

  /* start accepting connections */
  rc = listen(sock, 5);
@@ -2273,8 +2263,8 @@ sws_cleanup:
  restore_signal_handlers();

  if(got_exit_signal) {
    logmsg("========> %s sws (port: %d pid: %ld) exits with signal (%d)",
           ipv_inuse, (int)port, pid, exit_signal);
    logmsg("========> %s sws (%s pid: %ld) exits with signal (%d)",
           socket_type, location_str, pid, exit_signal);
    /*
     * To properly set the return status of the process we
     * must raise the same signal SIGINT or SIGTERM that we