📄 read_pwd.c
字号:
/* 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 <string.h>#include <signal.h>#include <setjmp.h>#ifndef VMS#ifndef MSDOS#ifndef _IRIX#ifdef CRAY#include <termio.h>#define sgttyb termio#define sg_flags c_lflag#else /* !CRAY */#include <sgtty.h>#endif#include <sys/ioctl.h>#else /* _IRIX */struct sgttyb { char sg_ispeed; /* input speed */ char sg_ospeed; /* output speed */ char sg_erase; /* erase character */ char sg_kill; /* kill character */ short sg_flags; /* mode flags */ };#endif#else /* MSDOS */#define fgets(a,b,c) noecho_fgets(a,b,c)#ifndef NSIG#define NSIG 32#endif#endif#else /* VMS */#include <ssdef.h>#include <iodef.h>#include <ttdef.h>#include <descrip.h>struct IOSB { short iosb$w_value; short iosb$w_count; long iosb$l_info; };#endifstatic void read_till_nl();static int read_pw();static void recsig();static void pushsig();static void popsig();#ifdef MSDOSstatic int noecho_fgets();#endifstatic void (*savsig[NSIG])();static jmp_buf save;int des_read_password(key,prompt,verify)des_cblock *key;char *prompt;int verify; { int ok; char buf[BUFSIZ],buff[BUFSIZ]; if ((ok=read_pw(buf,buff,BUFSIZ,prompt,verify)) == 0) des_string_to_key(buf,key); bzero(buf,BUFSIZ); bzero(buff,BUFSIZ); return(ok); }int des_read_2passwords(key1,key2,prompt,verify)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); bzero(buf,BUFSIZ); bzero(buff,BUFSIZ); return(ok); }int des_read_pw_string(buf,length,prompt,verify)char *buf;int length;char *prompt;int verify; { char buff[BUFSIZ]; int ret; ret=read_pw(buf,buff,(length>BUFSIZ)?BUFSIZ:length,prompt,verify); bzero(buff,BUFSIZ); return(ret); }static void read_till_nl(in)FILE *in; {#define SIZE 4 char buf[SIZE+1]; do { fgets(buf,SIZE,in); } while (index(buf,'\n') == NULL); }/* return 0 if ok, 1 (or -1) otherwise */static int read_pw(buf,buff,size,prompt,verify)char *buf,*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 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;#endif /* MSDOS */#ifndef VMS#ifdef TIOCGETP if (ioctl(fileno(tty),TIOCGETP,(char *)&tty_orig) == -1) return(-1); bcopy(&(tty_orig),&(tty_new),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 if (ioctl(fileno(tty),TIOCSETP,(char *)&tty_new) == -1) return(-1);#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 *)index(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 *)index(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 if (ps >= 2) ioctl(fileno(tty),TIOCSETP,(char *)&tty_orig);#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); }static void pushsig() { int i; for (i=0; i<NSIG; i++) savsig[i]=signal(i,recsig); }static void popsig() { int i; for (i=0; i<NSIG; i++) signal(i,savsig[i]); }static void recsig() { longjmp(save,1); }#ifdef MSDOSstatic 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -