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>
7 b589fce2 2005-02-11 devnull static int
8 b589fce2 2005-02-11 devnull rawx(int fd, int echoing)
11 b589fce2 2005-02-11 devnull static struct termios ttmode;
13 b589fce2 2005-02-11 devnull if(echoing == -1)
14 b589fce2 2005-02-11 devnull return -1;
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;
27 b589fce2 2005-02-11 devnull readcons(char *prompt, char *def, int secret)
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;
34 b589fce2 2005-02-11 devnull if((fd = open("/dev/tty", ORDWR)) < 0)
35 b589fce2 2005-02-11 devnull return nil;
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;
45 b589fce2 2005-02-11 devnull fprint(fd, "%s[%s]: ", prompt, def);
47 b589fce2 2005-02-11 devnull fprint(fd, "%s: ", prompt);
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;
54 b589fce2 2005-02-11 devnull n = read(fd, line, 1);
55 b589fce2 2005-02-11 devnull if(n < 0){
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);
61 b589fce2 2005-02-11 devnull close(fd);
63 b589fce2 2005-02-11 devnull return nil;
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);
72 b589fce2 2005-02-11 devnull close(fd);
73 b589fce2 2005-02-11 devnull if(*s == 0 && def){
75 b589fce2 2005-02-11 devnull s = strdup(def);
77 b589fce2 2005-02-11 devnull return s;
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);
86 b589fce2 2005-02-11 devnull fprint(fd, "\n%s: ", prompt);
87 b589fce2 2005-02-11 devnull s[0] = 0;
89 b589fce2 2005-02-11 devnull l = strlen(s);
90 b589fce2 2005-02-11 devnull t = malloc(l+2);
92 b589fce2 2005-02-11 devnull memmove(t, s, l);
93 b589fce2 2005-02-11 devnull memset(s, 'X', l);
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;