source:
EcnlProtoTool/trunk/musl-1.1.18/src/legacy/getpass.c
Last change on this file was 444, checked in by , 4 years ago | |
---|---|
|
|
File size: 744 bytes |
Line | |
---|---|
1 | #define _GNU_SOURCE |
2 | #include <stdio.h> |
3 | #include <termios.h> |
4 | #include <unistd.h> |
5 | #include <fcntl.h> |
6 | #include <string.h> |
7 | |
8 | char *getpass(const char *prompt) |
9 | { |
10 | int fd; |
11 | struct termios s, t; |
12 | ssize_t l; |
13 | static char password[128]; |
14 | |
15 | if ((fd = open("/dev/tty", O_RDWR|O_NOCTTY|O_CLOEXEC)) < 0) return 0; |
16 | |
17 | tcgetattr(fd, &t); |
18 | s = t; |
19 | t.c_lflag &= ~(ECHO|ISIG); |
20 | t.c_lflag |= ICANON; |
21 | t.c_iflag &= ~(INLCR|IGNCR); |
22 | t.c_iflag |= ICRNL; |
23 | tcsetattr(fd, TCSAFLUSH, &t); |
24 | tcdrain(fd); |
25 | |
26 | dprintf(fd, "%s", prompt); |
27 | |
28 | l = read(fd, password, sizeof password); |
29 | if (l >= 0) { |
30 | if (l > 0 && password[l-1] == '\n' || l==sizeof password) l--; |
31 | password[l] = 0; |
32 | } |
33 | |
34 | tcsetattr(fd, TCSAFLUSH, &s); |
35 | |
36 | dprintf(fd, "\n"); |
37 | close(fd); |
38 | |
39 | return l<0 ? 0 : password; |
40 | } |
Note:
See TracBrowser
for help on using the repository browser.