Have pty_cleanup() fork on systems with vhangup()
authorSam Hartman <hartmans@mit.edu>
Mon, 15 Apr 1996 07:15:11 +0000 (07:15 +0000)
committerSam Hartman <hartmans@mit.edu>
Mon, 15 Apr 1996 07:15:11 +0000 (07:15 +0000)
so that the right controlling terminal can be used; needed
on HP and others possibly.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@7813 dc483132-0cff-0310-8789-dd5450dbe970

src/util/pty/ChangeLog
src/util/pty/README
src/util/pty/cleanup.c
src/util/pty/configure.in
src/util/pty/pty-int.h

index 10791a91510b3949bb59e66ec84ac0ebb63a7056..b5c6cd55e96db6fd225947450466b47a6af53e95 100644 (file)
@@ -1,3 +1,16 @@
+Sun Apr 14 00:36:33 1996  Sam Hartman  <hartmans@mit.edu>
+
+       * pty-int.h: Don't include sys/wait.h here.
+
+       * configure.in : Check for waitpid.
+
+Sat Apr 13 18:58:43 1996  Sam Hartman  <hartmans@mit.edu>
+
+       * cleanup.c (pty_cleanup): If we are doing a vhangup, then fork
+       and dissociate on hangup.  This makes the HP happy, because there
+       is no way to get rid of a controlling terminal besides setsid() on
+       the HP.
+
 Sun Mar 24 19:59:14 1996  Sam Hartman  <hartmans@tertius.mit.edu>
 
        * configure.in : Do streams handling by deciding what modules to
index 937e3d44a5ae11cac09fe3951181ac9c5dc0319b..8d906343b787a94113e7b54343ec02c79f3b0df9 100644 (file)
@@ -99,7 +99,10 @@ long pty_cleanup(char *slave, pid_t pid, int update_wtmp)
 the pty, HUPing processes associated with it.  (pid is the pid of the
 slave process that may have died, slave is the name of the slave
 terminal.)  PID is allowed to be zero if unknown; this may disable
-some cleanup operations.
+some cleanup operations.  This routine may fork on some systems.  As
+such, SIGCHLD may be generated and blocked for some time during the
+routine.  In addition, on systems without waitpid() or wait4(), wait()
+may be called.
 
 
     
index 31522a47ebbea5bf1ddca8da975392fccf17b0d0..0e9104ef94bfb117291b59cd331f32ae189dfde9 100644 (file)
@@ -20,6 +20,9 @@
 #include <com_err.h>
 #include "libpty.h"
 #include "pty-int.h"
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
 
 long pty_cleanup (slave, pid, update_utmp)
     char *slave;
@@ -53,9 +56,46 @@ long pty_cleanup (slave, pid, update_utmp)
     }
 #else /* HAVE_REVOKE*/
 #ifdef VHANG_LAST
-    if ( retval = ( pty_open_ctty( slave, &fd ))) 
-       return retval;
-    ptyint_vhangup();
+    {
+      int status;
+#ifdef POSIX_SIGNALS
+      sigset_t old, new;
+      sigemptyset(&new);
+      sigaddset(&new, SIGCHLD);
+      sigprocmask ( SIG_BLOCK, &new, &old);
+#else /*POSIX_SIGNALS*/
+      int mask = sigblock(sigmask(SIGCHLD));
+#endif /*POSIX_SIGNALS*/
+      switch (retval = fork()) {
+      case -1:
+#ifdef POSIX_SIGNALS
+       sigprocmask(SIG_SETMASK, &old, 0);
+#else /*POSIX_SIGNALS*/
+       sigsetmask(mask);
+#endif /*POSIX_SIGNALS*/
+       return errno;
+      case 0:
+       ptyint_void_association();
+       if ( retval = ( pty_open_ctty( slave, &fd ))) 
+         exit(retval);
+       ptyint_vhangup();
+       exit(0);
+       break;
+      default:
+#ifdef HAVE_WAITPID
+       waitpid(retval, &status, 0);
+#else /*HAVE_WAITPID*/
+       wait(&status);
+#endif
+#ifdef POSIX_SIGNALS
+       sigprocmask(SIG_SETMASK, &old, 0);
+#else /*POSIX_SIGNALS*/
+       sigsetmask(mask);
+#endif /*POSIX_SIGNALS*/
+
+       break;
+      }
+    }
 #endif /*VHANG_LAST*/
 #endif /* HAVE_REVOKE*/
 #ifndef HAVE_STREAMS
index f2673a48bba1d746f0fea4d5ffc5d17bbaaaa476..683b6b95905bc297079a27404e12547ed3178a0f 100644 (file)
@@ -63,7 +63,8 @@ AC_FUNC_CHECK(grantpt,AC_DEFINE(HAVE_GRANTPT))
 AC_FUNC_CHECK(openpty,AC_DEFINE(HAVE_OPENPTY))
 AC_FUNC_CHECK(logwtmp,AC_DEFINE(HAVE_LOGWTMP))
 AC_CHECK_HEADERS(unistd.h stdlib.h string.h utmpx.h utmp.h sys/filio.h sys/sockio.h sys/label.h sys/tty.h ttyent.h lastlog.h sys/select.h sys/ptyvar.h)
-AC_REPLACE_FUNCS(getdtablesize)
+AC_CHECK_HEADERS(sys/wait.h)
+AC_CHECK_FUNCS(waitpid)
 DECLARE_SYS_ERRLIST
 KRB5_SIGTYPE
 CHECK_SIGNALS
index 4b6d1570deba21ea4e0668ce868269546508fe7f..d4d225cfe86e12b2f444643ab1a5ce511c05e5ac 100644 (file)
@@ -23,7 +23,6 @@
 
 #include <sys/stat.h>
 #include <sys/ioctl.h>
-#include <sys/wait.h>
 #include <sys/file.h>
 #include <sys/time.h>
 #include <ctype.h>