Blame


1 b589fce2 2005-02-11 devnull #include <u.h>
2 b589fce2 2005-02-11 devnull #define NOPLAN9DEFINES
3 b589fce2 2005-02-11 devnull #include <libc.h>
4 b589fce2 2005-02-11 devnull #include <termios.h>
5 5802b09e 2020-05-08 rsc #ifdef HAS_SYS_TERMIOS
6 b589fce2 2005-02-11 devnull #include <sys/termios.h>
7 5802b09e 2020-05-08 rsc #endif
8 b589fce2 2005-02-11 devnull
9 b589fce2 2005-02-11 devnull static int
10 b589fce2 2005-02-11 devnull rawx(int fd, int echoing)
11 b589fce2 2005-02-11 devnull {
12 b589fce2 2005-02-11 devnull int was;
13 b589fce2 2005-02-11 devnull static struct termios ttmode;
14 b589fce2 2005-02-11 devnull
15 b589fce2 2005-02-11 devnull if(echoing == -1)
16 b589fce2 2005-02-11 devnull return -1;
17 b589fce2 2005-02-11 devnull
18 b589fce2 2005-02-11 devnull if(tcgetattr(fd, &ttmode) < 0)
19 b589fce2 2005-02-11 devnull return -1;
20 b589fce2 2005-02-11 devnull was = (ttmode.c_lflag&(ECHO|ICANON));
21 b589fce2 2005-02-11 devnull ttmode.c_lflag &= ~(ECHO|ICANON);
22 b589fce2 2005-02-11 devnull ttmode.c_lflag |= echoing;
23 b589fce2 2005-02-11 devnull if(tcsetattr(fd, TCSANOW, &ttmode) < 0)
24 b589fce2 2005-02-11 devnull return -1;
25 b589fce2 2005-02-11 devnull return was;
26 b589fce2 2005-02-11 devnull }
27 b589fce2 2005-02-11 devnull
28 b589fce2 2005-02-11 devnull char*
29 b589fce2 2005-02-11 devnull readcons(char *prompt, char *def, int secret)
30 b589fce2 2005-02-11 devnull {
31 b589fce2 2005-02-11 devnull int fd, n, raw;
32 b589fce2 2005-02-11 devnull char line[10];
33 b589fce2 2005-02-11 devnull char *s, *t;
34 b589fce2 2005-02-11 devnull int l;
35 b589fce2 2005-02-11 devnull
36 b589fce2 2005-02-11 devnull if((fd = open("/dev/tty", ORDWR)) < 0)
37 b589fce2 2005-02-11 devnull return nil;
38 b589fce2 2005-02-11 devnull
39 b589fce2 2005-02-11 devnull raw = -1;
40 b589fce2 2005-02-11 devnull if(secret){
41 b589fce2 2005-02-11 devnull raw = rawx(fd, 0);
42 b589fce2 2005-02-11 devnull if(raw == -1)
43 b589fce2 2005-02-11 devnull return nil;
44 b589fce2 2005-02-11 devnull }
45 b589fce2 2005-02-11 devnull
46 b589fce2 2005-02-11 devnull if(def)
47 b589fce2 2005-02-11 devnull fprint(fd, "%s[%s]: ", prompt, def);
48 b589fce2 2005-02-11 devnull else
49 b589fce2 2005-02-11 devnull fprint(fd, "%s: ", prompt);
50 b589fce2 2005-02-11 devnull
51 b589fce2 2005-02-11 devnull s = strdup("");
52 b589fce2 2005-02-11 devnull if(s == nil)
53 b589fce2 2005-02-11 devnull return nil;
54 b589fce2 2005-02-11 devnull
55 b589fce2 2005-02-11 devnull for(;;){
56 b589fce2 2005-02-11 devnull n = read(fd, line, 1);
57 b589fce2 2005-02-11 devnull if(n < 0){
58 b589fce2 2005-02-11 devnull Error:
59 b589fce2 2005-02-11 devnull if(secret){
60 b589fce2 2005-02-11 devnull rawx(fd, raw);
61 b589fce2 2005-02-11 devnull write(fd, "\n", 1);
62 b589fce2 2005-02-11 devnull }
63 b589fce2 2005-02-11 devnull close(fd);
64 b589fce2 2005-02-11 devnull free(s);
65 b589fce2 2005-02-11 devnull return nil;
66 b589fce2 2005-02-11 devnull }
67 b589fce2 2005-02-11 devnull if(n > 0 && line[0] == 0x7F)
68 b589fce2 2005-02-11 devnull goto Error;
69 b589fce2 2005-02-11 devnull if(n == 0 || line[0] == 0x04 || line[0] == '\n' || line[0] == '\r'){
70 b589fce2 2005-02-11 devnull if(secret){
71 b589fce2 2005-02-11 devnull rawx(fd, raw);
72 b589fce2 2005-02-11 devnull write(fd, "\n", 1);
73 b589fce2 2005-02-11 devnull }
74 b589fce2 2005-02-11 devnull close(fd);
75 b589fce2 2005-02-11 devnull if(*s == 0 && def){
76 b589fce2 2005-02-11 devnull free(s);
77 b589fce2 2005-02-11 devnull s = strdup(def);
78 b589fce2 2005-02-11 devnull }
79 b589fce2 2005-02-11 devnull return s;
80 b589fce2 2005-02-11 devnull }
81 b589fce2 2005-02-11 devnull if(line[0] == '\b'){
82 b589fce2 2005-02-11 devnull if(strlen(s) > 0)
83 b589fce2 2005-02-11 devnull s[strlen(s)-1] = 0;
84 b589fce2 2005-02-11 devnull }else if(line[0] == 0x15){ /* ^U: line kill */
85 b589fce2 2005-02-11 devnull if(def != nil)
86 b589fce2 2005-02-11 devnull fprint(fd, "\n%s[%s]: ", prompt, def);
87 b589fce2 2005-02-11 devnull else
88 b589fce2 2005-02-11 devnull fprint(fd, "\n%s: ", prompt);
89 b589fce2 2005-02-11 devnull s[0] = 0;
90 b589fce2 2005-02-11 devnull }else{
91 b589fce2 2005-02-11 devnull l = strlen(s);
92 b589fce2 2005-02-11 devnull t = malloc(l+2);
93 b589fce2 2005-02-11 devnull if(t)
94 b589fce2 2005-02-11 devnull memmove(t, s, l);
95 b589fce2 2005-02-11 devnull memset(s, 'X', l);
96 b589fce2 2005-02-11 devnull free(s);
97 b589fce2 2005-02-11 devnull if(t == nil)
98 b589fce2 2005-02-11 devnull return nil;
99 b589fce2 2005-02-11 devnull t[l] = line[0];
100 b589fce2 2005-02-11 devnull t[l+1] = 0;
101 b589fce2 2005-02-11 devnull s = t;
102 b589fce2 2005-02-11 devnull }
103 b589fce2 2005-02-11 devnull }
104 b589fce2 2005-02-11 devnull }