jvdias cfec38b
--- mgetty-1.1.31/logname.c.161174_tcflush	2005-07-27 10:41:10.076619000 -0400
jvdias cfec38b
+++ mgetty-1.1.31/logname.c	2005-07-27 10:44:39.675810000 -0400
jvdias cfec38b
@@ -368,10 +368,12 @@
jvdias 89fb67f
 	    {
jvdias 89fb67f
 		printf( "\r\n\07\r\nYour login time (%d minutes) ran out. Goodbye.\r\n",
jvdias 89fb67f
 		       (max_login_time / 60)+1 );
jvdias 89fb67f
-		
jvdias cfec38b
+		signal(SIGALRM,SIG_DFL);/* turn off alarm */
jvdias cfec38b
+		alarm(0);               
jvdias 89fb67f
 		sleep(3);		/* give message time to xmit */
jvdias 89fb67f
 		lprintf( L_AUDIT, "failed dev=%s, pid=%d, login time out",
jvdias 89fb67f
 			 Device, getpid() );
jvdias 89fb67f
+		tcflush(1,TCOFLUSH);    /* allow us to exit without hanging (bug 164002) */
jvdias 89fb67f
 		exit(0);		/* bye bye... */
jvdias 89fb67f
 	    }
jvdias 89fb67f
 	    ch = CKILL;			/* timeout #1 -> clear input */
jvdias cfec38b
--- mgetty-1.1.31/mgetty.c.161174_tcflush	2003-11-17 14:09:41.000000000 -0500
jvdias cfec38b
+++ mgetty-1.1.31/mgetty.c	2005-07-27 10:41:43.155507000 -0400
jvdias cfec38b
@@ -94,6 +94,7 @@
jvdias cfec38b
     lprintf( L_AUDIT, "failed dev=%s, pid=%d, got signal %d, exiting",
jvdias cfec38b
 	              Device, getpid(), signo );
jvdias cfec38b
     rmlocks();
jvdias cfec38b
+    tcflush(1,TCOFLUSH);
jvdias cfec38b
     exit(10);
jvdias cfec38b
 }
jvdias cfec38b
 
jvdias cfec38b
--- mgetty-1.1.31/logfile.c.161174_tcflush	2003-01-14 16:30:20.000000000 -0500
jvdias cfec38b
+++ mgetty-1.1.31/logfile.c	2005-07-27 10:43:49.279257000 -0400
jvdias cfec38b
@@ -22,6 +22,7 @@
jvdias cfec38b
 #endif
jvdias cfec38b
 
jvdias cfec38b
 #ifdef SYSLOG
jvdias cfec38b
+#include <signal.h>
jvdias cfec38b
 #include <syslog.h>
jvdias cfec38b
 
jvdias cfec38b
 #if !defined(linux) && !defined(BSD) && !defined(_SCO_DS) && \
jvdias cfec38b
@@ -212,6 +213,7 @@
jvdias cfec38b
 int     errnr;
jvdias cfec38b
 char * p;
jvdias cfec38b
 static int first_open = TRUE;
jvdias cfec38b
+sigset_t ss, oss;
jvdias cfec38b
 
jvdias cfec38b
     if ( level > log_level )	/* log level high enough? */
jvdias cfec38b
     {
jvdias cfec38b
@@ -315,7 +317,24 @@
jvdias cfec38b
 		             tm->tm_mon+1,  tm->tm_mday,
jvdias cfec38b
 			     tm->tm_hour, tm->tm_min, tm->tm_sec, ws );
jvdias cfec38b
 #ifdef SYSLOG
jvdias cfec38b
+        /* block all handled signals before syslog(), else an lprintf in
jvdias cfec38b
+         * a signal handler could deadlock
jvdias cfec38b
+	 */
jvdias cfec38b
+	sigemptyset(&ss);
jvdias cfec38b
+	sigaddset(&ss, SIGALRM);
jvdias cfec38b
+	sigaddset(&ss, SIGCHLD);
jvdias cfec38b
+	sigaddset(&ss, SIGHUP);
jvdias cfec38b
+	sigaddset(&ss, SIGINT);
jvdias cfec38b
+	sigaddset(&ss, SIGPIPE);
jvdias cfec38b
+	sigaddset(&ss, SIGQUIT);
jvdias cfec38b
+	sigaddset(&ss, SIGTERM);
jvdias cfec38b
+	sigaddset(&ss, SIGUSR1);
jvdias cfec38b
+	sigaddset(&ss, SIGUSR2);
jvdias cfec38b
+	sigprocmask(SIG_BLOCK, &ss, &oss;;
jvdias cfec38b
+
jvdias cfec38b
 	syslog( LOG_NOTICE, "%s", ws );
jvdias cfec38b
+
jvdias cfec38b
+	sigprocmask(SIG_SETMASK, &oss, 0L);
jvdias cfec38b
 #endif
jvdias cfec38b
     }
jvdias cfec38b
     else if ( level != L_ERROR && level != L_FATAL )
jvdias cfec38b
@@ -334,7 +353,21 @@
jvdias cfec38b
 			     ( errnr <= sys_nerr ) ? sys_errlist[errnr]:
jvdias cfec38b
 			     "<error not in list>" );
jvdias cfec38b
 #ifdef SYSLOG
jvdias cfec38b
+	sigemptyset(&ss);
jvdias cfec38b
+	sigaddset(&ss, SIGALRM);
jvdias cfec38b
+	sigaddset(&ss, SIGCHLD);
jvdias cfec38b
+	sigaddset(&ss, SIGHUP);
jvdias cfec38b
+	sigaddset(&ss, SIGINT);
jvdias cfec38b
+	sigaddset(&ss, SIGPIPE);
jvdias cfec38b
+	sigaddset(&ss, SIGQUIT);
jvdias cfec38b
+	sigaddset(&ss, SIGTERM);
jvdias cfec38b
+	sigaddset(&ss, SIGUSR1);
jvdias cfec38b
+	sigaddset(&ss, SIGUSR2);
jvdias cfec38b
+	sigprocmask(SIG_BLOCK, &ss, &oss;;
jvdias cfec38b
+
jvdias cfec38b
 	syslog( level == L_FATAL? LOG_ALERT: LOG_ERR, "%s: %m", ws );
jvdias cfec38b
+
jvdias cfec38b
+	sigprocmask(SIG_SETMASK, &oss, 0L);
jvdias cfec38b
 #endif
jvdias cfec38b
 
jvdias cfec38b
 #ifndef SYSLOG