Changeset 264 in openpam


Ignore:
Timestamp:
Jul 14, 2003, 2:17:47 PM (12 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.