
1: /* Copyright (C) 1998, 2007 Free Software Foundation, Inc. 2: This file is part of the GNU C Library. 3: Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1998. 4: 5: The GNU C Library is free software; you can redistribute it and/or 6: modify it under the terms of the GNU Lesser General Public 7: License as published by the Free Software Foundation; either 8: version 2.1 of the License, or (at your option) any later version. 9: 10: The GNU C Library is distributed in the hope that it will be useful, 11: but WITHOUT ANY WARRANTY; without even the implied warranty of 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13: Lesser General Public License for more details. 14: 15: You should have received a copy of the GNU Lesser General Public 16: License along with the GNU C Library; if not, write to the Free 17: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 18: 02111-1307 USA. */ 19: 20: #include <sys/types.h> 21: #include <termios.h> 22: #include <unistd.h> 23: #include <utmp.h> 24: #include <pty.h> 25: 26: int 27: forkpty (amaster, name, termp, winp) 28: int *amaster; 29: char *name; 30: struct termios *termp; 31: struct winsize *winp; 32: { 33: int master, slave, pid; 34: 35: if (openpty (&master, &slave, name, termp, winp) == -1) 36: return -1; 37: 38: switch (pid = fork ()) 39: { 40: case -1: 41: close (master); 42: close (slave); 43: return -1; 44: case 0: 45: /* Child. */ 46: close (master); 47: if (login_tty (slave)) 48: _exit (1); 49: 50: return 0; 51: default: 52: /* Parent. */ 53: *amaster = master; 54: close (slave); 55: 56: return pid; 57: } 58: }