From de51d302a22656de6e44dba66c3c1d3a170b0616 Mon Sep 17 00:00:00 2001 From: Unknown User d91-jda Date: Thu, 8 Jun 1995 07:30:18 +0000 Subject: [PATCH] Initial revision git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@11 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/des/read_pwd.c | 284 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100644 lib/des/read_pwd.c diff --git a/lib/des/read_pwd.c b/lib/des/read_pwd.c new file mode 100644 index 000000000..1aff7501b --- /dev/null +++ b/lib/des/read_pwd.c @@ -0,0 +1,284 @@ +/* read_pwd.c */ +/* Copyright (C) 1993 Eric Young - see README for more details */ +/* 06-Apr-92 Luke Brennan Support for VMS */ +#include "des_locl.h" +#include +#include +#include + +#ifndef VMS +#ifndef MSDOS +#if !(defined(_IRIX) || defined(sgi)) +#ifdef CRAY +#include +#define sgttyb termio +#define sg_flags c_lflag +#else /* !CRAY */ +#include +#endif +#include +#else /* _IRIX */ +#define USE_TERMIO +#include +#define sgttyb termios +#define sg_flags c_lflag +#endif +#else /* MSDOS */ +#define fgets(a,b,c) noecho_fgets(a,b,c) +#ifndef NSIG +#define NSIG 32 +#endif +#endif +#else /* VMS */ +#include +#include +#include +#include +struct IOSB { + short iosb$w_value; + short iosb$w_count; + long iosb$l_info; +}; +#endif + +static void read_till_nl(FILE *in); +static int read_pw(char *buf, char *buff, int size, char *prompt, int verify); +#ifdef MSDOS +static int noecho_fgets(); +#endif + +static void (*savsig[NSIG])(); + static jmp_buf save; + +static RETSIGTYPE +recsig() +{ + longjmp(save,1); +} + +static RETSIGTYPE +pushsig() +{ + int i; + + for (i=0; iBUFSIZ)?BUFSIZ:length,prompt,verify); + memset(buff,0,BUFSIZ); + return(ret); +} + +static void read_till_nl(FILE *in) +{ +#define SIZE 4 + char buf[SIZE+1]; + + do { + fgets(buf,SIZE,in); + } while (strchr(buf,'\n') == NULL); +} + +/* return 0 if ok, 1 (or -1) otherwise */ +static int +read_pw(char *buf, char *buff, int size, char *prompt, int verify) +{ +#ifndef VMS +#ifndef MSDOS + struct sgttyb tty_orig,tty_new; +#endif /* !MSDOS */ +#else + struct IOSB iosb; + $DESCRIPTOR(terminal,"TT"); + long tty_orig[3], tty_new[3]; + long status; + unsigned short channel = 0; +#endif + volatile int ok=0; + char *p; + volatile int ps=0; + FILE *tty; + +#ifndef MSDOS + if ((tty=fopen("/dev/tty","r")) == NULL) + tty=stdin; +#else /* MSDOS */ + if ((tty=fopen("con","r")) == NULL) + tty=stdin; +#endif /* MSDOS */ +#ifndef VMS +#ifdef TIOCGETP +#ifdef USE_TERMIO + if (tcgetattr(fileno(tty), &tty_orig) == -1) + return(-1); +#else + if (ioctl(fileno(tty),TIOCGETP,(char *)&tty_orig) == -1) + return(-1); +#endif + memcpy(&(tty_new),&(tty_orig),sizeof(tty_orig)); +#endif +#else /* VMS */ + status = SYS$ASSIGN(&terminal,&channel,0,0); + if (status != SS$_NORMAL) + return(-1); + status=SYS$QIOW(0,channel,IO$_SENSEMODE,&iosb,0,0,tty_orig,12,0,0,0,0); + if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL)) + return(-1); +#endif + + if (setjmp(save)) + { + ok=0; + goto error; + } + pushsig(); + ps=1; +#ifndef VMS +#ifndef MSDOS + tty_new.sg_flags &= ~ECHO; +#endif /* !MSDOS */ +#ifdef TIOCSETP +#ifdef USE_TERMIO + if (tcsetattr(fileno(tty), TCSANOW, &tty_new) == -1) + return(-1); +#else + if (ioctl(fileno(tty),TIOCSETP,(char *)&tty_new) == -1) + return(-1); +#endif +#endif +#else /* VMS */ + tty_new[0] = tty_orig[0]; + tty_new[1] = tty_orig[1] | TT$M_NOECHO; + tty_new[2] = tty_orig[2]; + status = SYS$QIOW(0,channel,IO$_SETMODE,&iosb,0,0,tty_new,12,0,0,0,0); + if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL)) + return(-1); +#endif /* VMS */ + ps=2; + + while (!ok) + { + fputs(prompt,stderr); + fflush(stderr); + + buf[0]='\0'; + fgets(buf,size,tty); + if (feof(tty)) goto error; + if ((p=(char *)strchr(buf,'\n')) != NULL) + *p='\0'; + else read_till_nl(tty); + if (verify) + { + fprintf(stderr,"\nVerifying password %s",prompt); + fflush(stderr); + buff[0]='\0'; + fgets(buff,size,tty); + if (feof(tty)) goto error; + if ((p=(char *)strchr(buff,'\n')) != NULL) + *p='\0'; + else read_till_nl(tty); + + if (strcmp(buf,buff) != 0) + { + fprintf(stderr,"\nVerify failure - try again\n"); + fflush(stderr); + continue; + } + } + ok=1; + } + + error: + fprintf(stderr,"\n"); + /* What can we do if there is an error? */ +#ifndef VMS +#ifdef TIOCSETP +#ifdef USE_TERMIO + if (ps >= 2) tcsetattr(fileno(tty), TCSANOW, &tty_orig); +#else + if (ps >= 2) ioctl(fileno(tty),TIOCSETP,(char *)&tty_orig); +#endif +#endif +#else /* VMS */ + if (ps >= 2) + status = SYS$QIOW(0,channel,IO$_SETMODE,&iosb,0,0 + ,tty_orig,12,0,0,0,0); +#endif /* VMS */ + + if (ps >= 1) popsig(); + if (stdin != tty) fclose(tty); +#ifdef VMS + status = SYS$DASSGN(channel); +#endif + return(!ok); +} + +#ifdef MSDOS +static int noecho_fgets(buf,size,tty) + char *buf; + int size; + FILE *tty; +{ + int i; + char *p; + + p=buf; + for (;;) + { + if (size == 0) + { + *p='\0'; + break; + } + size--; + i=getch(); + if (i == '\r') i='\n'; + *(p++)=i; + if (i == '\n') + { + *p='\0'; + break; + } + } +} +#endif