login i "no controlling tty"
Jakub Bogusz
qboosh w prioris.mini.pw.edu.pl
Wto, 14 Sie 2001, 22:33:20 CEST
Zaczęło mnie to porządnie wkurzać... szczególnie po zaobserwowaniu tego
samego efektu, który opisuje Bob Van Cleef na devel-en.
Winny jest jakiś workaround na ash - po wycięciu 3 linii[1] znika problem
z używaniem ksh, zsh, csh, ash.
Natomiast efektu na który to ma być workaround nie zaobserwowałem.
Alternatywny sposób rozwiązania problemu to zrobienie we wszystkich
shellach tego co jest w bashu - czyli w razie niepowodzenia
open("/dev/tty",O_RDWR) próbujemy otwierać ttyname(fileno(stdin)) (czyli
tty<numerek>). Ale raczej lepiej poprawić jednego logina niż co najmniej
4 shelle.
[1] a konkretnie:
#v+
--- util-linux-2.11g/login-utils/login.c.orig Thu Jun 7 20:49:09 2001
+++ util-linux-2.11g/login-utils/login.c Tue Aug 14 21:32:16 2001
@@ -1074,32 +1074,32 @@
/*
* Problem: if the user's shell is a shell like ash that doesnt do
* setsid() or setpgrp(), then a ctrl-\, sending SIGQUIT to every
* process in the pgrp, will kill us.
* Solution: use TIOCNOTTY and setsid().
*/
signal(SIGINT, SIG_IGN);
signal(SIGHUP, SIG_IGN); /* ignore signal from TIOCNOTTY below */
childPid = fork();
if (childPid < 0) {
int errsv = errno;
/* error in fork() */
fprintf(stderr,_("login: failure forking: %s"), strerror(errsv));
PAM_END;
exit(0);
} else if (childPid) {
/* parent - wait for child to finish, then cleanup session */
- ioctl(0, TIOCNOTTY, NULL);
+// ioctl(0, TIOCNOTTY, NULL);
signal(SIGHUP, SIG_DFL);
wait(NULL);
PAM_END;
exit(0);
}
/* child */
- setsid();
+// setsid();
/* reopen, as we need controlling tty in the child */
- opentty(ttyn);
+// opentty(ttyn);
#endif
signal(SIGHUP, SIG_DFL);
signal(SIGINT, SIG_DFL);
#v-
--
Jakub Bogusz
http://prioris.mini.pw.edu.pl/~qboosh/
Więcej informacji o liście dyskusyjnej pld-devel-pl