xref: /plan9/sys/src/cmd/auth/secstore/util.c (revision 252470cd51076298c1cb81e1aabee4494f47f284)
1 #include <u.h>
2 #include <libc.h>
3 #include <mp.h>
4 #include <libsec.h>
5 #include "SConn.h"
6 #include "secstore.h"
7 
8 void *
emalloc(ulong n)9 emalloc(ulong n)
10 {
11 	void *p = malloc(n);
12 
13 	if(p == nil)
14 		sysfatal("emalloc");
15 	memset(p, 0, n);
16 	return p;
17 }
18 
19 void *
erealloc(void * p,ulong n)20 erealloc(void *p, ulong n)
21 {
22 	if ((p = realloc(p, n)) == nil)
23 		sysfatal("erealloc");
24 	return p;
25 }
26 
27 char *
estrdup(char * s)28 estrdup(char *s)
29 {
30 	if ((s = strdup(s)) == nil)
31 		sysfatal("estrdup");
32 	return s;
33 }
34 
35 char*
getpassm(char * prompt)36 getpassm(char *prompt)
37 {
38 	char *p, line[4096];
39 	int n, nr;
40 	static int cons, consctl; /* closing & reopening fails in ssh environment */
41 
42 	if(cons == 0){			/* first time? */
43 		cons = open("/dev/cons", ORDWR);
44 		if(cons < 0)
45 			sysfatal("couldn't open cons");
46 		consctl = open("/dev/consctl", OWRITE);
47 		if(consctl < 0)
48 			sysfatal("couldn't set raw mode via consctl");
49 	}
50 	fprint(consctl, "rawon");
51 	fprint(cons, "%s", prompt);
52 	nr = 0;
53 	p = line;
54 	for(;;){
55 		n = read(cons, p, 1);
56 		if(n < 0){
57 			fprint(consctl, "rawoff");
58 			fprint(cons, "\n");
59 			return nil;
60 		}
61 		if(n == 0 || *p == '\n' || *p == '\r' || *p == 0x7f){
62 			*p = '\0';
63 			fprint(consctl, "rawoff");
64 			fprint(cons, "\n");
65 			p = strdup(line);
66 			memset(line, 0, nr);
67 			return p;
68 		}
69 		if(*p == '\b'){
70 			if(nr > 0){
71 				nr--;
72 				p--;
73 			}
74 		}else if(*p == ('u' & 037)){		/* cntrl-u */
75 			fprint(cons, "\n%s", prompt);
76 			nr = 0;
77 			p = line;
78 		}else{
79 			nr++;
80 			p++;
81 		}
82 		if(nr+1 == sizeof line){
83 			fprint(cons, "line too long; try again\n%s", prompt);
84 			nr = 0;
85 			p = line;
86 		}
87 	}
88 }
89 
90 static char *
illegal(char * f)91 illegal(char *f)
92 {
93 	syslog(0, LOG, "illegal name: %s", f);
94 	return nil;
95 }
96 
97 char *
validatefile(char * f)98 validatefile(char *f)
99 {
100 	char *p;
101 
102 	if(f == nil || *f == '\0')
103 		return nil;
104 	if(strcmp(f, "..") == 0 || strlen(f) >= 250)
105 		return illegal(f);
106 	for(p = f; *p; p++)
107 		if(*p < 040 || *p == '/')
108 			return illegal(f);
109 	return f;
110 }
111