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

   Copyright (C) 1992-2019 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 "common/filestuff.h"
#include "common/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 "common/gdb_sys_time.h"

#ifdef USE_WIN32API
#if _WIN32_WINNT < 0x0501
# undef _WIN32_WINNT
# define _WIN32_WINNT 0x0501
#endif
#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 int tcp_auto_retry = 1;

/* 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 succeeeds, 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 (struct 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);
}
