Linux 上可提示用户进行密码输入的功能实现

在 PostgreSQL 代码中,需要连接到数据库的地方都会有一个 simple_prompt 函数,这个函数会提示用户输入密码或其他字符,然后接收用户输入并返回,若是密码则可以设置 echo 参数为 false 来隐藏用户输入。

simple_prompt

这个功能比较独立,完全可以拿出来作为自己的库函数使用;代码如下所示。关键原理是通过 termios 设置隐藏,通过 fgets 获取用户输入。

[code lang=text]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define HAVE_TERMIOS_H

#ifdef HAVE_TERMIOS_H
#include
#endif

typedef enum {false, true} bool;

void simple_prompt(const char *prompt, char *destination, size_t destlen, bool echo)
{
int length;
FILE *termin;
FILE *termout;

#ifdef HAVE_TERMIOS_H
struct termios t_orig;
struct termios t;
#endif

/*
* Do not try to collapse these into one "w+" mode file. Doesn't work on
* some platforms (eg, HPUX 10.20).
*/
termin = fopen("/dev/tty", "r");
termout = fopen("/dev/tty", "w");

if (!termin || !termout)
{
if (termin)
fclose(termin);
if (termout)
fclose(termout);
termin = stdin;
termout = stderr;
}

#ifdef HAVE_TERMIOS_H
if (!echo)
{
tcgetattr(fileno(termin), &t);
t_orig = t;
t.c_lflag &= ~ECHO;
tcsetattr(fileno(termin), TCSAFLUSH, &t);
}
#endif

if (prompt)
{
fputs(prompt, termout);
fflush(termout);
}

if (fgets(destination, destlen, termin) == NULL)
destination[0] = '\0';

length = strlen(destination);
if (length > 0 && destination[length – 1] != '\n')
{
/* eat rest of the line */
char buf[128];
int buflen;

do
{
if (fgets(buf, sizeof(buf), termin) == NULL)
break;
buflen = strlen(buf);
} while (buflen > 0 && buf[buflen – 1] != '\n');
}

if (length > 0 && destination[length – 1] == '\n')
/* remove trailing newline */
destination[length – 1] = '\0';

#ifdef HAVE_TERMIOS_H
if (!echo)
{
tcsetattr(fileno(termin), TCSAFLUSH, &t_orig);
fputs("\n", termout);
fflush(termout);
}
#endif

if (termin != stdin)
{
fclose(termin);
fclose(termout);
}
}

int main(int argc, char *argv[])
{

char password[100];
char *password_prompt = "Please input the password:";

simple_prompt(password_prompt, password, sizeof(password), false);
printf("The password is [%s].\n",password);

return 0;
}
[/code]

如无特殊说明,文章均为本站原创,转载请注明出处
源自: 王明军的博客
本文链接地址: Linux 上可提示用户进行密码输入的功能实现
广告

Categories: 默认目录, PostgreSQL

发表评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.