static void save_external_state (struct terminal_state_recording * s) { (s -> recorded_p) = (scheme_in_foreground && (isatty (s -> fd)) && ((get_terminal_state ((s -> fd), (& (s -> state)))) >= 0) && ((get_flags ((s -> fd), (& (s -> flags)))) >= 0)); }
void save_internal_state (struct terminal_state_recording * s, struct terminal_state_recording * es) { /* Don't do anything unless we have a recording of the external state. Otherwise, we should preserve the previous recording of the internal state, if any. */ if (es -> recorded_p) (s -> recorded_p) = (((get_terminal_state ((s -> fd), (& (s -> state)))) >= 0) && ((get_flags ((s -> fd), (& (s -> flags)))) >= 0)); }
static void ctty_set_interrupt_chars (Tinterrupt_chars * ic) { Ttty_state s; if ((get_terminal_state (ctty_fildes, (&s))) == 0) { #ifdef HAVE_TERMIOS_H ((s . tio . c_cc) [VQUIT]) = (ic -> quit); ((s . tio . c_cc) [VINTR]) = (ic -> intrpt); ((s . tio . c_cc) [VSUSP]) = (ic -> tstp); #ifdef VDSUSP ((s . tio . c_cc) [VDSUSP]) = (ic -> dtstp); #else /* not VDSUSP */ #ifdef __HPUX__ (s . ltc . t_suspc) = (ic -> tstp); (s . ltc . t_dsuspc) = (ic -> dtstp); #endif /* __HPUX__ */ #endif /* not VDSUSP */ #else /* not HAVE_TERMIOS_H */ #ifdef HAVE_TERMIO_H ((s . tio . c_cc) [VQUIT]) = (ic -> quit); ((s . tio . c_cc) [VINTR]) = (ic -> intrpt); #ifdef HAVE_STRUCT_LTCHARS (s . ltc . t_suspc) = (ic -> tstp); (s . ltc . t_dsuspc) = (ic -> dtstp); #endif #else /* not HAVE_TERMIO_H */ #ifdef HAVE_SGTTY_H (s . tc . t_quitc) = (ic -> quit); (s . tc . t_intrc) = (ic -> intrpt); #ifdef HAVE_STRUCT_LTCHARS (s . ltc . t_suspc) = (ic -> tstp); (s . ltc . t_dsuspc) = (ic -> dtstp); #endif #endif /* HAVE_SGTTY_H */ #endif /* HAVE_TERMIO_H */ #endif /* HAVE_TERMIOS_H */ set_terminal_state (ctty_fildes, (&s)); } }
int steal_pty(pid_t pid, int *pty) { int err = 0; struct steal_pty_state steal = {}; long page_size = sysconf(_SC_PAGE_SIZE); if ((err = preflight_check(pid))) goto out; if ((err = get_terminal_state(&steal, pid))) goto out; if ((err = setup_steal_socket(&steal))) goto out; debug("Listening on socket: %s", steal.addr_un.sun_path); debug("Attaching terminal emulator pid=%d", steal.emulator_pid); if ((err = grab_pid(steal.emulator_pid, &steal.child, &steal.child_scratch))) goto out; debug("Attached to terminal emulator (pid %d)", (int)steal.emulator_pid); if ((err = find_master_fd(&steal))) { error("Unable to find the fd for the pty!"); goto out; } if ((err = setup_steal_socket_child(&steal))) goto out; if ((err = steal_child_pty(&steal))) goto out; if ((err = steal_block_hup(&steal))) goto out; if ((err = steal_cleanup_child(&steal))) goto out; goto out_no_child; out: if (steal.ptyfd) { close(steal.ptyfd); steal.ptyfd = 0; } if (steal.child_fd > 0) do_syscall(&steal.child, close, steal.child_fd, 0, 0, 0, 0, 0); if (steal.child_scratch > 0) do_unmap(&steal.child, steal.child_scratch, page_size); if (steal.child.state != ptrace_detached) { ptrace_restore_regs(&steal.child); ptrace_detach_child(&steal.child); } out_no_child: if (steal.sockfd > 0) { close(steal.sockfd); unlink(steal.addr_un.sun_path); } if (steal.tmpdir[0]) { rmdir(steal.tmpdir); } if (steal.ptyfd) *pty = steal.ptyfd; free(steal.master_fds.fds); return err; }
/* not currently used */ static void ctty_get_interrupt_chars (Tinterrupt_chars * ic) { Ttty_state s; if ((get_terminal_state (ctty_fildes, (&s))) == 0) { #ifdef HAVE_TERMIOS_H (ic -> quit) = ((s . tio . c_cc) [VQUIT]); (ic -> intrpt) = ((s . tio . c_cc) [VINTR]); (ic -> tstp) = ((s . tio . c_cc) [VSUSP]); #ifdef VDSUSP (ic -> dtstp) = ((s . tio . c_cc) [VDSUSP]); #else /* not VDSUSP */ #ifdef __HPUX__ (ic -> dtstp) = (s . ltc . t_dsuspc); #endif /* __HPUX__ */ #endif /* not VDSUSP */ #else /* not HAVE_TERMIOS_H */ #ifdef HAVE_TERMIO_H (ic -> quit) = ((s . tio . c_cc) [VQUIT]); (ic -> intrpt) = ((s . tio . c_cc) [VINTR]); #ifdef HAVE_STRUCT_LTCHARS (ic -> tstp) = (s . ltc . t_suspc); (ic -> dtstp) = (s . ltc . t_dsuspc); #else /* not HAVE_STRUCT_LTCHARS */ { cc_t disabled_char = (UX_PC_VDISABLE (ctty_fildes)); (ic -> tstp) = disabled_char; (ic -> dtstp) = disabled_char; } #endif /* not HAVE_STRUCT_LTCHARS */ #else /* not HAVE_TERMIO_H */ #ifdef HAVE_SGTTY_H (ic -> quit) = (s . tc . t_quitc); (ic -> intrpt) = (s . tc . t_intrc); #ifdef HAVE_STRUCT_LTCHARS (ic -> tstp) = (s . ltc . t_suspc); (ic -> dtstp) = (s . ltc . t_dsuspc); #else /* not HAVE_STRUCT_LTCHARS */ { cc_t disabled_char = (UX_PC_VDISABLE (ctty_fildes)); (ic -> tstp) = disabled_char; (ic -> dtstp) = disabled_char; } #endif /* not HAVE_STRUCT_LTCHARS */ #endif /* HAVE_SGTTY_H */ #endif /* HAVE_TERMIO_H */ #endif /* HAVE_TERMIOS_H */ } else { cc_t disabled_char = (UX_PC_VDISABLE (ctty_fildes)); (ic -> quit) = disabled_char; (ic -> intrpt) = disabled_char; (ic -> tstp) = disabled_char; (ic -> dtstp) = disabled_char; } }