| plan 9 kernel history: overview | file list | diff list |
1990/0322/gnot/boot.c (diff list | history)
| 1990/0322/sys/src/9/gnot/boot.c:1,130 – 1990/05312/sys/src/9/gnot/boot.c:1,145 (short | long | prev | next) | ||
| 1990/03091 | #include <u.h> #include <libc.h> #include "fcall.h" Fcall hdr; char buf[100]; | |
| 1990/0312 | void error(char*); void sendmsg(int, char*); | |
| 1990/03091 | main(int argc, char *argv[]) { int cfd, fd, n, fu, f; char buf[NAMELEN]; | |
| 1990/0310 | int p[2]; | |
| 1990/03091 | open("#c/cons", OREAD); open("#c/cons", OWRITE); open("#c/cons", OWRITE); | |
| 1990/0312 | /* * grab the incon, * push the dk multiplexor onto it, * and use line 1 as the signalling channel. */ cfd = open("#i/ctl", 2); if(cfd < 0) error("opening #i/ctl"); sendmsg(cfd, "push dkmux"); sendmsg(cfd, "config 1 16"); /* | |
| 1990/05312 | * fork a process to hold the incon channel open */ switch(fork()){ case -1: break; case 0: for(;;) sleep(60*1000); exit(0); default: close(cfd); break; } /* | |
| 1990/0312 | * open a datakit channel and call ken via r70, leave the * incon ctl channel open */ fd = open("#k/2/data", 2); if(fd < 0) error("opening #k/2/data"); cfd = open("#k/2/ctl", 2); if(cfd < 0) error("opening #k/2/ctl"); | |
| 1990/0322 | sendmsg(cfd, "connect helix.bootfs"); print("connected to helix.bootfs\n"); | |
| 1990/0312 | close(cfd); /* * talk to the file server */ print("nop..."); hdr.type = Tnop; n = convS2M(&hdr, buf); if(write(fd, buf, n) != n) error("write nop"); n = read(fd, buf, sizeof buf); if(n <= 0) error("read nop"); if(convM2S(buf, &hdr, n) == 0) { print("n = %d; buf = %.2x %.2x %.2x %.2x\n", n, buf[0], buf[1], buf[2], buf[3]); error("format nop"); } if(hdr.type != Rnop) error("not Rnop"); print("session..."); hdr.type = Tsession; hdr.lang = 'v'; n = convS2M(&hdr, buf); if(write(fd, buf, n) != n) error("write session"); n = read(fd, buf, sizeof buf); if(n <= 0) error("read session"); if(convM2S(buf, &hdr, n) == 0) error("format session"); if(hdr.type != Rsession) error("not Rsession"); if(hdr.err){ print("error %d;", hdr.err); error("remote error"); } print("post..."); sprint(buf, "#s/%s", "bootes"); f = create(buf, 1, 0666); if(f < 0) error("create"); sprint(buf, "%d", fd); if(write(f, buf, strlen(buf)) != strlen(buf)) | |
| 1990/0310 | error("write"); | |
| 1990/0312 | close(f); sprint(buf, "#s/%s", "bootes"); f = create("#s/boot", 1, 0666); if(f < 0) error("create"); sprint(buf, "%d", fd); if(write(f, buf, strlen(buf)) != strlen(buf)) error("write"); close(f); print("mount..."); if(bind("/", "/", MREPL) < 0) error("bind"); if(mount(fd, "/", MAFTER|MCREATE, "") < 0) error("mount"); print("success\n"); execl("/68020/init", "init", 0); error("/68020/init"); } void sendmsg(int fd, char *msg) { int n; n = strlen(msg); if(write(fd, msg, n) != n) error(msg); | |
| 1990/03091 | } void error(char *s) { char buf[64]; errstr(0, buf); fprint(2, "boot: %s: %s\n", s, buf); exits(0); } | |