xref: /plan9-contrib/sys/src/9k/boot/bootauth.c (revision 45a1df244aa549faca6f420494127e03a325d1ac)
19ef1f84bSDavid du Colombier #include <u.h>
29ef1f84bSDavid du Colombier #include <libc.h>
39ef1f84bSDavid du Colombier #include <auth.h>
49ef1f84bSDavid du Colombier #include <fcall.h>
59ef1f84bSDavid du Colombier #include "../boot/boot.h"
69ef1f84bSDavid du Colombier 
79ef1f84bSDavid du Colombier char	*authaddr;
89ef1f84bSDavid du Colombier static void glenda(void);
99ef1f84bSDavid du Colombier 
109ef1f84bSDavid du Colombier void
authentication(int cpuflag)119ef1f84bSDavid du Colombier authentication(int cpuflag)
129ef1f84bSDavid du Colombier {
13532111f7SDavid du Colombier 	char *s;
149ef1f84bSDavid du Colombier 	char *argv[16], **av;
159ef1f84bSDavid du Colombier 	int ac;
169ef1f84bSDavid du Colombier 
179ef1f84bSDavid du Colombier 	if(access("/boot/factotum", AEXEC) < 0){
189ef1f84bSDavid du Colombier 		glenda();
199ef1f84bSDavid du Colombier 		return;
209ef1f84bSDavid du Colombier 	}
219ef1f84bSDavid du Colombier 
229ef1f84bSDavid du Colombier 	/* start agent */
239ef1f84bSDavid du Colombier 	ac = 0;
249ef1f84bSDavid du Colombier 	av = argv;
259ef1f84bSDavid du Colombier 	av[ac++] = "factotum";
269ef1f84bSDavid du Colombier 	if(getenv("debugfactotum"))
279ef1f84bSDavid du Colombier 		av[ac++] = "-p";
28532111f7SDavid du Colombier 	s = getenv("factotumopts");
29532111f7SDavid du Colombier 	if(s != nil && *s != '\0')
30532111f7SDavid du Colombier 		av[ac++] = s;
319ef1f84bSDavid du Colombier //	av[ac++] = "-d";		/* debug traces */
329ef1f84bSDavid du Colombier //	av[ac++] = "-D";		/* 9p messages */
339ef1f84bSDavid du Colombier 	if(cpuflag)
349ef1f84bSDavid du Colombier 		av[ac++] = "-S";
359ef1f84bSDavid du Colombier 	else
369ef1f84bSDavid du Colombier 		av[ac++] = "-u";
379ef1f84bSDavid du Colombier 	av[ac++] = "-sfactotum";
389ef1f84bSDavid du Colombier 	if(authaddr != nil){
399ef1f84bSDavid du Colombier 		av[ac++] = "-a";
409ef1f84bSDavid du Colombier 		av[ac++] = authaddr;
419ef1f84bSDavid du Colombier 	}
424498a243SDavid du Colombier 	av[ac] = nil;
439ef1f84bSDavid du Colombier 	switch(fork()){
449ef1f84bSDavid du Colombier 	case -1:
459ef1f84bSDavid du Colombier 		fatal("starting factotum");
469ef1f84bSDavid du Colombier 	case 0:
479ef1f84bSDavid du Colombier 		exec("/boot/factotum", av);
489ef1f84bSDavid du Colombier 		fatal("execing /boot/factotum");
499ef1f84bSDavid du Colombier 	}
509ef1f84bSDavid du Colombier 
519ef1f84bSDavid du Colombier 	/* wait for agent to really be there */
52*45a1df24SDavid du Colombier 	while(access("/mnt/factotum", AEXIST) < 0)
539ef1f84bSDavid du Colombier 		sleep(250);
549ef1f84bSDavid du Colombier }
559ef1f84bSDavid du Colombier 
569ef1f84bSDavid du Colombier static void
glenda(void)579ef1f84bSDavid du Colombier glenda(void)
589ef1f84bSDavid du Colombier {
599ef1f84bSDavid du Colombier 	int fd;
609ef1f84bSDavid du Colombier 	char *s;
619ef1f84bSDavid du Colombier 
629ef1f84bSDavid du Colombier 	s = getenv("user");
639ef1f84bSDavid du Colombier 	if(s == nil)
649ef1f84bSDavid du Colombier 		s = "glenda";
659ef1f84bSDavid du Colombier 
669ef1f84bSDavid du Colombier 	fd = open("#c/hostowner", OWRITE);
679ef1f84bSDavid du Colombier 	if(fd >= 0){
689ef1f84bSDavid du Colombier 		if(write(fd, s, strlen(s)) != strlen(s))
699ef1f84bSDavid du Colombier 			fprint(2, "setting #c/hostowner to %s: %r\n", s);
709ef1f84bSDavid du Colombier 		close(fd);
719ef1f84bSDavid du Colombier 	}
729ef1f84bSDavid du Colombier }
73