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