19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
311c9ee8bSDavid du Colombier #include <mp.h>
411c9ee8bSDavid du Colombier #include <libsec.h>
511c9ee8bSDavid du Colombier #include "SConn.h"
611c9ee8bSDavid du Colombier #include "secstore.h"
79a747e4fSDavid du Colombier
89a747e4fSDavid du Colombier void *
emalloc(ulong n)99a747e4fSDavid du Colombier emalloc(ulong n)
109a747e4fSDavid du Colombier {
119a747e4fSDavid du Colombier void *p = malloc(n);
12*252470cdSDavid du Colombier
139a747e4fSDavid du Colombier if(p == nil)
149a747e4fSDavid du Colombier sysfatal("emalloc");
159a747e4fSDavid du Colombier memset(p, 0, n);
169a747e4fSDavid du Colombier return p;
179a747e4fSDavid du Colombier }
189a747e4fSDavid du Colombier
199a747e4fSDavid du Colombier void *
erealloc(void * p,ulong n)209a747e4fSDavid du Colombier erealloc(void *p, ulong n)
219a747e4fSDavid du Colombier {
229a747e4fSDavid du Colombier if ((p = realloc(p, n)) == nil)
239a747e4fSDavid du Colombier sysfatal("erealloc");
249a747e4fSDavid du Colombier return p;
259a747e4fSDavid du Colombier }
269a747e4fSDavid du Colombier
279a747e4fSDavid du Colombier char *
estrdup(char * s)289a747e4fSDavid du Colombier estrdup(char *s)
299a747e4fSDavid du Colombier {
309a747e4fSDavid du Colombier if ((s = strdup(s)) == nil)
319a747e4fSDavid du Colombier sysfatal("estrdup");
329a747e4fSDavid du Colombier return s;
339a747e4fSDavid du Colombier }
349a747e4fSDavid du Colombier
35b27b55e2SDavid du Colombier char*
getpassm(char * prompt)36c65b13b8SDavid du Colombier getpassm(char *prompt)
379a747e4fSDavid du Colombier {
38b27b55e2SDavid du Colombier char *p, line[4096];
399a747e4fSDavid du Colombier int n, nr;
40*252470cdSDavid du Colombier static int cons, consctl; /* closing & reopening fails in ssh environment */
419a747e4fSDavid du Colombier
42*252470cdSDavid du Colombier if(cons == 0){ /* first time? */
439a747e4fSDavid du Colombier cons = open("/dev/cons", ORDWR);
44d854de59SDavid du Colombier if(cons < 0)
45d854de59SDavid du Colombier sysfatal("couldn't open cons");
469a747e4fSDavid du Colombier consctl = open("/dev/consctl", OWRITE);
47d854de59SDavid du Colombier if(consctl < 0)
48d854de59SDavid du Colombier sysfatal("couldn't set raw mode via consctl");
499a747e4fSDavid du Colombier }
509a747e4fSDavid du Colombier fprint(consctl, "rawon");
519a747e4fSDavid du Colombier fprint(cons, "%s", prompt);
529a747e4fSDavid du Colombier nr = 0;
539a747e4fSDavid du Colombier p = line;
549a747e4fSDavid du Colombier for(;;){
559a747e4fSDavid du Colombier n = read(cons, p, 1);
569a747e4fSDavid du Colombier if(n < 0){
579a747e4fSDavid du Colombier fprint(consctl, "rawoff");
589a747e4fSDavid du Colombier fprint(cons, "\n");
59b27b55e2SDavid du Colombier return nil;
609a747e4fSDavid du Colombier }
615d459b5aSDavid du Colombier if(n == 0 || *p == '\n' || *p == '\r' || *p == 0x7f){
629a747e4fSDavid du Colombier *p = '\0';
639a747e4fSDavid du Colombier fprint(consctl, "rawoff");
649a747e4fSDavid du Colombier fprint(cons, "\n");
65b27b55e2SDavid du Colombier p = strdup(line);
66b27b55e2SDavid du Colombier memset(line, 0, nr);
67b27b55e2SDavid du Colombier return p;
689a747e4fSDavid du Colombier }
699a747e4fSDavid du Colombier if(*p == '\b'){
709a747e4fSDavid du Colombier if(nr > 0){
719a747e4fSDavid du Colombier nr--;
729a747e4fSDavid du Colombier p--;
739a747e4fSDavid du Colombier }
74*252470cdSDavid du Colombier }else if(*p == ('u' & 037)){ /* cntrl-u */
759a747e4fSDavid du Colombier fprint(cons, "\n%s", prompt);
769a747e4fSDavid du Colombier nr = 0;
779a747e4fSDavid du Colombier p = line;
789a747e4fSDavid du Colombier }else{
799a747e4fSDavid du Colombier nr++;
809a747e4fSDavid du Colombier p++;
819a747e4fSDavid du Colombier }
82b27b55e2SDavid du Colombier if(nr+1 == sizeof line){
839a747e4fSDavid du Colombier fprint(cons, "line too long; try again\n%s", prompt);
849a747e4fSDavid du Colombier nr = 0;
859a747e4fSDavid du Colombier p = line;
869a747e4fSDavid du Colombier }
879a747e4fSDavid du Colombier }
889a747e4fSDavid du Colombier }
8911c9ee8bSDavid du Colombier
90*252470cdSDavid du Colombier static char *
illegal(char * f)91*252470cdSDavid du Colombier illegal(char *f)
92*252470cdSDavid du Colombier {
93*252470cdSDavid du Colombier syslog(0, LOG, "illegal name: %s", f);
94*252470cdSDavid du Colombier return nil;
95*252470cdSDavid du Colombier }
96*252470cdSDavid du Colombier
9711c9ee8bSDavid du Colombier char *
validatefile(char * f)9811c9ee8bSDavid du Colombier validatefile(char *f)
9911c9ee8bSDavid du Colombier {
100*252470cdSDavid du Colombier char *p;
10111c9ee8bSDavid du Colombier
102*252470cdSDavid du Colombier if(f == nil || *f == '\0')
10311c9ee8bSDavid du Colombier return nil;
104*252470cdSDavid du Colombier if(strcmp(f, "..") == 0 || strlen(f) >= 250)
105*252470cdSDavid du Colombier return illegal(f);
106*252470cdSDavid du Colombier for(p = f; *p; p++)
107*252470cdSDavid du Colombier if(*p < 040 || *p == '/')
108*252470cdSDavid du Colombier return illegal(f);
10911c9ee8bSDavid du Colombier return f;
11011c9ee8bSDavid du Colombier }
111