868f7a8
diff -up mgetty-1.1.36/login.c.167830 mgetty-1.1.36/login.c
868f7a8
--- mgetty-1.1.36/login.c.167830	2008-10-09 22:57:23.000000000 +0200
868f7a8
+++ mgetty-1.1.36/login.c	2008-10-09 22:57:23.000000000 +0200
868f7a8
@@ -18,7 +18,7 @@
868f7a8
 #include <sys/types.h>
868f7a8
 #include <sys/stat.h>
868f7a8
 #include <fcntl.h>
868f7a8
-
868f7a8
+#include <sys/ioctl.h>
868f7a8
 /* NeXTStep/86 has some byte order problems (Christian Starkjohann) */
868f7a8
 #if defined(NeXT) && defined(__LITTLE_ENDIAN__) && !defined(NEXTSGTTY)
868f7a8
 # define pw_uid pw_short_pad1
868f7a8
@@ -372,6 +372,8 @@ fallthrough:
868f7a8
     if ( fcntl(0, F_GETFD, 0 ) & 1 ) 
868f7a8
 	lprintf( L_WARN, "WARNING: close-on-exec bit set on FD 0 - OS BUG?" );
868f7a8
 
868f7a8
+    ioctl(0, TIOCSCTTY, (void*)1);
868f7a8
+
868f7a8
     /* execute login */
868f7a8
     execv( cmd, argv );
868f7a8
 
868f7a8
diff -up mgetty-1.1.36/mgetty.c.167830 mgetty-1.1.36/mgetty.c
868f7a8
--- mgetty-1.1.36/mgetty.c.167830	2008-10-09 22:57:23.000000000 +0200
868f7a8
+++ mgetty-1.1.36/mgetty.c	2008-10-09 22:57:23.000000000 +0200
868f7a8
@@ -1034,7 +1034,15 @@ Ring_got_action:
jvdias 6909da9
 	}
jvdias 6909da9
 
jvdias 6909da9
 	/* set permissions to "rw-------" for login */
jvdias 6909da9
-	(void) chmod(devname, 0600);
jvdias 6909da9
+
jvdias 6909da9
+	/* JVD, 2005-09-16, : see Red Hat BZ 167830! 
jvdias 6909da9
+	 * If devname is owned by 'uucp', and we run login as a non-root userid,
jvdias 6909da9
+	 * then login gets a terminal it has no RW perms for ... bad idea!
jvdias 6909da9
+	 *
jvdias 6909da9
+	 * Let users control the tty device access mode with with 'port-mode'!  
jvdias 6909da9
+	 */
jvdias 6909da9
+	if( ! c_isset(port_mode) )
jvdias 6909da9
+	    (void) chmod(devname, 0600);
jvdias 6909da9
 
jvdias 6909da9
 	/* set ttystate for login ("after"),
jvdias 6909da9
 	 *  cr-nl mapping flags are set by getlogname()!
868f7a8
@@ -1079,7 +1087,15 @@ Ring_got_action:
jvdias 6909da9
 	{
jvdias 6909da9
 	    lprintf( L_WARN, "WARNING: starting login while DCD is low!" );
jvdias 6909da9
 	}
jvdias 6909da9
-
jvdias 6909da9
+	
jvdias 6909da9
+	/* try to ensure the terminal buffers are clear when we hand over terminal to login:*/
jvdias 6909da9
+	
jvdias 6909da9
+	tcflush(0, TCIOFLUSH);
jvdias 6909da9
+	tcgetattr(0,&tio;;
jvdias 6909da9
+	tio.c_lflag &= ~TOSTOP;
jvdias 6909da9
+	tcsetattr(0,TCSANOW,&tio;;
jvdias 6909da9
+	tcsetpgrp(0,getpid());
jvdias 6909da9
+	
jvdias 6909da9
 	/* hand off to login dispatcher (which will call /bin/login) */
jvdias 6909da9
 	login_dispatch( buf, mgetty_state == St_callback_login? TRUE: FALSE,
jvdias 6909da9
 			c_string(login_config) );