/* Serial interface for raw TCP connections on Un*x like systems.

   Copyright (C) 1992-2020 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include "defs.h"
#include "serial.h"
#include "ser-base.h"
#include "ser-tcp.h"
#include "gdbcmd.h"
#include "cli/cli-decode.h"
#include "cli/cli-setshow.h"
#include "gdbsupport/filestuff.h"
#include "gdbsupport/netstuff.h"

#include <sys/types.h>

#ifdef HAVE_SYS_FILIO_H
#include <sys/filio.h>  /* For FIONBIO.  */
#endif
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>  /* For FIONBIO.  */
#endif

#include "gdbsupport/gdb_sys_time.h"

#ifdef USE_WIN32API
#include <ws2tcpip.h>
#ifndef ETIMEDOUT
#define ETIMEDOUT WSAETIMEDOUT
#endif
/* Gnulib defines close too, but gnulib's replacement
   doesn't call closesocket unless we import the
   socketlib module.  */
#undef close
#define close(fd) closesocket (fd)
#define ioctl ioctlsocket
#else
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#endif

#include <signal.h>
#include "gdb_select.h"
#include <algorithm>

#ifndef HAVE_SOCKLEN_T
typedef int socklen_t;
#endif

/* For "set tcp" and "show tcp".  */

static struct cmd_list_element *tcp_set_cmdlist;
static struct cmd_list_element *tcp_show_cmdlist;

/* Whether to auto-retry refused connections.  */

static bool tcp_auto_retry = true;

/* Timeout period for connections, in seconds.  */

static unsigned int tcp_retry_limit = 15;

/* How many times per second to poll deprecated_ui_loop_hook.  */

#define POLL_INTERVAL 5

/* Helper function to wait a while.  If SOCK is not -1, wait on its
   file descriptor.  Otherwise just wait on a timeout, updating
   *POLLS.  Returns -1 on timeout or interrupt, otherwise the value of
   select.  */

static int
wait_for_connect (int sock, unsigned int *polls)
{
  struct timeval t;
  int n;

  /* While we wait for the connect to complete, 
     poll the UI so it can update or the user can 
     interrupt.  */
  if (deprecated_ui_loop_hook && deprecated_ui_loop_hook (0))
    {
      errno = EINTR;
      return -1;
    }

  /* Check for timeout.  */
  if (*polls > tcp_retry_limit * POLL_INTERVAL)
    {
      errno = ETIMEDOUT;
      return -1;
    }

  /* Back off to polling once per second after the first POLL_INTERVAL
     polls.  */
  if (*polls < POLL_INTERVAL)
    {
      t.tv_sec = 0;
      t.tv_usec = 1000000 / POLL_INTERVAL;
    }
  else
    {
      t.tv_sec = 1;
      t.tv_usec = 0;
    }

  if (sock >= 0)
    {
      fd_set rset, wset, eset;

      FD_ZERO (&rset);
      FD_SET (sock, &rset);
      wset = rset;
      eset = rset;

      /* POSIX systems return connection success or failure by signalling
	 wset.  Windows systems return success in wset and failure in
	 eset.

	 We must call select here, rather than gdb_select, because
	 the serial structure has not yet been initialized - the
	 MinGW select wrapper will not know that this FD refers
	 to a socket.  */
      n = select (sock + 1, &rset, &wset, &eset, &t);
    }
  else
    /* Use gdb_select here, since we have no file descriptors, and on
       Windows, plain select doesn't work in that case.  */
    n = gdb_select (0, NULL, NULL, NULL, &t);

  /* If we didn't time out, only count it as one poll.  */
  if (n > 0 || *polls < POLL_INTERVAL)
    (*polls)++;
  else
    (*polls) += POLL_INTERVAL;

  return n;
}

/* Try to connect to the host represented by AINFO.  If the connection
   succeeds, return its socket.  Otherwise, return -1 and set ERRNO
   accordingly.  POLLS is used when 'connect' returns EINPROGRESS, and
   we need to invoke 'wait_for_connect' to obtain the status.  */

static int
try_connect (const struct addrinfo *ainfo, unsigned int *polls)
{
  int sock = gdb_socket_cloexec (ainfo->ai_family, ainfo->ai_socktype,
				 ainfo->ai_protocol);

  if (sock < 0)
    return -1;

  /* Set socket nonblocking.  */
#ifdef USE_WIN32API
  u_long ioarg = 1;
#else
  int ioarg = 1;
#endif

  ioctl (sock, FIONBIO, &ioarg);

  /* Use Non-blocking connect.  connect() will return 0 if connected
     already.  */
  if (connect (sock, ainfo->ai_addr, ainfo->ai_addrlen) < 0)
    {
#ifdef USE_WIN32API
      int err = WSAGetLastError();
#else
      int err = errno;
#endif

      /* If we've got a "connection refused" error, just return
	 -1.  The caller will know what to do.  */
      if (
#ifdef USE_WIN32API
	  err == WSAECONNREFUSED
#else
	  err == ECONNREFUSED
#endif
	  )
	{
	  close (sock);
	  errno = err;
	  return -1;
	}

      if (
	  /* Any other error (except EINPROGRESS) will be "swallowed"
	     here.  We return without specifying a return value, and
	     set errno if the caller wants to inspect what
	     happened.  */
#ifdef USE_WIN32API
	  /* Under Windows, calling "connect" with a non-blocking socket
	     results in WSAEWOULDBLOCK, not WSAEINPROGRESS.  */
	  err != WSAEWOULDBLOCK
#else
	  err != EINPROGRESS
#endif
	  )
	{
	  close (sock);
	  errno = err;
	  return -1;
	}

      /* Looks like we need to wait for the connect.  */
      int n;

      do
	n = wait_for_connect (sock, polls);
      while (n == 0);

      if (n < 0)
	{
	  int saved_errno = errno;

	  /* A negative value here means that we either timed out or
	     got interrupted by the user.  Just return.  */
	  close (sock);
	  errno = saved_errno;
	  return -1;
	}
    }

  /* Got something.  Is it an error?  */
  int err;
  socklen_t len = sizeof (err);

  /* On Windows, the fourth parameter to getsockopt is a "char *";
     on UNIX systems it is generally "void *".  The cast to "char *"
     is OK everywhere, since in C++ any data pointer type can be
     implicitly converted to "void *".  */
  int ret = getsockopt (sock, SOL_SOCKET, SO_ERROR, (char *) &err, &len);

  if (ret < 0)
    {
      int saved_errno = errno;

      close (sock);
      errno = saved_errno;
      return -1;
    }
  else if (ret == 0 && err != 0)
    {
      close (sock);
      errno = err;
      return -1;
    }

  /* The connection succeeded.  Return the socket.  */
  return sock;
}

/* Open a tcp socket.  */

int
net_open (struct serial *scb, const char *name)
{
  struct addrinfo hint;
  struct addrinfo *ainfo;

  memset (&hint, 0, sizeof (hint));
  /* Assume no prefix will be passed, therefore we should use
     AF_UNSPEC.  */
  hint.ai_family = AF_UNSPEC;
  hint.ai_socktype = SOCK_STREAM;
  hint.ai_protocol = IPPROTO_TCP;

  parsed_connection_spec parsed = parse_connection_spec (name, &hint);

  if (parsed.port_str.empty ())
    error (_("Missing port on hostname '%s'"), name);

  int r = getaddrinfo (parsed.host_str.c_str (),
		       parsed.port_str.c_str (),
		       &hint, &ainfo);

  if (r != 0)
    {
      fprintf_unfiltered (gdb_stderr, _("%s: cannot resolve name: %s\n"),
			  name, gai_strerror (r));
      errno = ENOENT;
      return -1;
    }

  scoped_free_addrinfo free_ainfo (ainfo);

  /* Flag to indicate whether we've got a connection refused.  It will
     be true if any of the connections tried was refused.  */
  bool got_connrefused;
  /* If a connection succeeds, SUCCESS_AINFO will point to the
     'struct addrinfo' that succeed.  */
  struct addrinfo *success_ainfo = NULL;
  unsigned int polls = 0;

  /* Assume the worst.  */
  scb->fd = -1;

  do
    {
      got_connrefused = false;

      for (addrinfo *iter = ainfo; iter != NULL; iter = iter->ai_next)
	{
	  /* Iterate over the list of possible addresses to connect
	     to.  For each, we'll try to connect and see if it
	     succeeds.  */
	  int sock = try_connect (iter, &polls);

	  if (sock >= 0)
	    {
	      /* We've gotten a successful connection.  Save its
		 'struct addrinfo', the socket, and break.  */
	      success_ainfo = iter;
	      scb->fd = sock;
	      break;
	    }
	  else if (
#ifdef USE_WIN32API
	  errno == WSAECONNREFUSED
#else
	  errno == ECONNREFUSED
#endif
		   )
	    got_connrefused = true;
	}
    }
  /* Just retry if:

     - tcp_auto_retry is true, and
     - We haven't gotten a connection yet, and
     - Any of our connection attempts returned with ECONNREFUSED, and
     - wait_for_connect signals that we can keep going.  */
  while (tcp_auto_retry
	 && success_ainfo == NULL
	 && got_connrefused
	 && wait_for_connect (-1, &polls) >= 0);

  if (success_ainfo == NULL)
    {
      net_close (scb);
      return -1;
    }

  /* Turn off nonblocking.  */
#ifdef USE_WIN32API
  u_long ioarg = 0;
#else
  int ioarg = 0;
#endif

  ioctl (scb->fd, FIONBIO, &ioarg);

  if (success_ainfo->ai_protocol == IPPROTO_TCP)
    {
      /* Disable Nagle algorithm.  Needed in some cases.  */
      int tmp = 1;

      setsockopt (scb->fd, IPPROTO_TCP, TCP_NODELAY,
		  (char *) &tmp, sizeof (tmp));
    }

#ifdef SIGPIPE
  /* If we don't do this, then GDB simply exits
     when the remote side dies.  */
  signal (SIGPIPE, SIG_IGN);
#endif

  return 0;
}

void
net_close (struct serial *scb)
{
  if (scb->fd == -1)
    return;

  close (scb->fd);
  scb->fd = -1;
}

int
net_read_prim (struct serial *scb, size_t count)
{
  /* Need to cast to silence -Wpointer-sign on MinGW, as Winsock's
     'recv' takes 'char *' as second argument, while 'scb->buf' is
     'unsigned char *'.  */
  return recv (scb->fd, (char *) scb->buf, count, 0);
}

int
net_write_prim (struct serial *scb, const void *buf, size_t count)
{
  /* On Windows, the second parameter to send is a "const char *"; on
     UNIX systems it is generally "const void *".  The cast to "const
     char *" is OK everywhere, since in C++ any data pointer type can
     be implicitly converted to "const void *".  */
  return send (scb->fd, (const char *) buf, count, 0);
}

int
ser_tcp_send_break (struct serial *scb)
{
  /* Send telnet IAC and BREAK characters.  */
  return (serial_write (scb, "\377\363", 2));
}

/* Support for "set tcp" and "show tcp" commands.  */

static void
set_tcp_cmd (const char *args, int from_tty)
{
  help_list (tcp_set_cmdlist, "set tcp ", all_commands, gdb_stdout);
}

static void
show_tcp_cmd (const char *args, int from_tty)
{
  help_list (tcp_show_cmdlist, "show tcp ", all_commands, gdb_stdout);
}

#ifndef USE_WIN32API

/* The TCP ops.  */

static const struct serial_ops tcp_ops =
{
  "tcp",
  net_open,
  net_close,
  NULL,
  ser_base_readchar,
  ser_base_write,
  ser_base_flush_output,
  ser_base_flush_input,
  ser_tcp_send_break,
  ser_base_raw,
  ser_base_get_tty_state,
  ser_base_copy_tty_state,
  ser_base_set_tty_state,
  ser_base_print_tty_state,
  ser_base_setbaudrate,
  ser_base_setstopbits,
  ser_base_setparity,
  ser_base_drain_output,
  ser_base_async,
  net_read_prim,
  net_write_prim
};

#endif /* USE_WIN32API */

void
_initialize_ser_tcp (void)
{
#ifdef USE_WIN32API
  /* Do nothing; the TCP serial operations will be initialized in
     ser-mingw.c.  */
#else
  serial_add_interface (&tcp_ops);
#endif /* USE_WIN32API */

  add_prefix_cmd ("tcp", class_maintenance, set_tcp_cmd, _("\
TCP protocol specific variables.\n\
Configure variables specific to remote TCP connections."),
		  &tcp_set_cmdlist, "set tcp ",
		  0 /* allow-unknown */, &setlist);
  add_prefix_cmd ("tcp", class_maintenance, show_tcp_cmd, _("\
TCP protocol specific variables.\n\
Configure variables specific to remote TCP connections."),
		  &tcp_show_cmdlist, "show tcp ",
		  0 /* allow-unknown */, &showlist);

  add_setshow_boolean_cmd ("auto-retry", class_obscure,
			   &tcp_auto_retry, _("\
Set auto-retry on socket connect."), _("\
Show auto-retry on socket connect."),
			   NULL, NULL, NULL,
			   &tcp_set_cmdlist, &tcp_show_cmdlist);

  add_setshow_uinteger_cmd ("connect-timeout", class_obscure,
			    &tcp_retry_limit, _("\
Set timeout limit in seconds for socket connection."), _("\
Show timeout limit in seconds for socket connection."), _("\
If set to \"unlimited\", GDB will keep attempting to establish a\n\
connection forever, unless interrupted with Ctrl-c.\n\
The default is 15 seconds."),
			    NULL, NULL,
			    &tcp_set_cmdlist, &tcp_show_cmdlist);
}
