From 62fd8afa2789f148a2890eb4d6327a7d04942c73 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 17 Jan 2006 10:59:32 +0000 Subject: [PATCH] *** empty log message *** --- src/ptytty.C | 121 +++++++++++++++++++++++++-------------------------- src/ptytty.h | 41 +++++++++++------ 2 files changed, 87 insertions(+), 75 deletions(-) diff --git a/src/ptytty.C b/src/ptytty.C index 0e27097c..68b25cdd 100644 --- a/src/ptytty.C +++ b/src/ptytty.C @@ -56,6 +56,8 @@ #include #include +///////////////////////////////////////////////////////////////////////////// + /* ------------------------------------------------------------------------- * * GET PSEUDO TELETYPE - MASTER AND SLAVE * * ------------------------------------------------------------------------- */ @@ -220,7 +222,7 @@ get_tty (char *ttydev) * Make our tty a controlling tty so that /dev/tty points to us */ static int -control_tty (int fd_tty, const char *ttydev) +control_tty (int fd_tty) { #ifndef __QNX__ int fd; @@ -251,7 +253,7 @@ control_tty (int fd_tty, const char *ttydev) close (fd); /* ouch: still have controlling tty */ /* ---------------------------------------- */ -#if defined(PTYS_ARE_PTMX) && defined(I_PUSH) +# if defined(PTYS_ARE_PTMX) && defined(I_PUSH) /* * Push STREAMS modules: * ptem: pseudo-terminal hardware emulation module. @@ -269,25 +271,17 @@ control_tty (int fd_tty, const char *ttydev) * close () - on the master side which causes a hang up to be sent * through - Geoff Wing */ -# ifdef HAVE_ISASTREAM +# ifdef HAVE_ISASTREAM if (isastream (fd_tty) == 1) -# endif +# endif { ioctl (fd_tty, I_PUSH, "ptem"); ioctl (fd_tty, I_PUSH, "ldterm"); ioctl (fd_tty, I_PUSH, "ttcompat"); } -#endif +# endif /* ---------------------------------------- */ -# if defined(TIOCSCTTY) fd = ioctl (fd_tty, TIOCSCTTY, NULL); -# elif defined(TIOCSETCTTY) - fd = ioctl (fd_tty, TIOCSETCTTY, NULL); -# else - fd = open (ttydev, O_RDWR); - if (fd >= 0) - close (fd); -# endif /* ---------------------------------------- */ fd = open ("/dev/tty", O_WRONLY); if (fd < 0) @@ -299,6 +293,51 @@ control_tty (int fd_tty, const char *ttydev) return 0; } +void +rxvt_ptytty::close_tty () +{ + if (tty < 0) + return; + + close (tty); + tty = -1; +} + +bool +rxvt_ptytty::make_controlling_tty () +{ + return control_tty (tty) >= 0; +} + +void +rxvt_ptytty::set_utf8_mode (bool on) +{ +#ifdef IUTF8 + if (pty < 0) + return; + + struct termios tio; + + if (tcgetattr (pty, &tio) != -1) + { + tcflag_t new_cflag = tio.c_iflag; + + if (on) + new_cflag |= IUTF8; + else + new_cflag &= ~IUTF8; + + if (new_cflag != tio.c_iflag) + { + tio.c_iflag = new_cflag; + tcsetattr (pty, TCSANOW, &tio); + } + } +#endif +} + +///////////////////////////////////////////////////////////////////////////// + #ifndef NO_SETOWNER_TTYDEV static struct ttyconf { gid_t gid; @@ -323,8 +362,10 @@ static struct ttyconf { } } ttyconf; +///////////////////////////////////////////////////////////////////////////// + void -rxvt_ptytty::privileges (rxvt_privaction action) +rxvt_ptytty_unix::privileges (rxvt_privaction action) { if (!name || !*name) return; @@ -367,7 +408,7 @@ rxvt_ptytty::privileges (rxvt_privaction action) } #endif -rxvt_ptytty::rxvt_ptytty () +rxvt_ptytty_unix::rxvt_ptytty_unix () { pty = tty = -1; name = 0; @@ -379,25 +420,14 @@ rxvt_ptytty::rxvt_ptytty () #endif } -rxvt_ptytty::~rxvt_ptytty () +rxvt_ptytty_unix::~rxvt_ptytty_unix () { logout (); put (); } void - -rxvt_ptytty::close_tty () -{ - if (tty < 0) - return; - - close (tty); - tty = -1; -} - -void -rxvt_ptytty::put () +rxvt_ptytty_unix::put () { #ifndef NO_SETOWNER_TTYDEV privileges (RESTORE); @@ -412,13 +442,7 @@ rxvt_ptytty::put () } bool -rxvt_ptytty::make_controlling_tty () -{ - return control_tty (tty, name) >= 0; -} - -bool -rxvt_ptytty::get () +rxvt_ptytty_unix::get () { /* get master (pty) */ if ((pty = get_pty (&tty, &name)) < 0) @@ -443,32 +467,5 @@ rxvt_ptytty::get () return true; } -void -rxvt_ptytty::set_utf8_mode (bool on) -{ -#ifdef IUTF8 - if (pty < 0) - return; - - struct termios tio; - - if (tcgetattr (pty, &tio) != -1) - { - tcflag_t new_cflag = tio.c_iflag; - - if (on) - new_cflag |= IUTF8; - else - new_cflag &= ~IUTF8; - - if (new_cflag != tio.c_iflag) - { - tio.c_iflag = new_cflag; - tcsetattr (pty, TCSANOW, &tio); - } - } -#endif -} - /*----------------------- end-of-file (C source) -----------------------*/ diff --git a/src/ptytty.h b/src/ptytty.h index ffe9fa99..75b419e5 100644 --- a/src/ptytty.h +++ b/src/ptytty.h @@ -58,28 +58,40 @@ enum rxvt_privaction { IGNORE = 'i', SAVE = 's', RESTORE = 'r' }; struct rxvt_ptytty { -#ifndef RESET_TTY_TO_COMMON_DEFAULTS - struct stat savestat; /* original status of our tty */ -#endif -#ifndef NO_SETOWNER_TTYDEV - void privileges (rxvt_privaction action); - bool saved; -#endif -public: int pty; // pty file descriptor; connected to rxvt int tty; // tty file descriptor; connected to child - char *name; - rxvt_ptytty (); - ~rxvt_ptytty (); + virtual ~rxvt_ptytty () + { + // + } - bool get (); - void put (); + virtual bool get () = 0; + virtual void put () = 0; + + virtual void login (int cmd_pid, bool login_shell, const char *hostname) = 0; + virtual void logout () = 0; void close_tty (); bool make_controlling_tty (); void set_utf8_mode (bool on); +}; + +struct rxvt_ptytty_unix : rxvt_ptytty { + char *name; + +#ifndef RESET_TTY_TO_COMMON_DEFAULTS + struct stat savestat; /* original status of our tty */ +#endif +#ifndef NO_SETOWNER_TTYDEV + void privileges (rxvt_privaction action); + bool saved; +#endif +public: + + rxvt_ptytty_unix (); + ~rxvt_ptytty_unix (); #if UTMP_SUPPORT int utmp_pos; @@ -96,6 +108,9 @@ public: char ut_id[5]; #endif + bool get (); + void put (); + void login (int cmd_pid, bool login_shell, const char *hostname); void logout (); #endif -- 2.34.1