Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37560897
en ru br
Репозитории ALT
S:1.0.0-alt9
5.1: 1.0.0-alt5.M51.1
4.1: 1.0.0-alt1
4.0: 1.0.0-alt1
3.0: 1.0.0-ipl10mdk
www.altlinux.org/Changes

Группа :: Система/Основа
Пакет: autologin

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: autologin-1.1.0-tty-dev.patch
Скачать


--- autologin-1.0.0.orig/src/autologin.c	2010-04-02 13:33:10 +0400
+++ autologin-1.0.0/src/autologin.c	2010-04-02 13:41:02 +0400
@@ -19,6 +19,9 @@
 #include <security/pam_appl.h>
 #include <sys/wait.h>
 #include <signal.h>
+#include <sys/ioctl.h>
+#include <linux/vt.h>
+#include <linux/kd.h>
 static int PAM_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr)
 {
 	/* We use PAM to authenticate for pam_console only, we don't need
@@ -37,6 +40,33 @@
 {
   kill(child, SIGTERM);
 }
+
+static int
+is_a_console(int fd) {
+	char arg;
+
+	arg = 0;
+	return (ioctl(fd, KDGKBTYPE, &arg) == 0
+		&& ((arg == KB_101) || (arg == KB_84)));
+}
+
+static int
+open_a_console(const char *fnam) {
+	int fd;
+
+	fd = open(fnam, O_RDWR);
+	if (fd < 0)
+		fd = open(fnam, O_WRONLY);
+	if (fd < 0)
+		fd = open(fnam, O_RDONLY);
+	if (fd < 0)
+		return -1;
+	if (!is_a_console(fd)) {
+		close(fd);
+		return -1;
+	}
+	return fd;
+}
 #endif
 
 char runthis[1024];
@@ -56,7 +86,9 @@
 	int outfd;
 #ifdef HAVE_PAM
 	pam_handle_t *pamh;
-	int status;
+	int status, fd;
+	struct vt_stat vtstat;
+	char console[6];
 #endif
 
 	runthis[0]=0; runthis[1023]=0;
@@ -159,10 +191,29 @@
 	
 	/* Take console ownership and satisfy PAM */
 #ifdef HAVE_PAM
+	fd = open_a_console("/proc/self/fd/0");
+	if (fd < 0)
+		fd = open_a_console("/dev/tty");
+	if (fd < 0)
+		fd = open_a_console("/dev/tty0");
+	if (fd < 0)
+		fd = open_a_console("/dev/vc/0");
+	if (fd < 0)
+		fd = open_a_console("/dev/console");
+	if (fd < 0) {
+		free(dir); free(shell);
+		puts("autologin ERROR: Couldn't get a file descriptor referring to the console");
+		return 1;
+	}
+	if (ioctl(fd, VT_GETSTATE, &vtstat)) {
+		puts("autologin ERROR: Can't get VT_GETSTATE of the console");
+		return 1;
+	}
+	sprintf(console, "%s%d", "tty", vtstat.v_active);
 	pam_start("autologin", user, &PAM_conversation, &pamh);
 	pam_acct_mgmt(pamh, PAM_SILENT);
 	pam_set_item(pamh, PAM_USER, user);
-	pam_set_item(pamh, PAM_TTY, "tty0");
+	pam_set_item(pamh, PAM_TTY, console);
 	pam_set_item(pamh, PAM_RHOST, NULL);
 	pam_set_item(pamh, PAM_RUSER, user);
 	pam_open_session(pamh, PAM_SILENT);
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin