X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fforkpty.c;h=f4dd954b54e1158e8be984a3e5a0ca212aa1af50;hb=3d7fa330593948749e382e99a28a49ddf6878bde;hp=adbc3d55185120bf647a278fab71e0f4c8c833fa;hpb=8e7bc4d9d435c2d18be77134896aa823733816a0;p=gnulib.git diff --git a/lib/forkpty.c b/lib/forkpty.c index adbc3d551..f4dd954b5 100644 --- a/lib/forkpty.c +++ b/lib/forkpty.c @@ -1,5 +1,5 @@ -/* Fork a child attached to a pseudo-terminal descriptor. - Copyright (C) 2010 Free Software Foundation, Inc. +/* Fork a child process attached to the slave of a pseudo-terminal. + Copyright (C) 2010-2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,7 +19,9 @@ /* Specification. */ #include -#if HAVE_DECL_FORKPTY +#if HAVE_FORKPTY + +/* Provide a wrapper with the prototype of glibc-2.8 and newer. */ # undef forkpty int rpl_forkpty (int *amaster, char *name, struct termios const *termp, @@ -29,7 +31,43 @@ rpl_forkpty (int *amaster, char *name, struct termios const *termp, return forkpty (amaster, name, (struct termios *) termp, (struct winsize *) winp); } -#else -# error forkpty has not been ported to your system; \ - report this to bug-gnulib@gnu.org for help + +#else /* AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 10, mingw */ + +# include +# include + +extern int login_tty (int slave_fd); + +int +forkpty (int *amaster, char *name, + const struct termios *termp, const struct winsize *winp) +{ + int master, slave, pid; + + if (openpty (&master, &slave, name, termp, winp) == -1) + return -1; + + switch (pid = fork ()) + { + case -1: + close (master); + close (slave); + return -1; + + case 0: + /* Child. */ + close (master); + if (login_tty (slave)) + _exit (1); + return 0; + + default: + /* Parent. */ + *amaster = master; + close (slave); + return pid; + } +} + #endif