Don't set terminal flags twice in a row
[deliverable/binutils-gdb.git] / gdb / inflow.c
index 7ffa83a17fb5b1b87e3eb49fa1c0f29abe7f3819..d46d6938e27d4e555a672a713f4793a62096a169 100644 (file)
 
 #include "inflow.h"
 #include "gdbcmd.h"
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#endif
+#include "job-control.h"
 
 #ifdef HAVE_SYS_IOCTL_H
 #include <sys/ioctl.h>
@@ -40,8 +44,6 @@
 #define O_NOCTTY 0
 #endif
 
-extern void _initialize_inflow (void);
-
 static void pass_signal (int);
 
 static void child_terminal_ours_1 (int);
@@ -64,9 +66,9 @@ struct terminal_info
      it when it resumes.  */
   serial_ttystate ttystate;
 
-#ifdef PROCESS_GROUP_TYPE
+#ifdef HAVE_TERMIOS_H
   /* Process group.  Saved and restored just like ttystate.  */
-  PROCESS_GROUP_TYPE process_group;
+  pid_t process_group;
 #endif
 
   /* fcntl flags.  Saved and restored just like ttystate.  */
@@ -89,11 +91,11 @@ static serial_ttystate initial_gdb_ttystate;
 
 static struct terminal_info *get_inflow_inferior_data (struct inferior *);
 
-#ifdef PROCESS_GROUP_TYPE
+#ifdef HAVE_TERMIOS_H
 
 /* Return the process group of the current inferior.  */
 
-PROCESS_GROUP_TYPE
+pid_t
 inferior_process_group (void)
 {
   return get_inflow_inferior_data (current_inferior ())->process_group;
@@ -121,25 +123,6 @@ static const char *inferior_thisrun_terminal;
 
 int terminal_is_ours;
 
-#ifdef PROCESS_GROUP_TYPE
-static PROCESS_GROUP_TYPE
-gdb_getpgrp (void)
-{
-  int process_group = -1;
-
-#ifdef HAVE_TERMIOS
-  process_group = tcgetpgrp (0);
-#endif
-#ifdef HAVE_TERMIO
-  process_group = getpgrp ();
-#endif
-#ifdef HAVE_SGTTY
-  ioctl (0, TIOCGPGRP, &process_group);
-#endif
-  return process_group;
-}
-#endif
-
 /* See terminal.h.  */
 
 void
@@ -157,8 +140,8 @@ set_initial_gdb_ttystate (void)
 #ifdef F_GETFL
       our_terminal_info.tflags = fcntl (0, F_GETFL, 0);
 #endif
-#ifdef PROCESS_GROUP_TYPE
-      our_terminal_info.process_group = gdb_getpgrp ();
+#ifdef HAVE_TERMIOS_H
+      our_terminal_info.process_group = tcgetpgrp (0);
 #endif
     }
 }
@@ -187,7 +170,7 @@ child_terminal_init_with_pgrp (int pgrp)
   struct inferior *inf = current_inferior ();
   struct terminal_info *tinfo = get_inflow_inferior_data (inf);
 
-#ifdef PROCESS_GROUP_TYPE
+#ifdef HAVE_TERMIOS_H
   /* Store the process group even without a terminal as it is used not
      only to reset the tty foreground process group, but also to
      interrupt the inferior.  */
@@ -224,15 +207,15 @@ gdb_save_tty_state (void)
 void
 child_terminal_init (struct target_ops *self)
 {
-#ifdef PROCESS_GROUP_TYPE
+#ifdef HAVE_TERMIOS_H
   /* This is for Lynx, and should be cleaned up by having Lynx be a
-     separate debugging target with a version of target_terminal_init
+     separate debugging target with a version of target_terminal::init
      which passes in the process group to a generic routine which does
      all the work (and the non-threaded child_terminal_init can just
      pass in inferior_ptid to the same routine).  */
   /* We assume INFERIOR_PID is also the child's process group.  */
   child_terminal_init_with_pgrp (ptid_get_pid (inferior_ptid));
-#endif /* PROCESS_GROUP_TYPE */
+#endif /* HAVE_TERMIOS_H */
 }
 
 /* Put the inferior's terminal settings into effect.
@@ -261,19 +244,11 @@ child_terminal_inferior (struct target_ops *self)
       int result;
 
 #ifdef F_GETFL
-      /* Is there a reason this is being done twice?  It happens both
-         places we use F_SETFL, so I'm inclined to think perhaps there
-         is some reason, however perverse.  Perhaps not though...  */
-      result = fcntl (0, F_SETFL, tinfo->tflags);
       result = fcntl (0, F_SETFL, tinfo->tflags);
       OOPSY ("fcntl F_SETFL");
 #endif
 
-      /* Because we were careful to not change in or out of raw mode in
-         terminal_ours, we will not change in our out of raw mode with
-         this call, so we don't flush any input.  */
-      result = serial_set_tty_state (stdin_serial,
-                                    tinfo->ttystate);
+      result = serial_set_tty_state (stdin_serial, tinfo->ttystate);
       OOPSY ("setting tty state");
 
       if (!job_control)
@@ -298,19 +273,12 @@ child_terminal_inferior (struct target_ops *self)
 
       if (job_control)
        {
-#ifdef HAVE_TERMIOS
+#ifdef HAVE_TERMIOS_H
          result = tcsetpgrp (0, tinfo->process_group);
          if (!inf->attach_flag)
            OOPSY ("tcsetpgrp");
 #endif
-
-#ifdef HAVE_SGTTY
-         result = ioctl (0, TIOCSPGRP, &tinfo->process_group);
-         if (!inf->attach_flag)
-           OOPSY ("TIOCSPGRP");
-#endif
        }
-
     }
   terminal_is_ours = 0;
 }
@@ -388,34 +356,20 @@ child_terminal_ours_1 (int output_only)
       xfree (tinfo->ttystate);
       tinfo->ttystate = serial_get_tty_state (stdin_serial);
 
-#ifdef PROCESS_GROUP_TYPE
+#ifdef HAVE_TERMIOS_H
       if (!inf->attach_flag)
-       /* If setpgrp failed in terminal_inferior, this would give us
+       /* If tcsetpgrp failed in terminal_inferior, this would give us
           our process group instead of the inferior's.  See
           terminal_inferior for details.  */
-       tinfo->process_group = gdb_getpgrp ();
+       tinfo->process_group = tcgetpgrp (0);
 #endif
 
-      /* Here we used to set ICANON in our ttystate, but I believe this
-         was an artifact from before when we used readline.  Readline sets
-         the tty state when it needs to.
-         FIXME-maybe: However, query() expects non-raw mode and doesn't
-         use readline.  Maybe query should use readline (on the other hand,
-         this only matters for HAVE_SGTTY, not termio or termios, I think).  */
-
-      /* Set tty state to our_ttystate.  We don't change in our out of raw
-         mode, to avoid flushing input.  We need to do the same thing
-         regardless of output_only, because we don't have separate
-         terminal_is_ours and terminal_is_ours_for_output flags.  It's OK,
-         though, since readline will deal with raw mode when/if it needs
-         to.  */
-
-      serial_noflush_set_tty_state (stdin_serial, our_terminal_info.ttystate,
-                                   tinfo->ttystate);
+      /* Set tty state to our_ttystate.  */
+      serial_set_tty_state (stdin_serial, our_terminal_info.ttystate);
 
       if (job_control)
        {
-#ifdef HAVE_TERMIOS
+#ifdef HAVE_TERMIOS_H
          result = tcsetpgrp (0, our_terminal_info.process_group);
 #if 0
          /* This fails on Ultrix with EINVAL if you run the testsuite
@@ -428,10 +382,6 @@ child_terminal_ours_1 (int output_only)
                                safe_strerror (errno));
 #endif
 #endif /* termios */
-
-#ifdef HAVE_SGTTY
-         result = ioctl (0, TIOCSPGRP, &our_terminal_info.process_group);
-#endif
        }
 
 #ifdef SIGTTOU
@@ -449,11 +399,6 @@ child_terminal_ours_1 (int output_only)
 
 #ifdef F_GETFL
       tinfo->tflags = fcntl (0, F_GETFL, 0);
-
-      /* Is there a reason this is being done twice?  It happens both
-         places we use F_SETFL, so I'm inclined to think perhaps there
-         is some reason, however perverse.  Perhaps not though...  */
-      result = fcntl (0, F_SETFL, our_terminal_info.tflags);
       result = fcntl (0, F_SETFL, our_terminal_info.tflags);
 #endif
     }
@@ -534,9 +479,9 @@ copy_terminal_info (struct inferior *to, struct inferior *from)
 }
 
 void
-term_info (char *arg, int from_tty)
+info_terminal_command (char *arg, int from_tty)
 {
-  target_terminal_info (arg, from_tty);
+  target_terminal::info (arg, from_tty);
 }
 
 void
@@ -616,7 +561,7 @@ child_terminal_info (struct target_ops *self, const char *args, int from_tty)
     printf_filtered ("\n");
   }
 
-#ifdef PROCESS_GROUP_TYPE
+#ifdef HAVE_TERMIOS_H
   printf_filtered ("Process group = %d\n", (int) tinfo->process_group);
 #endif
 
@@ -803,43 +748,6 @@ create_tty_session (void)
 #endif /* HAVE_SETSID */
 }
 
-/* This is here because this is where we figure out whether we (probably)
-   have job control.  Just using job_control only does part of it because
-   setpgid or setpgrp might not exist on a system without job control.
-   It might be considered misplaced (on the other hand, process groups and
-   job control are closely related to ttys).
-
-   For a more clean implementation, in libiberty, put a setpgid which merely
-   calls setpgrp and a setpgrp which does nothing (any system with job control
-   will have one or the other).  */
-int
-gdb_setpgid (void)
-{
-  int retval = 0;
-
-  if (job_control)
-    {
-#if defined (HAVE_TERMIOS) || defined (TIOCGPGRP)
-#ifdef HAVE_SETPGID
-      /* The call setpgid (0, 0) is supposed to work and mean the same
-         thing as this, but on Ultrix 4.2A it fails with EPERM (and
-         setpgid (getpid (), getpid ()) succeeds).  */
-      retval = setpgid (getpid (), getpid ());
-#else
-#ifdef HAVE_SETPGRP
-#ifdef SETPGRP_VOID 
-      retval = setpgrp ();
-#else
-      retval = setpgrp (getpid (), getpid ());
-#endif
-#endif /* HAVE_SETPGRP */
-#endif /* HAVE_SETPGID */
-#endif /* defined (HAVE_TERMIOS) || defined (TIOCGPGRP) */
-    }
-
-  return retval;
-}
-
 /* Get all the current tty settings (including whether we have a
    tty at all!).  We can't do this in _initialize_inflow because
    serial_fdopen() won't work until the serial_ops_list is
@@ -855,35 +763,13 @@ initialize_stdin_serial (void)
 void
 _initialize_inflow (void)
 {
-  add_info ("terminal", term_info,
+  add_info ("terminal", info_terminal_command,
            _("Print inferior's saved terminal status."));
 
   terminal_is_ours = 1;
 
-  /* OK, figure out whether we have job control.  If neither termios nor
-     sgtty (i.e. termio or go32), leave job_control 0.  */
-
-#if defined (HAVE_TERMIOS)
-  /* Do all systems with termios have the POSIX way of identifying job
-     control?  I hope so.  */
-#ifdef _POSIX_JOB_CONTROL
-  job_control = 1;
-#else
-#ifdef _SC_JOB_CONTROL
-  job_control = sysconf (_SC_JOB_CONTROL);
-#else
-  job_control = 0;             /* Have to assume the worst.  */
-#endif /* _SC_JOB_CONTROL */
-#endif /* _POSIX_JOB_CONTROL */
-#endif /* HAVE_TERMIOS */
-
-#ifdef HAVE_SGTTY
-#ifdef TIOCGPGRP
-  job_control = 1;
-#else
-  job_control = 0;
-#endif /* TIOCGPGRP */
-#endif /* sgtty */
+  /* OK, figure out whether we have job control.  */
+  have_job_control ();
 
   observer_attach_inferior_exit (inflow_inferior_exit);
 
This page took 0.027842 seconds and 4 git commands to generate.