xref: /plan9/sys/src/9/boot/bootauth.c (revision 8c055935e491d31efa1e341c817d741ea5120ab0)
19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include <auth.h>
49a747e4fSDavid du Colombier #include <fcall.h>
59a747e4fSDavid du Colombier #include "../boot/boot.h"
69a747e4fSDavid du Colombier 
79a747e4fSDavid du Colombier char	*authaddr;
89a747e4fSDavid du Colombier static void glenda(void);
99a747e4fSDavid du Colombier 
109a747e4fSDavid du Colombier void
authentication(int cpuflag)119a747e4fSDavid du Colombier authentication(int cpuflag)
129a747e4fSDavid du Colombier {
1391157df7SDavid du Colombier 	char *s;
149a747e4fSDavid du Colombier 	char *argv[16], **av;
159a747e4fSDavid du Colombier 	int ac;
169a747e4fSDavid du Colombier 
176a9fc400SDavid du Colombier 	if(access("/boot/factotum", AEXEC) < 0){
189a747e4fSDavid du Colombier 		glenda();
199a747e4fSDavid du Colombier 		return;
209a747e4fSDavid du Colombier 	}
219a747e4fSDavid du Colombier 
229a747e4fSDavid du Colombier 	/* start agent */
239a747e4fSDavid du Colombier 	ac = 0;
249a747e4fSDavid du Colombier 	av = argv;
259a747e4fSDavid du Colombier 	av[ac++] = "factotum";
264de34a7eSDavid du Colombier 	if(getenv("debugfactotum"))
274de34a7eSDavid du Colombier 		av[ac++] = "-p";
2891157df7SDavid du Colombier 	s = getenv("factotumopts");
2991157df7SDavid du Colombier 	if(s != nil && *s != '\0')
3091157df7SDavid du Colombier 		av[ac++] = s;
3141dd6b47SDavid du Colombier //	av[ac++] = "-d";		/* debug traces */
3241dd6b47SDavid du Colombier //	av[ac++] = "-D";		/* 9p messages */
339a747e4fSDavid du Colombier 	if(cpuflag)
349a747e4fSDavid du Colombier 		av[ac++] = "-S";
359a747e4fSDavid du Colombier 	else
369a747e4fSDavid du Colombier 		av[ac++] = "-u";
379a747e4fSDavid du Colombier 	av[ac++] = "-sfactotum";
389a747e4fSDavid du Colombier 	if(authaddr != nil){
399a747e4fSDavid du Colombier 		av[ac++] = "-a";
409a747e4fSDavid du Colombier 		av[ac++] = authaddr;
419a747e4fSDavid du Colombier 	}
429a747e4fSDavid du Colombier 	av[ac] = 0;
439a747e4fSDavid du Colombier 	switch(fork()){
449a747e4fSDavid du Colombier 	case -1:
45*8c055935SDavid du Colombier 		fatal("starting factotum");
469a747e4fSDavid du Colombier 	case 0:
476a9fc400SDavid du Colombier 		exec("/boot/factotum", av);
486a9fc400SDavid du Colombier 		fatal("execing /boot/factotum");
499a747e4fSDavid du Colombier 	}
509a747e4fSDavid du Colombier 
519a747e4fSDavid du Colombier 	/* wait for agent to really be there */
529a747e4fSDavid du Colombier 	while(access("/mnt/factotum", 0) < 0)
539a747e4fSDavid du Colombier 		sleep(250);
549a747e4fSDavid du Colombier }
559a747e4fSDavid du Colombier 
569a747e4fSDavid du Colombier static void
glenda(void)579a747e4fSDavid du Colombier glenda(void)
589a747e4fSDavid du Colombier {
599a747e4fSDavid du Colombier 	int fd;
609a747e4fSDavid du Colombier 	char *s;
619a747e4fSDavid du Colombier 
629a747e4fSDavid du Colombier 	s = getenv("user");
639a747e4fSDavid du Colombier 	if(s == nil)
649a747e4fSDavid du Colombier 		s = "glenda";
659a747e4fSDavid du Colombier 
669a747e4fSDavid du Colombier 	fd = open("#c/hostowner", OWRITE);
679a747e4fSDavid du Colombier 	if(fd >= 0){
689a747e4fSDavid du Colombier 		if(write(fd, s, strlen(s)) != strlen(s))
699a747e4fSDavid du Colombier 			fprint(2, "setting #c/hostowner to %s: %r\n", s);
709a747e4fSDavid du Colombier 		close(fd);
719a747e4fSDavid du Colombier 	}
729a747e4fSDavid du Colombier }
73