static void cleanup_tty (serial_ttystate ttystate) { printf_unfiltered ("\r\n[Exiting connect mode]\r\n"); serial_set_tty_state (tty_desc, ttystate); xfree (ttystate); serial_close (tty_desc); }
void terminal_inferior (void) { struct inferior *inf; struct terminal_info *tinfo; if (!terminal_is_ours) return; inf = current_inferior (); tinfo = get_inflow_inferior_data (inf); if (gdb_has_a_terminal () && tinfo->ttystate != NULL && tinfo->run_terminal == NULL) { 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); OOPSY ("setting tty state"); if (!job_control) { sigint_ours = (void (*)()) signal (SIGINT, SIG_IGN); #ifdef SIGQUIT sigquit_ours = (void (*)()) signal (SIGQUIT, SIG_IGN); #endif } /* If attach_flag is set, we don't know whether we are sharing a terminal with the inferior or not. (attaching a process without a terminal is one case where we do not; attaching a process which we ran from the same shell as GDB via `&' is one case where we do, I think (but perhaps this is not `sharing' in the sense that we need to save and restore tty state)). I don't know if there is any way to tell whether we are sharing a terminal. So what we do is to go through all the saving and restoring of the tty state, but ignore errors setting the process group, which will happen if we are not sharing a terminal). */ if (job_control) { #ifdef HAVE_TERMIOS 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; }