diff options
Diffstat (limited to 'src/pty.c')
-rw-r--r-- | src/pty.c | 255 |
1 files changed, 2 insertions, 253 deletions
@@ -41,11 +41,7 @@ # include <sys/stropts.h> #endif -#ifdef ISC -# include <sys/tty.h> -# include <sys/sioctl.h> -# include <sys/pty.h> -#endif +#include <pty.h> #include "extern.h" @@ -59,23 +55,7 @@ # define PTYRANGE1 "0123456789abcdef" #endif -/* SVR4 pseudo ttys don't seem to work with SCO-5 */ -#ifdef M_UNIX -# undef HAVE_SVR4_PTYS -#endif - -/* used for opening a new pty-pair: */ -static char PtyName[32], TtyName[32]; - -#if !(defined(sequent) || defined(_SEQUENT_) || defined(HAVE_SVR4_PTYS)) -# ifdef M_UNIX -static char PtyProto[] = "/dev/ptypXY"; -static char TtyProto[] = "/dev/ttypXY"; -# else -static char PtyProto[] = "/dev/ptyXY"; -static char TtyProto[] = "/dev/ttyXY"; -# endif -#endif +static char TtyName[32]; static void initmaster (int); @@ -105,184 +85,8 @@ InitPTY(int f) { if (f < 0) return; -#if defined(I_PUSH) && defined(HAVE_SVR4_PTYS) && !defined(sgi) && !defined(linux) && !defined(__GLIBC__) && !defined(__osf__) && !defined(M_UNIX) - if (ioctl(f, I_PUSH, "ptem")) - Panic(errno, "InitPTY: cannot I_PUSH ptem"); - if (ioctl(f, I_PUSH, "ldterm")) - Panic(errno, "InitPTY: cannot I_PUSH ldterm"); -# ifdef sun - if (ioctl(f, I_PUSH, "ttcompat")) - Panic(errno, "InitPTY: cannot I_PUSH ttcompat"); -# endif -#endif -} - -/***************************************************************/ - -#if defined(OSX) && !defined(PTY_DONE) -#define PTY_DONE -int -OpenPTY(char **ttyn) -{ - register int f; - if ((f = open_controlling_pty(TtyName)) < 0) - return -1; - initmaster(f); - *ttyn = TtyName; - return f; -} -#endif - -/***************************************************************/ - -#if (defined(sequent) || defined(_SEQUENT_)) && !defined(PTY_DONE) -#define PTY_DONE -int -OpenPTY(char **ttyn) -{ - char *m, *s; - register int f; - - if ((f = getpseudotty(&s, &m)) < 0) - return -1; -#ifdef _SEQUENT_ - fvhangup(s); -#endif - strncpy(PtyName, m, sizeof(PtyName)); - strncpy(TtyName, s, sizeof(TtyName)); - initmaster(f); - *ttyn = TtyName; - return f; -} -#endif - -/***************************************************************/ - -#if defined(__sgi) && !defined(PTY_DONE) -#define PTY_DONE -int -OpenPTY(char **ttyn) -{ - int f; - char *name, *_getpty(); - void (*sigcld)(int); - - /* - * SIGCHLD set to SIG_DFL for _getpty() because it may fork() and - * exec() /usr/adm/mkpts - */ - sigcld = signal(SIGCHLD, SIG_DFL); - name = _getpty(&f, O_RDWR | O_NONBLOCK, 0600, 0); - signal(SIGCHLD, sigcld); - - if (name == 0) - return -1; - initmaster(f); - *ttyn = name; - return f; -} -#endif - -/***************************************************************/ - -#if defined(MIPS) && defined(HAVE_DEV_PTC) && !defined(PTY_DONE) -#define PTY_DONE -int -OpenPTY(char **ttyn) -{ - register int f; - struct stat buf; - - strncpy(PtyName, "/dev/ptc", 32); - if ((f = open(PtyName, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0) - return -1; - if (fstat(f, &buf) < 0) - { - close(f); - return -1; - } - sprintf(TtyName, "/dev/ttyq%d", minor(buf.st_rdev)); - initmaster(f); - *ttyn = TtyName; - return f; -} -#endif - -/***************************************************************/ - -#if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) -#define PTY_DONE -int -OpenPTY(char **ttyn) -{ - register int f; - char *m, *ptsname(); - int unlockpt (int), grantpt (int); -#if defined(HAVE_GETPT) && defined(linux) - int getpt (void); -#endif - void (*sigcld)(int); - - strncpy(PtyName, "/dev/ptmx", 32); -#if defined(HAVE_GETPT) && (defined(linux) || defined(__GLIBC__)) - if ((f = getpt()) == -1) -#else - if ((f = open(PtyName, O_RDWR | O_NOCTTY)) == -1) -#endif - return -1; - - /* - * SIGCHLD set to SIG_DFL for grantpt() because it fork()s and - * exec()s pt_chmod - */ - sigcld = signal(SIGCHLD, SIG_DFL); - if ((m = ptsname(f)) == NULL || grantpt(f) || unlockpt(f)) - { - signal(SIGCHLD, sigcld); - close(f); - return -1; - } - signal(SIGCHLD, sigcld); - strncpy(TtyName, m, sizeof(TtyName)); - initmaster(f); - *ttyn = TtyName; - return f; -} -#endif - -/***************************************************************/ - -#if defined(_AIX) && defined(HAVE_DEV_PTC) && !defined(PTY_DONE) -#define PTY_DONE - -int -OpenPTY(char **ttyn) -{ - register int f; - - /* a dumb looking loop replaced by mycrofts code: */ - strncpy (PtyName, "/dev/ptc", 32); - if ((f = open (PtyName, O_RDWR | O_NOCTTY)) < 0) - return -1; - strncpy(TtyName, ttyname(f), sizeof(TtyName)); - if (eff_uid && access(TtyName, R_OK | W_OK)) - { - close(f); - return -1; - } - initmaster(f); -# ifdef _IBMR2 - pty_preopen = 1; -# endif - *ttyn = TtyName; - return f; } -#endif - -/***************************************************************/ -#if defined(HAVE_OPENPTY) && !defined(PTY_DONE) -#define PTY_DONE int OpenPTY(char **ttyn) { @@ -295,59 +99,4 @@ OpenPTY(char **ttyn) *ttyn = TtyName; return f; } -#endif - -/***************************************************************/ - -#ifndef PTY_DONE -int -OpenPTY(char **ttyn) -{ - register char *p, *q, *l, *d; - register int f; - - debug("OpenPTY: Using BSD style ptys.\n"); - strncpy(PtyName, PtyProto, 32); - strncpy(TtyName, TtyProto, 32); - for (p = PtyName; *p != 'X'; p++) - ; - for (q = TtyName; *q != 'X'; q++) - ; - for (l = PTYRANGE0; (*p = *l) != '\0'; l++) - { - for (d = PTYRANGE1; (p[1] = *d) != '\0'; d++) - { - debug1("OpenPTY tries '%s'\n", PtyName); - if ((f = open(PtyName, O_RDWR | O_NOCTTY)) == -1) - continue; - q[0] = *l; - q[1] = *d; - if (eff_uid && access(TtyName, R_OK | W_OK)) - { - close(f); - continue; - } -#if defined(sun) && defined(TIOCGPGRP) && !defined(SUNOS3) - /* Hack to ensure that the slave side of the pty is - * unused. May not work in anything other than SunOS4.1 - */ - { - int pgrp; - - /* tcgetpgrp does not work (uses TIOCGETPGRP)! */ - if (ioctl(f, TIOCGPGRP, (char *)&pgrp) != -1 || errno != EIO) - { - close(f); - continue; - } - } -#endif - initmaster(f); - *ttyn = TtyName; - return f; - } - } - return -1; -} -#endif |