Changeset 264 in openpam


Ignore:
Timestamp:
Jul 14, 2003, 2:17:47 PM (11 years ago)
Author:
des
Message:

Use read(2) on fileno(stdin) rather than fgets(3). This make timeout
handling considerably simpler, eliminating the need for setjmp(3) and
evil global variables.

Portions submitted by: Dmitry V. Levin <ldv@…>

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/configure.in

    r254 r264  
    1 dnl $P4: //depot/projects/openpam/configure.in#2 $ 
     1dnl $P4: //depot/projects/openpam/configure.in#3 $ 
    22 
    33AC_PREREQ(2.53) 
     
    77 
    88AC_CANONICAL_SYSTEM 
     9AC_C_VOLATILE 
    910AC_DISABLE_STATIC 
    1011AC_PROG_LIBTOOL 
     
    6465AM_CONDITIONAL(WITH_PAM_UNIX, test "x$with_pam_unix" = "xyes") 
    6566 
     67AC_PROG_INSTALL 
     68 
    6669AC_CHECK_HEADERS(crypt.h) 
    6770 
    68 AC_PROG_INSTALL 
     71AC_CHECK_FUNCS(fpurge) 
    6972 
    7073DL_LIBS= 
  • trunk/include/security/openpam.h

    r245 r264  
    3232 * SUCH DAMAGE. 
    3333 * 
    34  * $P4: //depot/projects/openpam/include/security/openpam.h#24 $ 
     34 * $P4: //depot/projects/openpam/include/security/openpam.h#25 $ 
    3535 */ 
    3636 
     
    178178        struct pam_response **_resp, 
    179179        void *_data); 
     180 
     181extern int openpam_ttyconv_timeout; 
    180182 
    181183/* 
  • trunk/lib/openpam_ttyconv.c

    r250 r264  
    3232 * SUCH DAMAGE. 
    3333 * 
    34  * $P4: //depot/projects/openpam/lib/openpam_ttyconv.c#21 $ 
     34 * $P4: //depot/projects/openpam/lib/openpam_ttyconv.c#22 $ 
    3535 */ 
    3636 
     
    3838 
    3939#include <ctype.h> 
     40#include <errno.h> 
    4041#include <setjmp.h> 
    4142#include <signal.h> 
     
    5152 
    5253int openpam_ttyconv_timeout = 0; 
    53 static jmp_buf jmpenv; 
    54 static int timed_out; 
    5554 
    5655static void 
    5756timeout(int sig) 
    5857{ 
    59         timed_out = 1; 
    60         longjmp(jmpenv, sig); 
     58 
     59        (void)sig; 
    6160} 
    6261 
     
    6867        sigset_t saved_sigset, sigset; 
    6968        unsigned int saved_alarm; 
     69        int eof, error, fd, timed_out; 
    7070        size_t len; 
    7171        char *retval; 
     72        char ch; 
    7273 
    7374        sigemptyset(&sigset); 
     
    8081        sigaction(SIGALRM, &action, &saved_action); 
    8182        fputs(msg, stdout); 
     83        fflush(stdout); 
     84#ifdef HAVE_FPURGE 
     85        fpurge(stdin); 
     86#endif 
     87        fd = fileno(stdin); 
    8288        buf[0] = '\0'; 
    8389        timed_out = 0; 
     90        eof = error = timed_out = 0; 
    8491        saved_alarm = alarm(openpam_ttyconv_timeout); 
    85         if (setjmp(jmpenv) == 0) 
    86                 fgets(buf, sizeof buf, stdin); 
    87         else 
    88                 fputs(" timeout!\n", stderr); 
     92        ch = '\0'; 
     93        for (len = 0; ch != '\n' && !eof && !error; ++len) { 
     94                switch (read(fd, &ch, 1)) { 
     95                case 1: 
     96                        if (len < PAM_MAX_RESP_SIZE - 1) { 
     97                                buf[len + 1] = '\0'; 
     98                                buf[len] = ch; 
     99                        } 
     100                        break; 
     101                case 0: 
     102                        eof = 1; 
     103                        break; 
     104                default: 
     105                        error = errno; 
     106                        break; 
     107                } 
     108        } 
    89109        alarm(0); 
    90110        sigaction(SIGALRM, &saved_action, NULL); 
    91111        sigprocmask(SIG_SETMASK, &saved_sigset, NULL); 
    92112        alarm(saved_alarm); 
    93         if (timed_out || ferror(stdin) || feof(stdin)) { 
     113        if (error == EINTR) 
     114                fputs(" timeout!", stderr); 
     115        if (error || eof) { 
     116                fputs("\n", stderr); 
    94117                memset(buf, 0, sizeof(buf)); 
    95118                return (NULL); 
Note: See TracChangeset for help on using the changeset viewer.