/* Host support routines for MinGW, for GDB, the GNU debugger.

   Copyright (C) 2006-2024 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 "gdbsupport/event-loop.h"
#include "gdbsupport/gdb_select.h"
#include "inferior.h"
#include <signal.h>

/* Wrapper for select.  Nothing special needed on POSIX platforms.  */

int
gdb_select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
	    struct timeval *timeout)
{
  return select (n, readfds, writefds, exceptfds, timeout);
}

/* Host-dependent console fputs method.  POSIX platforms always return
   zero, to use the default C 'fputs'.  */
int
gdb_console_fputs (const char *buf, FILE *f)
{
  return 0;
}

/* See inferior.h.  */

tribool
sharing_input_terminal (int pid)
{
  /* Using host-dependent code here is fine, because the
     child_terminal_foo functions are meant to be used by child/native
     targets.  */
#if defined (__linux__) || defined (__sun__)
  char buf[100];

  xsnprintf (buf, sizeof (buf), "/proc/%d/fd/0", pid);
  return is_gdb_terminal (buf);
#else
  return TRIBOOL_UNKNOWN;
#endif
}

/* Current C-c handler.  */
static c_c_handler_ftype *current_handler;

/* A wrapper that reinstalls the current signal handler.  */
static void
handler_wrapper (int num)
{
  signal (num, handler_wrapper);
  if (current_handler != SIG_IGN)
    current_handler (num);
}

/* See inferior.h.  */

c_c_handler_ftype *
install_sigint_handler (c_c_handler_ftype *fn)
{
  signal (SIGINT, handler_wrapper);
  c_c_handler_ftype *result = current_handler;
  current_handler = fn;
  return result;
}
