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