diff options
Diffstat (limited to 'src/appl/libpty/init_slave.c')
-rw-r--r-- | src/appl/libpty/init_slave.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/appl/libpty/init_slave.c b/src/appl/libpty/init_slave.c new file mode 100644 index 0000000000..ce75076454 --- /dev/null +++ b/src/appl/libpty/init_slave.c @@ -0,0 +1,100 @@ +/* + * pty_init_slave: open slave side of terminal, clearing for use. + * + * Copyright 1995, 1996 by the Massachusetts Institute of Technology. + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose and without fee is hereby + * granted, provided that the above copyright notice appear in all + * copies and that both that copyright notice and this permission + * notice appear in supporting documentation, and that the name of + * M.I.T. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Furthermore if you modify this software you must label + * your software as modified software and not distribute it in such a + * fashion that it might be confused with the original M.I.T. software. + * M.I.T. makes no representations about the suitability + * of this software for any purpose. It is provided "as is" without + * express or implied warranty. + * + */ + +#include "com_err.h" +#include "libpty.h" +#include "pty-int.h" + +/* * The following is an array of modules that should be pushed on the + * stream. See configure.in for caviats and notes about when this + * array is used and not used. + */ +#if defined(HAVE_STREAMS)&&(!defined(HAVE_LINE_PUSH)) +static char *push_list[] = { +#ifdef PUSH_PTEM + "ptem", +#endif +#ifdef PUSH_LDTERM + "ldterm", +#endif +#ifdef PUSH_TTCOMPAT +"ttcompat", +#endif + 0}; +#endif /*HAVE_STREAMS but not HAVE_LINE_PUSH*/ + + + +long pty_initialize_slave (int fd) +{ +#if defined(POSIX_TERMIOS) && !defined(ultrix) + struct termios new_termio; +#else + struct sgttyb b; +#endif /* POSIX_TERMIOS */ + int pid; + +#ifdef HAVE_STREAMS +#ifdef HAVE_LINE_PUSH + while (ioctl (fd, I_POP, 0) == 0); /*Clear out any old lined's*/ + + if (line_push(fd) < 0) + { + (void) close(fd); fd = -1; + return PTY_OPEN_SLAVE_LINE_PUSHFAIL; + } +#else /*No line_push */ + { + char **module = &push_list[0]; + while (*module) + if (ioctl(fd, I_PUSH, *(module++)) < 0) + return PTY_OPEN_SLAVE_PUSH_FAIL; + } + +#endif /*LINE_PUSH*/ +#endif /*HAVE_STREAMS*/ + + /* + * Under Ultrix 3.0, the pgrp of the slave pty terminal + * needs to be set explicitly. Why rlogind works at all + * without this on 4.3BSD is a mystery. + */ +#ifdef GETPGRP_ONEARG + pid = getpgrp(getpid()); +#else + pid = getpgrp(); +#endif + +#ifdef TIOCSPGRP + ioctl(fd, TIOCSPGRP, &pid); +#endif + + +#if defined(POSIX_TERMIOS) && !defined(ultrix) + tcsetpgrp(fd, pid); + tcgetattr(fd,&new_termio); + new_termio.c_cc[VMIN] = 1; + new_termio.c_cc[VTIME] = 0; + tcsetattr(fd,TCSANOW,&new_termio); +#endif /* POSIX_TERMIOS */ + + return 0; +} |