diff --git a/lib/des/read_pwd.c b/lib/des/read_pwd.c index 1dcb866a7..3e63c61bc 100644 --- a/lib/des/read_pwd.c +++ b/lib/des/read_pwd.c @@ -6,32 +6,25 @@ #include #include +/* Ick! */ +#if defined(__svr4__) || defined(_IRIX) +#define TERMIO +#endif + #ifndef VMS #ifndef MSDOS -#if !(defined(_IRIX) || defined(sgi)) -#ifdef CRAY +#ifdef TERMIO #include #define sgttyb termio #define sg_flags c_lflag -#else /* !CRAY */ -#ifndef USE_TERMIO +#define TIOCGETP TCGETA +#define TIOCSETP TCSETA +#else /* !TERMIO */ #include -#else -#include -#endif #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 @@ -39,258 +32,253 @@ #include #include struct IOSB { - short iosb$w_value; - short iosb$w_count; - long iosb$l_info; -}; + short iosb$w_value; + short iosb$w_count; + long iosb$l_info; + }; +#endif +#ifndef NSIG +#define NSIG 32 #endif -static void read_till_nl(FILE *in); -static int read_pw(char *buf, char *buff, int size, char *prompt, int verify); +static void read_till_nl(); +static int read_pw(); +static void recsig(); +static void pushsig(); +static void popsig(); #ifdef MSDOS static int noecho_fgets(); #endif static void (*savsig[NSIG])(); - static jmp_buf save; +static jmp_buf save; -static RETSIGTYPE -recsig() -{ - longjmp(save,1); -} - -static RETSIGTYPE -pushsig() -{ - int i; +int des_read_password(key,prompt,verify) +des_cblock *key; +char *prompt; +int verify; + { + int ok; + char buf[BUFSIZ],buff[BUFSIZ]; - for (i=0; iBUFSIZ)?BUFSIZ:length,prompt,verify); + bzero(buff,BUFSIZ); + return(ret); + } -int des_read_2passwords(des_cblock (*key1), des_cblock (*key2), char *prompt, int verify) -{ - int ok; - char buf[BUFSIZ],buff[BUFSIZ]; - - if ((ok=read_pw(buf,buff,BUFSIZ,prompt,verify)) == 0) - des_string_to_2keys(buf,key1,key2); - memset(buf,0,BUFSIZ); - memset(buff,0,BUFSIZ); - return(ok); -} - -int des_read_pw_string(char *buf, int length, char *prompt, int verify) -{ - char buff[BUFSIZ]; - int ret; - - ret=read_pw(buf,buff,(length>BUFSIZ)?BUFSIZ:length,prompt,verify); - memset(buff,0,BUFSIZ); - return(ret); -} - -static void read_till_nl(FILE *in) -{ +static void read_till_nl(in) +FILE *in; + { #define SIZE 4 - char buf[SIZE+1]; + char buf[SIZE+1]; - do { - fgets(buf,SIZE,in); - } while (strchr(buf,'\n') == NULL); -} + 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) -{ +static int read_pw(buf,buff,size,prompt,verify) +char *buf,*buff; +int size; +char *prompt; +int verify; + { #ifndef VMS #ifndef MSDOS -#ifndef USE_TERMIO - struct sgttyb tty_orig,tty_new; -#else - struct termios tty_orig, tty_new; -#endif + 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; + 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; + int ok=0; + char *p; + 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; + 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); + if (ioctl(fileno(tty),TIOCGETP,(char *)&tty_orig) == -1) + return(-1); + bcopy(&(tty_orig),&(tty_new),sizeof(tty_orig)); #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); +#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; + if (setjmp(save)) + { + ok=0; + goto error; + } + pushsig(); + ps=1; #ifndef VMS #ifndef MSDOS -#ifndef USE_TERMIO - tty_new.sg_flags &= ~ECHO; -#else - tty_new.c_lflag &= ~ECHO; -#endif + 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); + 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); +#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; + ps=2; - while (!ok) - { - fputs(prompt,stderr); - fflush(stderr); + 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); + 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; - } + 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? */ +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); + 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); +#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); + if (ps >= 1) popsig(); + if (stdin != tty) fclose(tty); #ifdef VMS - status = SYS$DASSGN(channel); + status = SYS$DASSGN(channel); #endif - return(!ok); -} + return(!ok); + } + +static void pushsig() + { + int i; + + for (i=0; i