110 lines
1.6 KiB
C
110 lines
1.6 KiB
C
#include <u.h>
|
|
#include <libc.h>
|
|
#include <../boot/boot.h>
|
|
|
|
void
|
|
fatal(char *s)
|
|
{
|
|
char buf[ERRMAX];
|
|
|
|
buf[0] = '\0';
|
|
errstr(buf, sizeof buf);
|
|
fprint(2, "boot: %s: %s\n", s, buf);
|
|
exits(0);
|
|
}
|
|
|
|
int
|
|
readfile(char *name, char *buf, int len)
|
|
{
|
|
int f, n;
|
|
|
|
buf[0] = 0;
|
|
f = open(name, OREAD);
|
|
if(f < 0)
|
|
return -1;
|
|
n = read(f, buf, len-1);
|
|
if(n >= 0)
|
|
buf[n] = 0;
|
|
close(f);
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
run(char *file, ...)
|
|
{
|
|
char buf[64];
|
|
Waitmsg *w;
|
|
int pid;
|
|
|
|
switch(pid = fork()){
|
|
case -1:
|
|
fatal("fork");
|
|
case 0:
|
|
exec(file, &file);
|
|
snprint(buf, sizeof buf, "can't exec %s", file);
|
|
fatal(buf);
|
|
default:
|
|
while((w = wait()) != nil)
|
|
if(w->pid == pid)
|
|
break;
|
|
if(w == nil){
|
|
snprint(buf, sizeof buf, "wait returned nil running %s", file);
|
|
free(w);
|
|
fatal(buf);
|
|
}
|
|
free(w);
|
|
}
|
|
}
|
|
|
|
int
|
|
writefile(char *name, char *buf, int len)
|
|
{
|
|
int f, n;
|
|
|
|
f = open(name, OWRITE);
|
|
if(f < 0)
|
|
return -1;
|
|
n = write(f, buf, len);
|
|
close(f);
|
|
return (n != len) ? -1 : 0;
|
|
}
|
|
|
|
void
|
|
setenv(char *name, char *val, int ec)
|
|
{
|
|
int f;
|
|
char ename[64];
|
|
|
|
snprint(ename, sizeof ename, "#e%s/%s", ec ? "c" : "", name);
|
|
f = create(ename, 1, 0666);
|
|
if(f < 0){
|
|
fprint(2, "create %s: %r\n", ename);
|
|
return;
|
|
}
|
|
write(f, val, strlen(val));
|
|
close(f);
|
|
}
|
|
|
|
void
|
|
srvcreate(char *name, int fd)
|
|
{
|
|
char *srvname;
|
|
int f;
|
|
char buf[64];
|
|
|
|
srvname = strrchr(name, '/');
|
|
if(srvname)
|
|
srvname++;
|
|
else
|
|
srvname = name;
|
|
|
|
snprint(buf, sizeof buf, "#s/%s", srvname);
|
|
f = create(buf, 1, 0666);
|
|
if(f < 0)
|
|
fatal(buf);
|
|
sprint(buf, "%d", fd);
|
|
if(write(f, buf, strlen(buf)) != strlen(buf))
|
|
fatal("write");
|
|
close(f);
|
|
}
|
|
|