jehanne/sys/src/kern/boot/bootcache.c

90 lines
2.1 KiB
C

/* Copyright (C) Charles Forsyth
* See /doc/license/NOTICE.Plan9-9k.txt for details about the licensing.
*/
/* Portions of this file are Copyright (C) 2015-2018 Giacomo Tesio <giacomo@tesio.it>
* See /doc/license/gpl-2.0.txt for details about the licensing.
*/
#include <u.h>
#include <libc.h>
#include "../boot/boot.h"
uint8_t statbuf[Statsz];
int
cache(int fd)
{
int argc, i, p[2];
char *argv[5], bd[32], buf[256], partition[64], *pp;
if(jehanne_stat("/boot/cfs", statbuf, sizeof statbuf) < 0)
return fd;
*partition = 0;
bind("#S", "/dev", MAFTER);
readfile("#e/cfs", buf, sizeof(buf));
if(*buf){
argc = jehanne_tokenize(buf, argv, 4);
for(i = 0; i < argc; i++){
if(jehanne_strcmp(argv[i], "off") == 0)
return fd;
else if(jehanne_stat(argv[i], statbuf, sizeof statbuf) >= 0){
jehanne_strncpy(partition, argv[i], sizeof(partition)-1);
partition[sizeof(partition)-1] = 0;
}
}
}
if(*partition == 0){
readfile("#e/bootdisk", bd, sizeof(bd));
if(*bd){
if(pp = jehanne_strchr(bd, ':'))
*pp = 0;
/* damned artificial intelligence */
i = jehanne_strlen(bd);
if(jehanne_strcmp("disk", &bd[i-4]) == 0)
bd[i-4] = 0;
else if(jehanne_strcmp("fs", &bd[i-2]) == 0)
bd[i-2] = 0;
else if(jehanne_strcmp("fossil", &bd[i-6]) == 0)
bd[i-6] = 0;
jehanne_sprint(partition, "%scache", bd);
if(jehanne_stat(partition, statbuf, sizeof statbuf) < 0)
*bd = 0;
}
if(*bd == 0){
jehanne_sprint(partition, "%scache", bootdisk);
if(jehanne_stat(partition, statbuf, sizeof statbuf) < 0)
return fd;
}
}
jehanne_print("cfs...");
if(jehanne_pipe(p)<0)
fatal("pipe");
switch(jehanne_fork()){
case -1:
fatal("fork");
case 0:
close(p[1]);
if(jehanne_dup(fd, 0) != 0)
fatal("jehanne_dup(fd, 0)");
close(fd);
if(jehanne_dup(p[0], 1) != 1)
fatal("jehanne_dup(p[0], 1)");
close(p[0]);
if(fflag)
jehanne_execl("/boot/cfs", "bootcfs", "-rs", "-f", partition, 0);
else
jehanne_execl("/boot/cfs", "bootcfs", "-s", "-f", partition, 0);
break;
default:
close(p[0]);
close(fd);
fd = p[1];
break;
}
return fd;
}