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