#include <cstdio>
#include <grp.h>
+/////////////////////////////////////////////////////////////////////////////
+
/* ------------------------------------------------------------------------- *
* GET PSEUDO TELETYPE - MASTER AND SLAVE *
* ------------------------------------------------------------------------- */
* 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;
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.
* 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)
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;
}
} ttyconf;
+/////////////////////////////////////////////////////////////////////////////
+
void
-rxvt_ptytty::privileges (rxvt_privaction action)
+rxvt_ptytty_unix::privileges (rxvt_privaction action)
{
if (!name || !*name)
return;
}
#endif
-rxvt_ptytty::rxvt_ptytty ()
+rxvt_ptytty_unix::rxvt_ptytty_unix ()
{
pty = tty = -1;
name = 0;
#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);
}
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)
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) -----------------------*/
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;
char ut_id[5];
#endif
+ bool get ();
+ void put ();
+
void login (int cmd_pid, bool login_shell, const char *hostname);
void logout ();
#endif