xref: /plan9/sys/src/9/boot/bootcache.c (revision c0a4f1a4887df56ae7edf153ebb41e58eef29ccc)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <../boot/boot.h>
47dd7cddfSDavid du Colombier 
59a747e4fSDavid du Colombier uchar statbuf[Statsz];
69a747e4fSDavid du Colombier 
77dd7cddfSDavid du Colombier int
cache(int fd)87dd7cddfSDavid du Colombier cache(int fd)
97dd7cddfSDavid du Colombier {
107dd7cddfSDavid du Colombier 	int argc, i, p[2];
119a747e4fSDavid du Colombier 	char *argv[5], bd[32], buf[256], partition[64], *pp;
127dd7cddfSDavid du Colombier 
136a9fc400SDavid du Colombier 	if(stat("/boot/cfs", statbuf, sizeof statbuf) < 0)
147dd7cddfSDavid du Colombier 		return fd;
157dd7cddfSDavid du Colombier 
167dd7cddfSDavid du Colombier 	*partition = 0;
177dd7cddfSDavid du Colombier 
18*c0a4f1a4SDavid du Colombier 	bind("#S", "/dev", MAFTER);
197dd7cddfSDavid du Colombier 	readfile("#e/cfs", buf, sizeof(buf));
207dd7cddfSDavid du Colombier 	if(*buf){
219a747e4fSDavid du Colombier 		argc = tokenize(buf, argv, 4);
227dd7cddfSDavid du Colombier 		for(i = 0; i < argc; i++){
237dd7cddfSDavid du Colombier 			if(strcmp(argv[i], "off") == 0)
247dd7cddfSDavid du Colombier 				return fd;
259a747e4fSDavid du Colombier 			else if(stat(argv[i], statbuf, sizeof statbuf) >= 0){
267dd7cddfSDavid du Colombier 				strncpy(partition, argv[i], sizeof(partition)-1);
277dd7cddfSDavid du Colombier 				partition[sizeof(partition)-1] = 0;
287dd7cddfSDavid du Colombier 			}
297dd7cddfSDavid du Colombier 		}
307dd7cddfSDavid du Colombier 	}
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier 	if(*partition == 0){
337dd7cddfSDavid du Colombier 		readfile("#e/bootdisk", bd, sizeof(bd));
347dd7cddfSDavid du Colombier 		if(*bd){
357dd7cddfSDavid du Colombier 			if(pp = strchr(bd, ':'))
367dd7cddfSDavid du Colombier 				*pp = 0;
377dd7cddfSDavid du Colombier 			/* damned artificial intelligence */
387dd7cddfSDavid du Colombier 			i = strlen(bd);
397dd7cddfSDavid du Colombier 			if(strcmp("disk", &bd[i-4]) == 0)
407dd7cddfSDavid du Colombier 				bd[i-4] = 0;
417dd7cddfSDavid du Colombier 			else if(strcmp("fs", &bd[i-2]) == 0)
427dd7cddfSDavid du Colombier 				bd[i-2] = 0;
4367031067SDavid du Colombier 			else if(strcmp("fossil", &bd[i-6]) == 0)
4467031067SDavid du Colombier 				bd[i-6] = 0;
457dd7cddfSDavid du Colombier 			sprint(partition, "%scache", bd);
469a747e4fSDavid du Colombier 			if(stat(partition, statbuf, sizeof statbuf) < 0)
477dd7cddfSDavid du Colombier 				*bd = 0;
487dd7cddfSDavid du Colombier 		}
497dd7cddfSDavid du Colombier 		if(*bd == 0){
507dd7cddfSDavid du Colombier 			sprint(partition, "%scache", bootdisk);
519a747e4fSDavid du Colombier 			if(stat(partition, statbuf, sizeof statbuf) < 0)
527dd7cddfSDavid du Colombier 				return fd;
537dd7cddfSDavid du Colombier 		}
547dd7cddfSDavid du Colombier 	}
557dd7cddfSDavid du Colombier 
567dd7cddfSDavid du Colombier 	print("cfs...");
577dd7cddfSDavid du Colombier 	if(pipe(p)<0)
587dd7cddfSDavid du Colombier 		fatal("pipe");
597dd7cddfSDavid du Colombier 	switch(fork()){
607dd7cddfSDavid du Colombier 	case -1:
617dd7cddfSDavid du Colombier 		fatal("fork");
627dd7cddfSDavid du Colombier 	case 0:
637dd7cddfSDavid du Colombier 		close(p[1]);
647dd7cddfSDavid du Colombier 		dup(fd, 0);
657dd7cddfSDavid du Colombier 		close(fd);
667dd7cddfSDavid du Colombier 		dup(p[0], 1);
677dd7cddfSDavid du Colombier 		close(p[0]);
687dd7cddfSDavid du Colombier 		if(fflag)
696a9fc400SDavid du Colombier 			execl("/boot/cfs", "bootcfs", "-rs", "-f", partition, 0);
707dd7cddfSDavid du Colombier 		else
716a9fc400SDavid du Colombier 			execl("/boot/cfs", "bootcfs", "-s", "-f", partition, 0);
727dd7cddfSDavid du Colombier 		break;
737dd7cddfSDavid du Colombier 	default:
747dd7cddfSDavid du Colombier 		close(p[0]);
757dd7cddfSDavid du Colombier 		close(fd);
767dd7cddfSDavid du Colombier 		fd = p[1];
777dd7cddfSDavid du Colombier 		break;
787dd7cddfSDavid du Colombier 	}
797dd7cddfSDavid du Colombier 	return fd;
807dd7cddfSDavid du Colombier }
81