Back to index

glibc  2.9
forkpty.c
Go to the documentation of this file.
00001 /* Copyright (C) 1998, 2007 Free Software Foundation, Inc.
00002    This file is part of the GNU C Library.
00003    Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1998.
00004 
00005    The GNU C Library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Lesser General Public
00007    License as published by the Free Software Foundation; either
00008    version 2.1 of the License, or (at your option) any later version.
00009 
00010    The GNU C Library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Lesser General Public License for more details.
00014 
00015    You should have received a copy of the GNU Lesser General Public
00016    License along with the GNU C Library; if not, write to the Free
00017    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00018    02111-1307 USA.  */
00019 
00020 #include <sys/types.h>
00021 #include <termios.h>
00022 #include <unistd.h>
00023 #include <utmp.h>
00024 #include <pty.h>
00025 
00026 int
00027 forkpty (amaster, name, termp, winp)
00028      int *amaster;
00029      char *name;
00030      const struct termios *termp;
00031      const struct winsize *winp;
00032 {
00033   int master, slave, pid;
00034 
00035   if (openpty (&master, &slave, name, termp, winp) == -1)
00036     return -1;
00037 
00038   switch (pid = fork ())
00039     {
00040     case -1:
00041       close (master);
00042       close (slave);
00043       return -1;
00044     case 0:
00045       /* Child.  */
00046       close (master);
00047       if (login_tty (slave))
00048        _exit (1);
00049 
00050       return 0;
00051     default:
00052       /* Parent.  */
00053       *amaster = master;
00054       close (slave);
00055 
00056       return pid;
00057     }
00058 }