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