annotate src/master/askpass.c @ 9186:f70192e7ff3c HEAD

Added tag 1.2.0 for changeset 9ca9361d74ce
author Timo Sirainen <tss@iki.fi>
date Wed, 01 Jul 2009 21:52:54 +0200
parents b9faf4db2a9f
children 00cd9aacd03c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
1 /* Copyright (c) 2006-2009 Dovecot authors, see the included COPYING file */
3890
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "askpass.h"
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include <stdio.h>
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include <termios.h>
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include <fcntl.h>
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include <unistd.h>
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 void askpass(const char *prompt, char *buf, size_t buf_size)
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 {
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 struct termios old_tio, tio;
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 bool restore_tio = FALSE;
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 ssize_t ret;
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 size_t pos;
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 char ch;
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 int fd;
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 if (!isatty(STDIN_FILENO))
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 i_fatal("stdin isn't a TTY");
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 fputs(prompt, stderr);
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 fflush(stderr);
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 fd = open("/dev/tty", O_RDONLY);
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 if (fd < 0)
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 i_fatal("open(/dev/tty) failed: %m");
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 /* turn off echo */
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 if (tcgetattr(fd, &old_tio) == 0) {
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 restore_tio = TRUE;
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 tio = old_tio;
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 tio.c_lflag &= ~(ECHO | ECHONL);
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 (void)tcsetattr(fd, TCSAFLUSH, &tio);
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 }
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 /* read the password */
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 pos = 0;
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 while ((ret = read(fd, &ch, 1)) > 0) {
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 if (pos >= buf_size-1)
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 break;
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 if (ch == '\n' || ch == '\r')
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 break;
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 buf[pos++] = ch;
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 }
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 buf[pos] = '\0';
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 if (restore_tio)
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 (void)tcsetattr(fd, TCSAFLUSH, &old_tio);
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 fputs("\n", stderr); fflush(stderr);
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 (void)close(fd);
6658a000051d Forgot to add in last commit
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 }