⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getpass.c

📁 unix环境高级编程的源代码
💻 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 + -