xref: /plan9-contrib/sys/src/9k/boot/bootcache.c (revision 9ef1f84b659abcb917c5c090acbce0772e494f21)
1*9ef1f84bSDavid du Colombier #include <u.h>
2*9ef1f84bSDavid du Colombier #include <libc.h>
3*9ef1f84bSDavid du Colombier #include <../boot/boot.h>
4*9ef1f84bSDavid du Colombier 
5*9ef1f84bSDavid du Colombier uchar statbuf[Statsz];
6*9ef1f84bSDavid du Colombier 
7*9ef1f84bSDavid du Colombier int
cache(int fd)8*9ef1f84bSDavid du Colombier cache(int fd)
9*9ef1f84bSDavid du Colombier {
10*9ef1f84bSDavid du Colombier 	int argc, i, p[2];
11*9ef1f84bSDavid du Colombier 	char *argv[5], bd[32], buf[256], partition[64], *pp;
12*9ef1f84bSDavid du Colombier 
13*9ef1f84bSDavid du Colombier 	if(stat("/boot/cfs", statbuf, sizeof statbuf) < 0)
14*9ef1f84bSDavid du Colombier 		return fd;
15*9ef1f84bSDavid du Colombier 
16*9ef1f84bSDavid du Colombier 	*partition = 0;
17*9ef1f84bSDavid du Colombier 
18*9ef1f84bSDavid du Colombier 	bind("#S", "/dev", MAFTER);
19*9ef1f84bSDavid du Colombier 	readfile("#e/cfs", buf, sizeof(buf));
20*9ef1f84bSDavid du Colombier 	if(*buf){
21*9ef1f84bSDavid du Colombier 		argc = tokenize(buf, argv, 4);
22*9ef1f84bSDavid du Colombier 		for(i = 0; i < argc; i++){
23*9ef1f84bSDavid du Colombier 			if(strcmp(argv[i], "off") == 0)
24*9ef1f84bSDavid du Colombier 				return fd;
25*9ef1f84bSDavid du Colombier 			else if(stat(argv[i], statbuf, sizeof statbuf) >= 0){
26*9ef1f84bSDavid du Colombier 				strncpy(partition, argv[i], sizeof(partition)-1);
27*9ef1f84bSDavid du Colombier 				partition[sizeof(partition)-1] = 0;
28*9ef1f84bSDavid du Colombier 			}
29*9ef1f84bSDavid du Colombier 		}
30*9ef1f84bSDavid du Colombier 	}
31*9ef1f84bSDavid du Colombier 
32*9ef1f84bSDavid du Colombier 	if(*partition == 0){
33*9ef1f84bSDavid du Colombier 		readfile("#e/bootdisk", bd, sizeof(bd));
34*9ef1f84bSDavid du Colombier 		if(*bd){
35*9ef1f84bSDavid du Colombier 			if(pp = strchr(bd, ':'))
36*9ef1f84bSDavid du Colombier 				*pp = 0;
37*9ef1f84bSDavid du Colombier 			/* damned artificial intelligence */
38*9ef1f84bSDavid du Colombier 			i = strlen(bd);
39*9ef1f84bSDavid du Colombier 			if(strcmp("disk", &bd[i-4]) == 0)
40*9ef1f84bSDavid du Colombier 				bd[i-4] = 0;
41*9ef1f84bSDavid du Colombier 			else if(strcmp("fs", &bd[i-2]) == 0)
42*9ef1f84bSDavid du Colombier 				bd[i-2] = 0;
43*9ef1f84bSDavid du Colombier 			else if(strcmp("fossil", &bd[i-6]) == 0)
44*9ef1f84bSDavid du Colombier 				bd[i-6] = 0;
45*9ef1f84bSDavid du Colombier 			sprint(partition, "%scache", bd);
46*9ef1f84bSDavid du Colombier 			if(stat(partition, statbuf, sizeof statbuf) < 0)
47*9ef1f84bSDavid du Colombier 				*bd = 0;
48*9ef1f84bSDavid du Colombier 		}
49*9ef1f84bSDavid du Colombier 		if(*bd == 0){
50*9ef1f84bSDavid du Colombier 			sprint(partition, "%scache", bootdisk);
51*9ef1f84bSDavid du Colombier 			if(stat(partition, statbuf, sizeof statbuf) < 0)
52*9ef1f84bSDavid du Colombier 				return fd;
53*9ef1f84bSDavid du Colombier 		}
54*9ef1f84bSDavid du Colombier 	}
55*9ef1f84bSDavid du Colombier 
56*9ef1f84bSDavid du Colombier 	print("cfs...");
57*9ef1f84bSDavid du Colombier 	if(pipe(p)<0)
58*9ef1f84bSDavid du Colombier 		fatal("pipe");
59*9ef1f84bSDavid du Colombier 	switch(fork()){
60*9ef1f84bSDavid du Colombier 	case -1:
61*9ef1f84bSDavid du Colombier 		fatal("fork");
62*9ef1f84bSDavid du Colombier 	case 0:
63*9ef1f84bSDavid du Colombier 		close(p[1]);
64*9ef1f84bSDavid du Colombier 		dup(fd, 0);
65*9ef1f84bSDavid du Colombier 		close(fd);
66*9ef1f84bSDavid du Colombier 		dup(p[0], 1);
67*9ef1f84bSDavid du Colombier 		close(p[0]);
68*9ef1f84bSDavid du Colombier 		if(fflag)
69*9ef1f84bSDavid du Colombier 			execl("/boot/cfs", "bootcfs", "-rs", "-f", partition, 0);
70*9ef1f84bSDavid du Colombier 		else
71*9ef1f84bSDavid du Colombier 			execl("/boot/cfs", "bootcfs", "-s", "-f", partition, 0);
72*9ef1f84bSDavid du Colombier 		break;
73*9ef1f84bSDavid du Colombier 	default:
74*9ef1f84bSDavid du Colombier 		close(p[0]);
75*9ef1f84bSDavid du Colombier 		close(fd);
76*9ef1f84bSDavid du Colombier 		fd = p[1];
77*9ef1f84bSDavid du Colombier 		break;
78*9ef1f84bSDavid du Colombier 	}
79*9ef1f84bSDavid du Colombier 	return fd;
80*9ef1f84bSDavid du Colombier }
81