📄 getpass.c
字号:
#include <signal.h>
#include <stdio.h>
#include <termios.h>
#define MAX_PASS_LEN 8 /* max #chars for user to enter */
char *
getpass(const char *prompt)
{
static char buf[MAX_PASS_LEN + 1]; /* null byte at end */
char *ptr;
sigset_t sig, sigsave;
struct termios term, termsave;
FILE *fp;
int c;
if ( (fp = fopen(ctermid(NULL), "r+")) == NULL)
return(NULL);
setbuf(fp, NULL);
sigemptyset(&sig); /* block SIGINT & SIGTSTP, save signal mask */
sigaddset(&sig, SIGINT);
sigaddset(&sig, SIGTSTP);
sigprocmask(SIG_BLOCK, &sig, &sigsave);
tcgetattr(fileno(fp), &termsave); /* save tty state */
term = termsave; /* structure copy */
term.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);
tcsetattr(fileno(fp), TCSAFLUSH, &term);
fputs(prompt, fp);
ptr = buf;
while ( (c = getc(fp)) != EOF && c != '\n') {
if (ptr < &buf[MAX_PASS_LEN])
*ptr++ = c;
}
*ptr = 0; /* null terminate */
putc('\n', fp); /* we echo a newline */
/* restore tty state */
tcsetattr(fileno(fp), TCSAFLUSH, &termsave);
/* restore signal mask */
sigprocmask(SIG_SETMASK, &sigsave, NULL);
fclose(fp); /* done with /dev/tty */
return(buf);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -