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 Colombierauthentication(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 Colombierglenda(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