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