X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Finflow.c;h=f2c306c856fbf988b9dc02fc576dbfcfe9932c15;hb=2c500098f2a2ade0966e2ac10e0e714474cfcd92;hp=c2b6d567ec88e29a1c891604985281718500922c;hpb=2acceee2182a942e6a79a972009540990f4dfabf;p=binutils-gdb.git diff --git a/gdb/inflow.c b/gdb/inflow.c index c2b6d567ec8..f2c306c856f 100644 --- a/gdb/inflow.c +++ b/gdb/inflow.c @@ -1,5 +1,7 @@ /* Low level interface to ptrace, for GDB when running under Unix. - Copyright 1986-87, 1989, 1991-92, 1995, 1998 Free Software Foundation, Inc. + Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, + 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004 + Free Software Foundation, Inc. This file is part of GDB. @@ -22,7 +24,6 @@ #include "frame.h" #include "inferior.h" #include "command.h" -#include "signals.h" #include "serial.h" #include "terminal.h" #include "target.h" @@ -35,42 +36,27 @@ #include #endif -#ifdef HAVE_TERMIOS -#define PROCESS_GROUP_TYPE pid_t -#endif +#include "inflow.h" -#ifdef HAVE_TERMIO -#define PROCESS_GROUP_TYPE int -#endif - -#ifdef HAVE_SGTTY -#ifdef SHORT_PGRP -/* This is only used for the ultra. Does it have pid_t? */ -#define PROCESS_GROUP_TYPE short -#else -#define PROCESS_GROUP_TYPE int +#ifdef HAVE_SYS_IOCTL_H +#include #endif -#endif /* sgtty */ #if defined (SIGIO) && defined (FASYNC) && defined (FD_SET) && defined (F_SETOWN) -static void -handle_sigio PARAMS ((int)); +static void handle_sigio (int); #endif -extern void _initialize_inflow PARAMS ((void)); +extern void _initialize_inflow (void); -static void -pass_signal PARAMS ((int)); +static void pass_signal (int); -static void -kill_command PARAMS ((char *, int)); +static void kill_command (char *, int); -static void -terminal_ours_1 PARAMS ((int)); +static void terminal_ours_1 (int); /* Record terminal status separately for debugger and inferior. */ -static serial_t stdin_serial; +static struct serial *stdin_serial; /* TTY state for the inferior. We save it whenever the inferior stops, and restore it when it resumes. */ @@ -120,7 +106,7 @@ gdb_has_a_terminal_flag = have_not_checked; /* Does GDB have a terminal (on stdin)? */ int -gdb_has_a_terminal () +gdb_has_a_terminal (void) { switch (gdb_has_a_terminal_flag) { @@ -129,19 +115,20 @@ gdb_has_a_terminal () case no: return 0; case have_not_checked: - /* Get all the current tty settings (including whether we have a tty at - all!). Can't do this in _initialize_inflow because SERIAL_FDOPEN - won't work until the serial_ops_list is initialized. */ + /* Get all the current tty settings (including whether we have a + tty at all!). Can't do this in _initialize_inflow because + serial_fdopen() won't work until the serial_ops_list is + initialized. */ #ifdef F_GETFL tflags_ours = fcntl (0, F_GETFL, 0); #endif gdb_has_a_terminal_flag = no; - stdin_serial = SERIAL_FDOPEN (0); + stdin_serial = serial_fdopen (0); if (stdin_serial != NULL) { - our_ttystate = SERIAL_GET_TTY_STATE (stdin_serial); + our_ttystate = serial_get_tty_state (stdin_serial); if (our_ttystate != NULL) { @@ -170,24 +157,23 @@ gdb_has_a_terminal () #define OOPSY(what) \ if (result == -1) \ fprintf_unfiltered(gdb_stderr, "[%s failed in terminal_inferior: %s]\n", \ - what, strerror (errno)) + what, safe_strerror (errno)) -static void terminal_ours_1 PARAMS ((int)); +static void terminal_ours_1 (int); /* Initialize the terminal settings we record for the inferior, before we actually run the inferior. */ void -terminal_init_inferior_with_pgrp (pgrp) - int pgrp; +terminal_init_inferior_with_pgrp (int pgrp) { if (gdb_has_a_terminal ()) { - /* We could just as well copy our_ttystate (if we felt like adding - a new function SERIAL_COPY_TTY_STATE). */ + /* We could just as well copy our_ttystate (if we felt like + adding a new function serial_copy_tty_state()). */ if (inferior_ttystate) - free (inferior_ttystate); - inferior_ttystate = SERIAL_GET_TTY_STATE (stdin_serial); + xfree (inferior_ttystate); + inferior_ttystate = serial_get_tty_state (stdin_serial); #ifdef PROCESS_GROUP_TYPE inferior_process_group = pgrp; @@ -200,17 +186,34 @@ terminal_init_inferior_with_pgrp (pgrp) } } +/* Save the terminal settings again. This is necessary for the TUI + when it switches to TUI or non-TUI mode; curses changes the terminal + and gdb must be able to restore it correctly. */ + void -terminal_init_inferior () +terminal_save_ours (void) +{ + if (gdb_has_a_terminal ()) + { + /* We could just as well copy our_ttystate (if we felt like adding + a new function serial_copy_tty_state). */ + if (our_ttystate) + xfree (our_ttystate); + our_ttystate = serial_get_tty_state (stdin_serial); + } +} + +void +terminal_init_inferior (void) { #ifdef PROCESS_GROUP_TYPE /* This is for Lynx, and should be cleaned up by having Lynx be a separate debugging target with a version of target_terminal_init_inferior which passes in the process group to a generic routine which does all the work (and the non-threaded child_terminal_init_inferior can just pass in - inferior_pid to the same routine). */ + inferior_ptid to the same routine). */ /* We assume INFERIOR_PID is also the child's process group. */ - terminal_init_inferior_with_pgrp (PIDGET (inferior_pid)); + terminal_init_inferior_with_pgrp (PIDGET (inferior_ptid)); #endif /* PROCESS_GROUP_TYPE */ } @@ -218,9 +221,10 @@ terminal_init_inferior () This is preparation for starting or resuming the inferior. */ void -terminal_inferior () +terminal_inferior (void) { if (gdb_has_a_terminal () && terminal_is_ours + && inferior_ttystate != NULL && inferior_thisrun_terminal == 0) { int result; @@ -237,7 +241,7 @@ terminal_inferior () /* 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, inferior_ttystate); + result = serial_set_tty_state (stdin_serial, inferior_ttystate); OOPSY ("setting tty state"); if (!job_control) @@ -288,7 +292,7 @@ terminal_inferior () should be called to get back to a normal state of affairs. */ void -terminal_ours_for_output () +terminal_ours_for_output (void) { terminal_ours_1 (1); } @@ -298,7 +302,7 @@ terminal_ours_for_output () so they can be restored properly later. */ void -terminal_ours () +terminal_ours (void) { terminal_ours_1 (0); } @@ -308,8 +312,7 @@ terminal_ours () flags. */ static void -terminal_ours_1 (output_only) - int output_only; +terminal_ours_1 (int output_only) { /* Checking inferior_thisrun_terminal is necessary so that if GDB is running in the background, it won't block trying @@ -320,9 +323,11 @@ terminal_ours_1 (output_only) if (!terminal_is_ours) { +#ifdef SIGTTOU /* Ignore this signal since it will happen when we try to set the pgrp. */ - void (*osigttou) (); + void (*osigttou) () = NULL; +#endif int result; terminal_is_ours = 1; @@ -333,8 +338,8 @@ terminal_ours_1 (output_only) #endif if (inferior_ttystate) - free (inferior_ttystate); - inferior_ttystate = SERIAL_GET_TTY_STATE (stdin_serial); + xfree (inferior_ttystate); + inferior_ttystate = serial_get_tty_state (stdin_serial); #ifdef HAVE_TERMIOS inferior_process_group = tcgetpgrp (0); #endif @@ -359,7 +364,7 @@ terminal_ours_1 (output_only) though, since readline will deal with raw mode when/if it needs to. */ - SERIAL_NOFLUSH_SET_TTY_STATE (stdin_serial, our_ttystate, + serial_noflush_set_tty_state (stdin_serial, our_ttystate, inferior_ttystate); if (job_control) @@ -373,7 +378,7 @@ terminal_ours_1 (output_only) such situations as well. */ if (result == -1) fprintf_unfiltered (gdb_stderr, "[tcsetpgrp failed in terminal_ours: %s]\n", - strerror (errno)); + safe_strerror (errno)); #endif #endif /* termios */ @@ -409,20 +414,14 @@ terminal_ours_1 (output_only) } } -/* ARGSUSED */ void -term_info (arg, from_tty) - char *arg; - int from_tty; +term_info (char *arg, int from_tty) { target_terminal_info (arg, from_tty); } -/* ARGSUSED */ void -child_terminal_info (args, from_tty) - char *args; - int from_tty; +child_terminal_info (char *args, int from_tty) { if (!gdb_has_a_terminal ()) { @@ -493,7 +492,7 @@ child_terminal_info (args, from_tty) (int) inferior_process_group); #endif - SERIAL_PRINT_TTY_STATE (stdin_serial, inferior_ttystate, gdb_stdout); + serial_print_tty_state (stdin_serial, inferior_ttystate, gdb_stdout); } /* NEW_TTY_PREFORK is called before forking a new child process, @@ -506,8 +505,7 @@ child_terminal_info (args, from_tty) the terminal specified in the NEW_TTY_PREFORK call. */ void -new_tty_prefork (ttyname) - char *ttyname; +new_tty_prefork (char *ttyname) { /* Save the name for later, for determining whether we and the child are sharing a tty. */ @@ -515,9 +513,9 @@ new_tty_prefork (ttyname) } void -new_tty () +new_tty (void) { - register int tty; + int tty; if (inferior_thisrun_terminal == 0) return; @@ -574,17 +572,14 @@ new_tty () /* Kill the inferior process. Make us have no inferior. */ -/* ARGSUSED */ static void -kill_command (arg, from_tty) - char *arg; - int from_tty; +kill_command (char *arg, int from_tty) { - /* FIXME: This should not really be inferior_pid (or target_has_execution). + /* FIXME: This should not really be inferior_ptid (or target_has_execution). It should be a distinct flag that indicates that a target is active, cuz some targets don't have processes! */ - if (inferior_pid == 0) + if (ptid_equal (inferior_ptid, null_ptid)) error ("The program is not being run."); if (!query ("Kill the program being debugged? ")) error ("Not confirmed."); @@ -597,30 +592,28 @@ kill_command (arg, from_tty) if (target_has_stack) { printf_filtered ("In %s,\n", target_longname); - if (selected_frame == NULL) + if (deprecated_selected_frame == NULL) fputs_filtered ("No selected stack frame.\n", gdb_stdout); else - print_stack_frame (selected_frame, selected_frame_level, 1); + print_stack_frame (get_selected_frame (), 1, SRC_AND_LOC); } } /* Call set_sigint_trap when you need to pass a signal on to an attached process when handling SIGINT */ -/* ARGSUSED */ static void -pass_signal (signo) - int signo; +pass_signal (int signo) { #ifndef _WIN32 - kill (PIDGET (inferior_pid), SIGINT); + kill (PIDGET (inferior_ptid), SIGINT); #endif } static void (*osig) (); void -set_sigint_trap () +set_sigint_trap (void) { if (attach_flag || inferior_thisrun_terminal) { @@ -629,7 +622,7 @@ set_sigint_trap () } void -clear_sigint_trap () +clear_sigint_trap (void) { if (attach_flag || inferior_thisrun_terminal) { @@ -641,8 +634,7 @@ clear_sigint_trap () static void (*old_sigio) (); static void -handle_sigio (signo) - int signo; +handle_sigio (int signo) { int numfds; fd_set readfds; @@ -656,7 +648,7 @@ handle_sigio (signo) { #ifndef _WIN32 if ((*target_activity_function) ()) - kill (inferior_pid, SIGINT); + kill (PIDGET (inferior_ptid), SIGINT); #endif } } @@ -664,7 +656,7 @@ handle_sigio (signo) static int old_fcntl_flags; void -set_sigio_trap () +set_sigio_trap (void) { if (target_activity_function) { @@ -676,7 +668,7 @@ set_sigio_trap () } void -clear_sigio_trap () +clear_sigio_trap (void) { if (target_activity_function) { @@ -686,17 +678,17 @@ clear_sigio_trap () } #else /* No SIGIO. */ void -set_sigio_trap () +set_sigio_trap (void) { if (target_activity_function) - abort (); + internal_error (__FILE__, __LINE__, "failed internal consistency check"); } void -clear_sigio_trap () +clear_sigio_trap (void) { if (target_activity_function) - abort (); + internal_error (__FILE__, __LINE__, "failed internal consistency check"); } #endif /* No SIGIO. */ @@ -711,32 +703,35 @@ clear_sigio_trap () calls setpgrp and a setpgrp which does nothing (any system with job control will have one or the other). */ int -gdb_setpgid () +gdb_setpgid (void) { int retval = 0; if (job_control) { -#if defined (NEED_POSIX_SETPGID) || (defined (HAVE_TERMIOS) && defined (HAVE_SETPGID)) - /* setpgid (0, 0) is supposed to work and mean the same thing as - this, but on Ultrix 4.2A it fails with EPERM (and +#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 -#if defined (TIOCGPGRP) -#if defined(USG) && !defined(SETPGRP_ARGS) +#ifdef HAVE_SETPGRP +#ifdef SETPGRP_VOID retval = setpgrp (); #else retval = setpgrp (getpid (), getpid ()); -#endif /* USG */ -#endif /* TIOCGPGRP. */ -#endif /* NEED_POSIX_SETPGID */ +#endif +#endif /* HAVE_SETPGRP */ +#endif /* HAVE_SETPGID */ +#endif /* defined (HAVE_TERMIOS) || defined (TIOCGPGRP) */ } + return retval; } void -_initialize_inflow () +_initialize_inflow (void) { add_info ("terminal", term_info, "Print inferior's saved terminal status."); @@ -744,7 +739,7 @@ _initialize_inflow () add_com ("kill", class_run, kill_command, "Kill execution of program being debugged."); - inferior_pid = 0; + inferior_ptid = null_ptid; terminal_is_ours = 1;