Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <auth.h>
5 int
6 auth_getkey(char *params)
7 {
8 char *name;
9 Dir *d;
10 int pid;
11 Waitmsg *w;
13 /* start /factotum to query for a key */
14 name = "/factotum";
15 d = dirstat(name);
16 if(d == nil){
17 name = "/boot/factotum";
18 d = dirstat(name);
19 }
20 if(d == nil){
21 werrstr("auth_getkey: no /factotum or /boot/factotum: didn't get key %s", params);
22 return -1;
23 }
24 if(0) if(d->type != '/'){
25 werrstr("auth_getkey: /factotum may be bad: didn't get key %s", params);
26 return -1;
27 }
28 switch(pid = fork()){
29 case -1:
30 werrstr("can't fork for %s: %r", name);
31 return -1;
32 case 0:
33 execl(name, "getkey", "-g", params, nil);
34 exits(0);
35 default:
36 for(;;){
37 w = wait();
38 if(w == nil)
39 break;
40 if(w->pid == pid){
41 if(w->msg[0] != '\0'){
42 free(w);
43 return -1;
44 }
45 free(w);
46 return 0;
47 }
48 }
49 }
50 return 0;
51 }