diff -urN mingetty-1.00/Makefile mingetty-1.00-autologin/Makefile --- mingetty-1.00/Makefile Mon Mar 4 07:23:56 2002 +++ mingetty-1.00-autologin/Makefile Tue Dec 31 16:54:22 2002 @@ -1,6 +1,6 @@ DESTDIR= CC=gcc -CFLAGS=-O2 -Wall -pipe -D_GNU_SOURCE +CFLAGS=$(RPM_OPTS) -Wall -D_GNU_SOURCE MANDIR=/usr/man/man8 SBINDIR=/sbin Binary files mingetty-1.00/mingetty and mingetty-1.00-autologin/mingetty differ diff -urN mingetty-1.00/mingetty-0.9.4-autologin.patch mingetty-1.00-autologin/mingetty-0.9.4-autologin.patch --- mingetty-1.00/mingetty-0.9.4-autologin.patch Mon Mar 4 07:14:22 2002 +++ mingetty-1.00-autologin/mingetty-0.9.4-autologin.patch Wed Dec 31 17:00:00 1969 @@ -1,202 +0,0 @@ ---- mingetty-0.9.4/mingetty.8.autologin Fri Jun 14 09:54:01 1996 -+++ mingetty-0.9.4/mingetty.8 Sun Nov 26 10:34:49 2000 -@@ -3,7 +3,7 @@ - mingetty \- minimal getty for consoles - .SH SYNOPSIS - .B mingetty --[\-\-noclear] [\-\-long\-hostname] -+[\-\-noclear] [\-\-long\-hostname] [\-\-autologin username] - .I tty - .PP - .SH DESCRIPTION -@@ -26,6 +26,41 @@ - .B \-\-long\-hostname - By default the hostname is only printed until the first dot. - With this option enabled, the full text from gethostname() is shown. -+.TP -+.B \-\-autologin username -+Log the specified user onto the console (normally -+.IR /dev/tty1 ) -+when the system is first booted without prompting for a username or -+password. -+.IP -+When the autologin option is supplied, -+.B mingetty -+will check that the controlling terminal is the console (normally -+.IR /dev/tty1 ), -+that a reasonable username has been supplied, and that this is the -+first autologin request since the system has booted. If all of these -+conditions have been met, a request for an unauthenticated login is -+passed to the -+.B login -+program. Otherwise, a normal interactive login is performed. -+.IP -+The -+.B login -+program may deny the request for an unauthenticated login. Typically -+this will happen when the user is root, has a UID of 0, or whenever a -+normal interactive login would be denied due to the access -+restrictions specified in the -+.IR nologin , -+.IR usertty , -+or -+.I securetty -+files. -+.IP -+Only a single autologin request will be issued after a system boot. -+If the automated login request is denied, or if the user logs out, -+.B mingetty -+will revert to performing normal interactive logins for all subsequent -+login requests. - .PP - .SH "ISSUE ESCAPES" - .B mingetty -@@ -63,7 +98,8 @@ - .PP - .SH FILES - .IR /etc/issue , --.IR /var/run/utmp . -+.IR /var/run/utmp , -+.IR /var/log/autologin . - .PP - .SH "SEE ALSO" - .BR mgetty (8), ---- mingetty-0.9.4/mingetty.c.autologin Sun Nov 26 10:54:13 2000 -+++ mingetty-0.9.4/mingetty.c Sun Nov 26 10:28:29 2000 -@@ -17,7 +17,7 @@ - * should be very reliable. For a modem getty, I'd also use nothing else - * but mgetty. - * -- * Usage: mingetty [--noclear] tty -+ * Usage: mingetty [--noclear] [--autologin username] tty - * Example entry in /etc/inittab: 1:123:respawn:/sbin/mingetty tty1 - * - * This program is free software; you can redistribute it and/or -@@ -49,6 +49,20 @@ - #endif - - #ifdef linux -+/* Autologin stuff. Currently Linux-specific, since there's no -+ standard way of getting the system boot time. The kernel.h and the -+ sysinfo prototype are used to get the system uptime under Linux. */ -+#include -+int sysinfo(struct sysinfo *info); -+ -+/* AUTO_LAST points to a timestamp file used to limit autologins to -+ one per system boot. */ -+#define AUTO_LAST "/var/log/autologin" -+ -+/* AUTO_TTY is the tty on which autologins will be accepted. If set -+ to an empty string, autologins will be accepted on any tty. */ -+#define AUTO_TTY "tty1" -+ - #include - #define USE_SYSLOG - #endif -@@ -80,7 +94,8 @@ - static int noclear = 0; - /* Print the whole string of gethostname() instead of just until the next "." */ - static int longhostname = 0; -- -+/* If supplied, attempt an automatic login with this username. */ -+static char *autologin_name = NULL; - - /* - * output error messages -@@ -385,6 +400,62 @@ - return logname; - } - -+/* -+ * autologin_ok -- returns 1 if it's okay to auto-login when: -+ * this login is from /dev/tty1; and -+ * there was a login name passed with the --autologin option; and -+ * the autologin_name contains only "nice" characters; and -+ * this is the first autologin attempt since the last boot; -+ * return 0 otherwise. -+ */ -+static int autologin_ok(void) -+{ -+ char c, *cp; -+ int stat_err, fd; -+ struct sysinfo info; -+ struct stat sbuf; -+ -+ /* Autologins are restricted to AUTO_TTY if non-empty. */ -+ if (AUTO_TTY[0] && strcmp(tty, AUTO_TTY)) -+ return 0; -+ -+ /* An all-alphanumeric autologin name must be supplied. */ -+ if (autologin_name == NULL || autologin_name[0] == '\0') -+ return 0; -+ for (cp = autologin_name; (c = *cp); cp++) -+ if (!isalnum(c) && c != '_') -+ return 0; -+ -+ /* Get the uptime in info.uptime, and the last autologin time -+ in sbuf.st_mtime. */ -+ sysinfo(&info); -+ stat_err = stat(AUTO_LAST, &sbuf); -+ -+ /* If a stat error other than "no such file" occurs, I don't -+ know what went wrong, so I'll proceed with caution by -+ denying the autologin request. */ -+ if (stat_err && errno != ENOENT) -+ return 0; -+ -+ /* If there's been an autologin granted since the last boot, -+ deny this and any subsequent attempts. Note that this test -+ is skipped if the AUTO_LAST file doesn't exist. */ -+ if (!stat_err && time(NULL) - info.uptime < sbuf.st_mtime) -+ return 0; -+ -+ /* Create the AUTO_LAST file. The mtime of this file provides -+ a persistent record of the last time that an autologin -+ request was granted. Deny the autologin request if either -+ the file open or file close fails. */ -+ if ((fd=open(AUTO_LAST, O_WRONLY | O_CREAT | O_TRUNC, 0644)) < 0) -+ return 0; -+ if (close(fd) != 0) -+ return 0; -+ -+ /* All tests are okay, so grant the autologin request. */ -+ return 1; -+} -+ - static void usage (void) - { - error ("usage: '%s tty' with e.g. tty=tty1", progname); -@@ -393,6 +464,7 @@ - static struct option const long_options[] = { - { "noclear", no_argument, &noclear, 1}, - { "long-hostname", no_argument, &longhostname, 1}, -+ { "autologin", required_argument, NULL, 'a'}, - { 0, 0, 0, 0 } - }; - -@@ -418,6 +490,9 @@ - switch (c) { - case 0: - break; -+ case 'a': -+ autologin_name = optarg; -+ break; - default: - usage (); - } -@@ -438,9 +513,12 @@ - /* flush input and output queues, important for modems */ - ioctl (0, TCFLSH, 2); - -- while ((logname = get_logname ()) == 0); -- -- execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL); -+ if (autologin_ok()) { -+ execl (_PATH_LOGIN, _PATH_LOGIN, "-f", autologin_name, NULL); -+ } else { -+ while ((logname = get_logname ()) == 0) ; -+ execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL); -+ } - error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]); - exit (0); - } diff -urN mingetty-1.00/mingetty.8 mingetty-1.00-autologin/mingetty.8 --- mingetty-1.00/mingetty.8 Mon Mar 4 07:00:44 2002 +++ mingetty-1.00-autologin/mingetty.8 Tue Dec 31 17:00:04 2002 @@ -3,7 +3,7 @@ mingetty \- minimal getty for consoles .SH SYNOPSIS .B mingetty -[\-\-noclear] [\-\-long\-hostname] +[\-\-noclear] [\-\-long\-hostname] [\-\-autologin username] .I tty .PP .SH DESCRIPTION @@ -26,6 +26,41 @@ .B \-\-long\-hostname By default the hostname is only printed until the first dot. With this option enabled, the full text from gethostname() is shown. +.TP +.B \-\-autologin username +Log the specified user onto the console (normally +.IR /dev/tty1 ) +when the system is first booted without prompting for a username or +password. +.IP +When the autologin option is supplied, +.B mingetty +will check that the controlling terminal is the console (normally +.IR /dev/tty1 ), +that a reasonable username has been supplied, and that this is the +first autologin request since the system has booted. If all of these +conditions have been met, a request for an unauthenticated login is +passed to the +.B login +program. Otherwise, a normal interactive login is performed. +.IP +The +.B login +program may deny the request for an unauthenticated login. Typically +this will happen when the user is root, has a UID of 0, or whenever a +normal interactive login would be denied due to the access +restrictions specified in the +.IR nologin , +.IR usertty , +or +.I securetty +files. +.IP +Only a single autologin request will be issued after a system boot. +If the automated login request is denied, or if the user logs out, +.B mingetty +will revert to performing normal interactive logins for all subsequent +login requests. .PP .SH "ISSUE ESCAPES" .B mingetty @@ -64,7 +99,8 @@ .PP .SH FILES .IR /etc/issue , -.IR /var/run/utmp . +.IR /var/run/utmp , +.IR /var/log/autologin . .PP .SH "SEE ALSO" .BR mgetty (8), diff -urN mingetty-1.00/mingetty.c mingetty-1.00-autologin/mingetty.c --- mingetty-1.00/mingetty.c Mon Mar 4 07:10:01 2002 +++ mingetty-1.00-autologin/mingetty.c Tue Dec 31 17:11:36 2002 @@ -10,7 +10,7 @@ * should be very reliable. For a modem getty, I'd also use nothing else * but mgetty. * - * Usage: mingetty [--noclear] tty + * Usage: mingetty [--noclear] [--autologin username] tty * Example entry in /etc/inittab: 1:123:respawn:/sbin/mingetty tty1 * * This program is free software; you can redistribute it and/or @@ -46,7 +46,22 @@ #define USE_SYSLOG #endif - /* If USE_SYSLOG is undefined all diagnostics go directly to /dev/console. */ +/* Autologin stuff. Currently Linux-specific, since there's no + standard way of getting the system boot time. The kernel.h and the + sysinfo prototype are used to get the system uptime under Linux. */ +#include +int sysinfo(struct sysinfo *info); + +/* AUTO_LAST points to a timestamp file used to limit autologins to + one per system boot. */ +#define AUTO_LAST "/var/log/autologin" + +/* AUTO_TTY is the tty on which autologins will be accepted. If set + to an empty string, autologins will be accepted on any tty. */ +#define AUTO_TTY "tty1" + +/* If USE_SYSLOG is undefined all diagnostics go directly to /dev/console. */ + #ifdef USE_SYSLOG #include #endif @@ -73,7 +88,8 @@ static int noclear = 0; /* Print the whole string of gethostname() instead of just until the next "." */ static int longhostname = 0; - +/* If supplied, attempt an automatic login with this username. */ +static char *autologin_name = NULL; /* * output error messages @@ -378,6 +394,62 @@ return logname; } +/* + * autologin_ok -- returns 1 if it's okay to auto-login when: + * this login is from /dev/tty1; and + * there was a login name passed with the --autologin option; and + * the autologin_name contains only "nice" characters; and + * this is the first autologin attempt since the last boot; + * return 0 otherwise. + */ +static int autologin_ok(void) +{ + char c, *cp; + int stat_err, fd; + struct sysinfo info; + struct stat sbuf; + + /* Autologins are restricted to AUTO_TTY if non-empty. */ + if (AUTO_TTY[0] && strcmp(tty, AUTO_TTY)) + return 0; + + /* An all-alphanumeric autologin name must be supplied. */ + if (autologin_name == NULL || autologin_name[0] == '\0') + return 0; + for (cp = autologin_name; (c = *cp); cp++) + if (!isalnum(c) && c != '_') + return 0; + + /* Get the uptime in info.uptime, and the last autologin time + in sbuf.st_mtime. */ + sysinfo(&info); + stat_err = stat(AUTO_LAST, &sbuf); + + /* If a stat error other than "no such file" occurs, I don't + know what went wrong, so I'll proceed with caution by + denying the autologin request. */ + if (stat_err && errno != ENOENT) + return 0; + + /* If there's been an autologin granted since the last boot, + deny this and any subsequent attempts. Note that this test + is skipped if the AUTO_LAST file doesn't exist. */ + if (!stat_err && time(NULL) - info.uptime < sbuf.st_mtime) + return 0; + + /* Create the AUTO_LAST file. The mtime of this file provides + a persistent record of the last time that an autologin + request was granted. Deny the autologin request if either + the file open or file close fails. */ + if ((fd=open(AUTO_LAST, O_WRONLY | O_CREAT | O_TRUNC, 0644)) < 0) + return 0; + if (close(fd) != 0) + return 0; + + /* All tests are okay, so grant the autologin request. */ + return 1; +} + static void usage (void) { error ("usage: '%s tty' with e.g. tty=tty1", progname); @@ -386,6 +458,7 @@ static struct option const long_options[] = { { "noclear", no_argument, &noclear, 1}, { "long-hostname", no_argument, &longhostname, 1}, + { "autologin", required_argument, NULL, 'a'}, { 0, 0, 0, 0 } }; @@ -415,6 +488,9 @@ switch (c) { case 0: break; + case 'a': + autologin_name = optarg; + break; default: usage (); } @@ -435,9 +511,12 @@ /* flush input and output queues, important for modems */ ioctl (0, TCFLSH, 2); - while ((logname = get_logname ()) == 0); - - execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL); + if (autologin_ok()) { + execl (_PATH_LOGIN, _PATH_LOGIN, "-f", autologin_name, NULL); + } else { + while ((logname = get_logname ()) == 0) ; + execl (_PATH_LOGIN, _PATH_LOGIN, "--", logname, NULL); + } error ("%s: can't exec " _PATH_LOGIN ": %s", tty, sys_errlist[errno]); exit (0); } Binary files mingetty-1.00/mingetty.o and mingetty-1.00-autologin/mingetty.o differ