xref: /plan9/sys/src/libauth/auth_getkey.c (revision d9306527b4a7229dcf0cf3c58aed36bb9da82854)
19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include <auth.h>
49a747e4fSDavid du Colombier 
59a747e4fSDavid du Colombier int
auth_getkey(char * params)69a747e4fSDavid du Colombier auth_getkey(char *params)
79a747e4fSDavid du Colombier {
8*d9306527SDavid du Colombier 	char *name;
99a747e4fSDavid du Colombier 	Dir *d;
109a747e4fSDavid du Colombier 	int pid;
119a747e4fSDavid du Colombier 	Waitmsg *w;
129a747e4fSDavid du Colombier 
139a747e4fSDavid du Colombier 	/* start /factotum to query for a key */
14*d9306527SDavid du Colombier 	name = "/factotum";
15*d9306527SDavid du Colombier 	d = dirstat(name);
169a747e4fSDavid du Colombier 	if(d == nil){
17*d9306527SDavid du Colombier 		name = "/boot/factotum";
18*d9306527SDavid du Colombier 		d = dirstat(name);
19*d9306527SDavid du Colombier 	}
20*d9306527SDavid du Colombier 	if(d == nil){
21*d9306527SDavid du Colombier 		werrstr("auth_getkey: no /factotum or /boot/factotum: didn't get key %s", params);
229a747e4fSDavid du Colombier 		return -1;
239a747e4fSDavid du Colombier 	}
249a747e4fSDavid du Colombier if(0)	if(d->type != '/'){
259a747e4fSDavid du Colombier 		werrstr("auth_getkey: /factotum may be bad: didn't get key %s", params);
269a747e4fSDavid du Colombier 		return -1;
279a747e4fSDavid du Colombier 	}
289a747e4fSDavid du Colombier 	switch(pid = fork()){
299a747e4fSDavid du Colombier 	case -1:
30*d9306527SDavid du Colombier 		werrstr("can't fork for %s: %r", name);
319a747e4fSDavid du Colombier 		return -1;
329a747e4fSDavid du Colombier 	case 0:
33*d9306527SDavid du Colombier 		execl(name, "getkey", "-g", params, nil);
349a747e4fSDavid du Colombier 		exits(0);
359a747e4fSDavid du Colombier 	default:
369a747e4fSDavid du Colombier 		for(;;){
379a747e4fSDavid du Colombier 			w = wait();
389a747e4fSDavid du Colombier 			if(w == nil)
399a747e4fSDavid du Colombier 				break;
409a747e4fSDavid du Colombier 			if(w->pid == pid){
419a747e4fSDavid du Colombier 				if(w->msg[0] != '\0'){
429a747e4fSDavid du Colombier 					free(w);
439a747e4fSDavid du Colombier 					return -1;
449a747e4fSDavid du Colombier 				}
459a747e4fSDavid du Colombier 				free(w);
469a747e4fSDavid du Colombier 				return 0;
479a747e4fSDavid du Colombier 			}
489a747e4fSDavid du Colombier 		}
499a747e4fSDavid du Colombier 	}
509a747e4fSDavid du Colombier 	return 0;
519a747e4fSDavid du Colombier }
52