| plan 9 kernel history: overview | file list | diff list |
1990/0504/power/boot.c (diff list | history)
| 1990/0227/sys/src/9/power/boot.c:16,27 – 1990/0324/sys/src/9/power/boot.c:16,27 (short | long) | ||
| 1990/0227 | } Address; Address addr[] = { | |
| 1990/0324 | { "bitbootes", "bitconnect" }, | |
| 1990/0227 | { "ross", "connect 020701005eff" }, { "bootes", "connect 080069020205" }, { "helix", "connect 080069020427" }, { "spindle", "connect 0800690202df" }, { "r70", "connect 08002b04265d" }, | |
| 1990/0227/sys/src/9/power/boot.c:98,106 – 1990/0324/sys/src/9/power/boot.c:98,106 | ||
| 1990/0227 | close(fu); if(strcmp(scmd, "bitconnect") == 0){ | |
| 1990/0324 | fd = open("#3/bit3", ORDWR); | |
| 1990/0227 | if(fd < 0) | |
| 1990/0324 | error("opening #3/bit3"); | |
| 1990/0227 | goto Mesg; } | |
| 1990/0324/sys/src/9/power/boot.c:3,14 – 1990/0427/sys/src/9/power/boot.c:3,24 (short | long) | ||
| 1990/0227 | #include <fcall.h> | |
| 1990/0427 | #define DEFSYS "bitbootes" #define DEFFILE "/mips/9" | |
| 1990/0227 | Fcall hdr; | |
| 1990/0427 | char *sys; char *scmd; char *bootfile; | |
| 1990/0227 |
| |
| 1990/0427 | char sbuf[2*NAMELEN]; char buf[4*1024]; | |
| 1990/0227 | ||
| 1990/0427 | int fd; int cfd; int efd; | |
| 1990/0227 | typedef struct address { char *name; | |
| 1990/0324/sys/src/9/power/boot.c:25,106 – 1990/0427/sys/src/9/power/boot.c:35,131 | ||
| 1990/0227 | { 0 } }; | |
| 1990/0427 | /* * predeclared */ char *lookup(char *); int outin(char *, char *, char *, int); void prerror(char *); void error(char *); void boot(int); | |
| 1990/0227 |
| |
| 1990/0427 | /* * usage: 9b [-a] [server] [file] * * default server is `bitbootes', default file is `/sys/src/9/mips/9' */ main(int argc, char *argv[]) | |
| 1990/0227 | { | |
| 1990/0427 | int i; int manual=0; | |
| 1990/0227 |
| |
| 1990/0427 | open("#c/cons", 0); open("#c/cons", 1); open("#c/cons", 1); print("boot.c staring\n"); argv++; argc--; while(argc > 0){ if(argv[0][0] == '-'){ if(argv[0][1] == 'm') manual = 1; argc--; argv++; } else break; | |
| 1990/0227 | } | |
| 1990/0427 | sys = DEFSYS; bootfile = DEFFILE; switch(argc){ case 1: bootfile = argv[0]; break; case 2: bootfile = argv[0]; sys = argv[1]; break; | |
| 1990/0227 | } | |
| 1990/0427 | boot(manual); for(;;){ if(fd > 0) close(fd); if(cfd > 0) close(cfd); if(efd > 0) close(efd); fd = cfd = efd = 0; boot(1); } | |
| 1990/0227 | } | |
| 1990/0427 | void boot(int ask) | |
| 1990/0227 | { | |
| 1990/0427 | int n, f; | |
| 1990/0227 |
| |
| 1990/0427 | if(!ask) scmd = lookup(sys); else { outin("server", sys, sbuf, sizeof(sbuf)); sys = sbuf; scmd = lookup(sys); } if(scmd == 0){ fprint(2, "boot: %s unknown\n", sys); return; } | |
| 1990/0227 |
| |
| 1990/0427 | print("Connecting to server %s\n", sys); | |
| 1990/0227 | /* | |
| 1990/0427 | * for the bit, we skip all the ether goo | |
| 1990/0227 | */ | |
| 1990/0324 | fd = open("#3/bit3", ORDWR); | |
| 1990/0227 |
| |
| 1990/0324 |
| |
| 1990/0427 | if(fd < 0){ prerror("opening #3/bit3"); return; } | |
| 1990/0227 | goto Mesg; } | |
| 1990/0324/sys/src/9/power/boot.c:108,170 – 1990/0427/sys/src/9/power/boot.c:133,224 | ||
| 1990/0227 | * grab a lance channel, make it recognize ether type 0x900, * and push the nonet ethernet multiplexor onto it. */ | |
| 1990/0427 | efd = open("#l/1/ctl", 2); if(efd < 0){ prerror("opening #l/1/ctl"); return; } if(write(efd, "connect 0x900", sizeof("connect 0x900")-1)<0){ prerror("connect 0x900"); return; } if(write(efd, "push noether", sizeof("push noether")-1)<0){ prerror("push noether"); return; } | |
| 1990/0227 | /* * grab a nonet channel and call up the ross file server */ fd = open("#n/1/data", 2); | |
| 1990/0427 | if(fd < 0) { prerror("opening #n/1/data"); return; } | |
| 1990/0227 | cfd = open("#n/1/ctl", 2); | |
| 1990/0427 | if(cfd < 0){ prerror("opening #n/1/ctl"); return; } if(write(cfd, scmd, strlen(scmd))<0){ prerror(scmd); return; } | |
| 1990/0227 | Mesg: print("nop..."); hdr.type = Tnop; n = convS2M(&hdr, buf); | |
| 1990/0427 | if(write(fd, buf, n) != n){ print("n = %d\n", n); prerror("write nop"); return; } | |
| 1990/0227 | n = read(fd, buf, sizeof buf); | |
| 1990/0427 | if(n <= 0){ prerror("read nop"); return; } | |
| 1990/0227 | if(convM2S(buf, &hdr, n) == 0) { print("n = %d; buf = %.2x %.2x %.2x %.2x\n", n, buf[0], buf[1], buf[2], buf[3]); | |
| 1990/0427 | prerror("format nop"); return; | |
| 1990/0227 | } | |
| 1990/0427 | if(hdr.type != Rnop){ prerror("not Rnop"); return; } | |
| 1990/0227 | print("session..."); hdr.type = Tsession; hdr.lang = 'v'; n = convS2M(&hdr, buf); | |
| 1990/0427 | if(write(fd, buf, n) != n){ prerror("write session"); return; } | |
| 1990/0227 | n = read(fd, buf, sizeof buf); | |
| 1990/0427 | if(n <= 0){ prerror("read session"); return; } if(convM2S(buf, &hdr, n) == 0){ prerror("format session"); return; } if(hdr.type != Rsession){ prerror("not Rsession"); return; } | |
| 1990/0227 | if(hdr.err){ print("error %d;", hdr.err); | |
| 1990/0427 | prerror("remote error"); return; | |
| 1990/0227 | } print("post..."); | |
| 1990/0427 | sprint(buf, "#s/%s", sys); | |
| 1990/0227 | f = create(buf, 1, 0666); if(f < 0) error("create"); | |
| 1990/0324/sys/src/9/power/boot.c:172,178 – 1990/0427/sys/src/9/power/boot.c:226,231 | ||
| 1990/0227 | if(write(f, buf, strlen(buf)) != strlen(buf)) error("write"); close(f); | |
| 1990/0324/sys/src/9/power/boot.c:180,186 – 1990/0427/sys/src/9/power/boot.c:233,239 | ||
| 1990/0227 | if(write(f, buf, strlen(buf)) != strlen(buf)) error("write"); close(f); | |
| 1990/0427 | ||
| 1990/0227 | print("mount..."); if(bind("/", "/", MREPL) < 0) error("bind"); | |
| 1990/0324/sys/src/9/power/boot.c:191,197 – 1990/0427/sys/src/9/power/boot.c:244,265 | ||
| 1990/0227 | error("/mips/init"); } | |
| 1990/0427 | /* * print error */ | |
| 1990/0227 | void | |
| 1990/0427 | prerror(char *s) { char buf[64]; errstr(0, buf); fprint(2, "boot: %s: %s\n", s, buf); } /* * print error and exit */ void | |
| 1990/0227 | error(char *s) { char buf[64]; | |
| 1990/0324/sys/src/9/power/boot.c:199,202 – 1990/0427/sys/src/9/power/boot.c:267,311 | ||
| 1990/0227 | errstr(0, buf); fprint(2, "boot: %s: %s\n", s, buf); exits(0); | |
| 1990/0427 | } /* * lookup the address for a system */ char * lookup(char *arg) { Address *a; if(strcmp(arg, "?")==0 || strcmp(arg, "help")==0){ for(a = addr; a->name; a++) print("%s\n", a->name); return 0; } for(a = addr; a->name; a++){ if(strcmp(a->name, arg) == 0) return a->cmd; } return 0; } /* * prompt and get input */ int outin(char *prompt, char *def, char *buf, int len) { int n; do{ print("%s[%s]: ", prompt, def); n = read(0, buf, len); }while(n==0); if(n < 0) error("can't read #c/cons; please reboot"); if(n == 1) strcpy(buf, def); else buf[n-1] = 0; return n; | |
| 1990/0227 | } | |
| 1990/0427/sys/src/9/power/boot.c:58,64 – 1990/0430/sys/src/9/power/boot.c:58,63 (short | long) | ||
| 1990/0427 | open("#c/cons", 1); open("#c/cons", 1); | |
| 1990/0430/sys/src/9/power/boot.c:18,24 – 1990/0504/sys/src/9/power/boot.c:18,23 (short | long) | ||
| 1990/0427 | int cfd; int efd; | |
| 1990/0227 | typedef struct address { char *name; | |
| 1990/0430/sys/src/9/power/boot.c:47,53 – 1990/0504/sys/src/9/power/boot.c:46,52 | ||
| 1990/0427 | /* * usage: 9b [-a] [server] [file] * | |
| 1990/0504 | * default server is `bitbootes', default file is `/mips/9' | |
| 1990/0427 | */ main(int argc, char *argv[]) | |
| 1990/0227 | { | |
| 1990/0430/sys/src/9/power/boot.c:58,63 – 1990/0504/sys/src/9/power/boot.c:57,68 | ||
| 1990/0427 | open("#c/cons", 1); open("#c/cons", 1); | |
| 1990/0504 | i = create("#e/sysname", 1, 0666); if(i < 0) error("sysname"); if(write(i, argv[0], strlen(argv[0])) <= 0) error("sysname"); close(i); | |
| 1990/0427 | argv++; argc--; | |
| 1990/0430/sys/src/9/power/boot.c:114,121 – 1990/0504/sys/src/9/power/boot.c:119,124 | ||
| 1990/0427 | return; } | |
| 1990/0227 | ||
| 1990/0427 |
| |
| 1990/0227 |
| |
| 1990/0427 | * for the bit, we skip all the ether goo | |
| 1990/0227 | */ | |
| 1990/0430/sys/src/9/power/boot.c:239,245 – 1990/0504/sys/src/9/power/boot.c:242,253 | ||
| 1990/0227 | if(mount(fd, "/", MAFTER|MCREATE, "") < 0) error("mount"); print("success\n"); | |
| 1990/0504 | close(fd); if(ask) execl("/mips/init", "init", 0); else execl("/mips/init", "init", "-m", 0); | |
| 1990/0227 | error("/mips/init"); } | |
| 1990/0504/sys/src/9/power/boot.c:245,253 – 1990/06111/sys/src/9/power/boot.c:245,253 (short | long) | ||
| 1990/0504 | close(fd); if(ask) | |
| 1990/06111 | else execl("/mips/init", "init", 0); | |
| 1990/0227 | error("/mips/init"); } | |
| 1990/06111/sys/src/9/power/boot.c:152,165 – 1990/0704/sys/src/9/power/boot.c:152,165 (short | long) | ||
| 1990/0227 | /* * grab a nonet channel and call up the ross file server */ | |
| 1990/0704 | fd = open("#n/2/data", 2); | |
| 1990/0427 | if(fd < 0) { | |
| 1990/0704 | prerror("opening #n/2/data"); | |
| 1990/0427 | return; } | |
| 1990/0227 |
| |
| 1990/0704 | cfd = open("#n/2/ctl", 2); | |
| 1990/0427 | if(cfd < 0){ | |
| 1990/0704 | prerror("opening #n/2/ctl"); | |
| 1990/0427 | return; } if(write(cfd, scmd, strlen(scmd))<0){ | |
| 1990/0704/sys/src/9/power/boot.c:22,36 – 1990/0721/sys/src/9/power/boot.c:22,37 (short | long) | ||
| 1990/0227 | struct address { char *name; char *cmd; | |
| 1990/0721 | char *srvname; | |
| 1990/0227 | } Address; Address addr[] = { | |
| 1990/0324 |
| |
| 1990/0227 |
| |
| 1990/0721 | { "bitbootes", "bitconnect", "bit!bootes" }, { "ross", "connect 020701005eff", "nonet!ross" }, { "bootes", "connect 080069020205", "nonet!bootes" }, { "helix", "connect 080069020427", "nonet!helix" }, { "spindle", "connect 0800690202df", "nonet!spindle" }, { "r70", "connect 08002b04265d", "nonet!r70" }, | |
| 1990/0227 | { 0 } }; | |
| 1990/0704/sys/src/9/power/boot.c:37,43 – 1990/0721/sys/src/9/power/boot.c:38,44 | ||
| 1990/0427 | /* * predeclared */ | |
| 1990/0721 | Address* lookup(char *); | |
| 1990/0427 | int outin(char *, char *, char *, int); void prerror(char *); void error(char *); | |
| 1990/0704/sys/src/9/power/boot.c:106,123 – 1990/0721/sys/src/9/power/boot.c:107,124 | ||
| 1990/0427 | boot(int ask) | |
| 1990/0227 | { | |
| 1990/0427 | int n, f; | |
| 1990/0721 | Address *a; | |
| 1990/0227 | ||
| 1990/0427 |
| |
| 1990/0721 | if(ask){ | |
| 1990/0427 | outin("server", sys, sbuf, sizeof(sbuf)); sys = sbuf; | |
| 1990/0721 | a = lookup(sys); if(a == 0){ | |
| 1990/0427 | fprint(2, "boot: %s unknown\n", sys); return; } | |
| 1990/0721 | scmd = a->cmd; | |
| 1990/0227 | /* | |
| 1990/0427 | * for the bit, we skip all the ether goo | |
| 1990/0704/sys/src/9/power/boot.c:148,163 – 1990/0721/sys/src/9/power/boot.c:149,168 | ||
| 1990/0427 | prerror("push noether"); return; } | |
| 1990/0721 | if(write(efd, "config nonet", sizeof("config nonet")-1)<0){ prerror("config nonet"); return; } | |
| 1990/0227 | /* * grab a nonet channel and call up the ross file server */ | |
| 1990/0704 |
| |
| 1990/0721 | fd = open("#nnonet/2/data", 2); | |
| 1990/0427 | if(fd < 0) { | |
| 1990/0704 | prerror("opening #n/2/data"); | |
| 1990/0427 | return; } | |
| 1990/0704 |
| |
| 1990/0721 | cfd = open("#nnonet/2/ctl", 2); | |
| 1990/0427 | if(cfd < 0){ | |
| 1990/0704 | prerror("opening #n/2/ctl"); | |
| 1990/0427 | return; | |
| 1990/0704/sys/src/9/power/boot.c:220,226 – 1990/0721/sys/src/9/power/boot.c:225,231 | ||
| 1990/0227 | } print("post..."); | |
| 1990/0427 |
| |
| 1990/0721 | sprint(buf, "#s/%s", a->srvname); | |
| 1990/0227 | f = create(buf, 1, 0666); if(f < 0) error("create"); | |
| 1990/0704/sys/src/9/power/boot.c:279,285 – 1990/0721/sys/src/9/power/boot.c:284,290 | ||
| 1990/0427 | /* * lookup the address for a system */ | |
| 1990/0721 | Address * | |
| 1990/0427 | lookup(char *arg) { Address *a; | |
| 1990/0704/sys/src/9/power/boot.c:291,297 – 1990/0721/sys/src/9/power/boot.c:296,302 | ||
| 1990/0427 | } for(a = addr; a->name; a++){ if(strcmp(a->name, arg) == 0) | |
| 1990/0721 | return a; | |
| 1990/0427 | } return 0; } | |
| 1990/0721/sys/src/9/power/boot.c:159,170 – 1990/0722/sys/src/9/power/boot.c:159,170 (short | long) | ||
| 1990/0227 | */ | |
| 1990/0721 | fd = open("#nnonet/2/data", 2); | |
| 1990/0427 | if(fd < 0) { | |
| 1990/0704 |
| |
| 1990/0722 | prerror("opening #nnonet/2/data"); | |
| 1990/0427 | return; } | |
| 1990/0721 | cfd = open("#nnonet/2/ctl", 2); | |
| 1990/0427 | if(cfd < 0){ | |
| 1990/0704 |
| |
| 1990/0722 | prerror("opening #nnonet/2/ctl"); | |
| 1990/0427 | return; } if(write(cfd, scmd, strlen(scmd))<0){ | |
| 1990/0722/sys/src/9/power/boot.c:1,6 – 1990/11211/sys/src/9/power/boot.c:1,5 (short | long) | ||
| 1990/0227 | #include <u.h> #include <libc.h> | |
| 1990/0427 | #define DEFSYS "bitbootes" | |
| 1990/0722/sys/src/9/power/boot.c:175,180 – 1990/11211/sys/src/9/power/boot.c:174,180 | ||
| 1990/0227 | Mesg: print("nop..."); hdr.type = Tnop; | |
| 1990/11211 | hdr.tag = ~0; | |
| 1990/0227 | n = convS2M(&hdr, buf); | |
| 1990/0427 | if(write(fd, buf, n) != n){ print("n = %d\n", n); | |
| 1990/0722/sys/src/9/power/boot.c:196,205 – 1990/11211/sys/src/9/power/boot.c:196,209 | ||
| 1990/0427 | prerror("not Rnop"); return; } | |
| 1990/11211 | if(hdr.tag != ~0){ prerror("tag not ~0"); return; } | |
| 1990/0227 | print("session..."); hdr.type = Tsession; | |
| 1990/11211 | hdr.tag = ~0; | |
| 1990/0227 | n = convS2M(&hdr, buf); | |
| 1990/0427 | if(write(fd, buf, n) != n){ prerror("write session"); | |
| 1990/0722/sys/src/9/power/boot.c:214,228 – 1990/11211/sys/src/9/power/boot.c:218,235 | ||
| 1990/0427 | prerror("format session"); return; } | |
| 1990/11211 | if(hdr.tag != ~0){ prerror("tag not ~0"); | |
| 1990/0427 | return; } | |
| 1990/0227 |
| |
| 1990/0427 |
| |
| 1990/11211 | if(hdr.type == Rerror){ fprint(2, "boot: error %s\n", hdr.ename); | |
| 1990/0427 | return; | |
| 1990/0227 | } | |
| 1990/11211 | if(hdr.type != Rsession){ prerror("not Rsession"); return; } | |
| 1990/0227 | print("post..."); | |
| 1990/0721 | sprint(buf, "#s/%s", a->srvname); | |
| 1990/0722/sys/src/9/power/boot.c:244,259 – 1990/11211/sys/src/9/power/boot.c:251,266 | ||
| 1990/0227 | print("mount..."); if(bind("/", "/", MREPL) < 0) error("bind"); | |
| 1990/11211 | if(mount(fd, "/", MAFTER|MCREATE, "", "") < 0) | |
| 1990/0227 | error("mount"); print("success\n"); | |
| 1990/0504 | close(fd); if(ask) | |
| 1990/11211 | execl("/mips/Ninit", "Ninit", "-m", 0); | |
| 1990/06111 | else | |
| 1990/0227 |
| |
| 1990/11211 | execl("/mips/Ninit", "Ninit", 0); error("/mips/Ninit"); | |
| 1990/0227 | } | |
| 1990/0427 | /* | |
| 1990/0722/sys/src/9/power/boot.c:264,270 – 1990/11211/sys/src/9/power/boot.c:271,277 | ||
| 1990/0427 | { char buf[64]; | |
| 1990/11211 | errstr(buf); | |
| 1990/0427 | fprint(2, "boot: %s: %s\n", s, buf); } | |
| 1990/0722/sys/src/9/power/boot.c:276,282 – 1990/11211/sys/src/9/power/boot.c:283,289 | ||
| 1990/0227 | { char buf[64]; | |
| 1990/11211 | errstr(buf); | |
| 1990/0227 | fprint(2, "boot: %s: %s\n", s, buf); exits(0); | |
| 1990/0427 | } | |
| 1990/11211/sys/src/9/power/boot.c:257,266 – 1990/1122/sys/src/9/power/boot.c:257,266 (short | long) | ||
| 1990/0504 | close(fd); if(ask) | |
| 1990/11211 |
| |
| 1990/1122 | execl("/mips/init", "init", "-m", 0); | |
| 1990/06111 | else | |
| 1990/11211 |
| |
| 1990/1122 | execl("/mips/init", "init", 0); error("/mips/init"); | |
| 1990/0227 | } | |
| 1990/0427 | /* | |
| 1990/1122/sys/src/9/power/boot.c:2,8 – 1990/1127/sys/src/9/power/boot.c:2,8 (short | long) | ||
| 1990/0227 | #include <libc.h> #include <fcall.h> | |
| 1990/0427 |
| |
| 1990/1127 | #define DEFSYS "bit!bootes" | |
| 1990/0427 | #define DEFFILE "/mips/9" | |
| 1990/0227 | Fcall hdr; | |
| 1990/1122/sys/src/9/power/boot.c:21,36 – 1990/1127/sys/src/9/power/boot.c:21,34 | ||
| 1990/0227 | struct address { char *name; char *cmd; | |
| 1990/0721 |
| |
| 1990/0227 | } Address; Address addr[] = { | |
| 1990/0721 |
| |
| 1990/1127 | { "ross", "connect 020701005eff" }, { "bootes", "connect 080069020205" }, { "helix", "connect 080069020427" }, { "spindle", "connect 0800690202df" }, { "r70", "connect 08002b04265d" }, | |
| 1990/0227 | { 0 } }; | |
| 1990/1122/sys/src/9/power/boot.c:37,47 – 1990/1127/sys/src/9/power/boot.c:35,47 | ||
| 1990/0427 | /* * predeclared */ | |
| 1990/0721 |
| |
| 1990/0427 | int outin(char *, char *, char *, int); void prerror(char *); void error(char *); void boot(int); | |
| 1990/1127 | int dkdial(char *); int nonetdial(char *); int bitdial(char *); | |
| 1990/0227 | ||
| 1990/0427 | /* * usage: 9b [-a] [server] [file] | |
| 1990/1122/sys/src/9/power/boot.c:95,177 – 1990/1127/sys/src/9/power/boot.c:95,267 | ||
| 1990/0427 | close(fd); if(cfd > 0) close(cfd); | |
| 1990/1127 | fd = cfd = 0; | |
| 1990/0427 | boot(1); } | |
| 1990/0227 | } | |
| 1990/0427 |
| |
| 1990/1127 | int bitdial(char *arg) | |
| 1990/0227 | { | |
| 1990/0427 |
| |
| 1990/1127 | return open("#3/bit3", ORDWR); } int nonetdial(char *arg) { int efd, cfd, fd; | |
| 1990/0721 | Address *a; | |
| 1990/1127 | static int mounted; | |
| 1990/0227 | ||
| 1990/0721 |
| |
| 1990/0427 |
| |
| 1990/1127 | for(a = addr; a->name; a++){ if(strcmp(a->name, arg) == 0) break; | |
| 1990/0427 | } | |
| 1990/0721 |
| |
| 1990/0427 |
| |
| 1990/1127 | if(a->name == 0){ print("can't convert nonet address to ether address\n"); return -1; | |
| 1990/0427 | } | |
| 1990/0721 |
| |
| 1990/0227 |
| |
| 1990/0427 |
| |
| 1990/0227 |
| |
| 1990/0324 |
| |
| 1990/0427 |
| |
| 1990/1127 | if(!mounted){ /* * grab a lance channel, make it recognize ether type 0x900, * and push the nonet ethernet multiplexor onto it. */ efd = open("#l/1/ctl", 2); if(efd < 0){ prerror("opening #l/1/ctl"); return -1; | |
| 1990/0427 | } | |
| 1990/0227 |
| |
| 1990/1127 | if(write(efd, "connect 0x900", sizeof("connect 0x900")-1)<0){ close(efd); prerror("connect 0x900"); return -1; } if(write(efd, "push noether", sizeof("push noether")-1)<0){ close(efd); prerror("push noether"); return -1; } if(write(efd, "config nonet", sizeof("config nonet")-1)<0){ close(efd); prerror("config nonet"); return -1; } mounted = 1; | |
| 1990/0227 | } /* | |
| 1990/1127 | * grab a nonet channel and call up the file server | |
| 1990/0227 | */ | |
| 1990/0427 |
| |
| 1990/1127 | fd = open("#nnonet/2/data", 2); if(fd < 0) { prerror("opening #nnonet/2/data"); return -1; | |
| 1990/0427 | } | |
| 1990/1127 | cfd = open("#nnonet/2/ctl", 2); if(cfd < 0){ close(fd); fd = -1; prerror("opening #nnonet/2/ctl"); return -1; | |
| 1990/0427 | } | |
| 1990/1127 | if(write(cfd, a->cmd, strlen(a->cmd))<0){ close(cfd); close(fd); fd = cfd = -1; prerror(a->cmd); return -1; | |
| 1990/0427 | } | |
| 1990/0721 |
| |
| 1990/1127 | return fd; } int dkdial(char *arg) { int fd; char cmd[64]; static int mounted; if(!mounted){ /* * grab the hsvme and configure it for a datakit */ efd = open("#h/ctl", 2); if(efd < 0){ prerror("opening #h/ctl"); return -1; } if(write(efd, "push dkmux", sizeof("push dkmux")-1)<0){ close(efd); prerror("push dkmux"); return -1; } if(write(efd, "config 4 256 restart dk", sizeof("config 4 256 restart dk")-1)<0){ close(efd); prerror("config 4 256 restart dk"); return -1; } mounted = 1; sleep(2000); /* wait for things to settle down */ | |
| 1990/0721 | } | |
| 1990/0227 | /* | |
| 1990/1127 | * grab a datakit channel and call up the file server | |
| 1990/0227 | */ | |
| 1990/0721 |
| |
| 1990/1127 | fd = open("#kdk/5/data", 2); | |
| 1990/0427 | if(fd < 0) { | |
| 1990/0722 |
| |
| 1990/0427 |
| |
| 1990/1127 | prerror("opening #kdk/5/data"); return -1; | |
| 1990/0427 | } | |
| 1990/0721 |
| |
| 1990/1127 | cfd = open("#kdk/5/ctl", 2); | |
| 1990/0427 | if(cfd < 0){ | |
| 1990/0722 |
| |
| 1990/0427 |
| |
| 1990/1127 | close(fd); fd = -1; prerror("opening #kdk/5/ctl"); return -1; | |
| 1990/0427 | } | |
| 1990/1127 | sprint(cmd, "connect %s", arg); if(write(cfd, cmd, strlen(cmd))<0){ close(cfd); close(fd); cfd = fd = -1; prerror(cmd); return -1; } return fd; } void boot(int ask) { int n, f, tries; char *srvname; if(ask){ outin("server", sys, sbuf, sizeof(sbuf)); sys = sbuf; } for(tries = 0; tries < 5; tries++){ fd = -1; if(strncmp(sys, "bit!", 4) == 0) fd = bitdial(srvname = &sys[4]); else if(strncmp(sys, "dk!", 3) == 0) fd = dkdial(srvname = &sys[3]); else if(strncmp(sys, "nonet!", 5) == 0) fd = nonetdial(srvname = &sys[5]); else fd = nonetdial(srvname = sys); if(fd >= 0) break; print("can't connect, retrying...\n"); sleep(1000); } if(fd < 0){ print("can't connect\n"); | |
| 1990/0427 | return; } | |
| 1990/0227 |
| |
| 1990/11211 | hdr.tag = ~0; | |
| 1990/1122/sys/src/9/power/boot.c:181,191 – 1990/1127/sys/src/9/power/boot.c:271,284 | ||
| 1990/0427 | prerror("write nop"); return; } | |
| 1990/1127 | reread: | |
| 1990/0227 | n = read(fd, buf, sizeof buf); | |
| 1990/0427 | if(n <= 0){ prerror("read nop"); return; } | |
| 1990/1127 | if(n == 2) goto reread; | |
| 1990/0227 | if(convM2S(buf, &hdr, n) == 0) { print("n = %d; buf = %.2x %.2x %.2x %.2x\n", n, buf[0], buf[1], buf[2], buf[3]); | |
| 1990/1122/sys/src/9/power/boot.c:232,238 – 1990/1127/sys/src/9/power/boot.c:325,331 | ||
| 1990/11211 | } | |
| 1990/0227 | print("post..."); | |
| 1990/0721 |
| |
| 1990/1127 | sprint(buf, "#s/%s", srvname); | |
| 1990/0227 | f = create(buf, 1, 0666); if(f < 0) error("create"); | |
| 1990/1122/sys/src/9/power/boot.c:286,311 – 1990/1127/sys/src/9/power/boot.c:379,384 | ||
| 1990/11211 | errstr(buf); | |
| 1990/0227 | fprint(2, "boot: %s: %s\n", s, buf); exits(0); | |
| 1990/0427 |
| |
| 1990/0721 |
| |
| 1990/0427 |
| |
| 1990/0721 |
| |
| 1990/0427 |
| |
| 1990/1127/sys/src/9/power/boot.c:6,17 – 1990/1202/sys/src/9/power/boot.c:6,16 (short | long) | ||
| 1990/0427 | #define DEFFILE "/mips/9" | |
| 1990/0227 | Fcall hdr; | |
| 1990/0427 |
| |
| 1990/0227 | ||
| 1990/0427 |
| |
| 1990/1202 | char bootfile[5*NAMELEN]; char sys[NAMELEN]; | |
| 1990/0227 | ||
| 1990/0427 | int fd; int cfd; | |
| 1990/1127/sys/src/9/power/boot.c:35,41 – 1990/1202/sys/src/9/power/boot.c:34,40 | ||
| 1990/0427 | /* * predeclared */ | |
| 1990/1202 | int outin(char *, char *, int); | |
| 1990/0427 | void prerror(char *); void error(char *); void boot(int); | |
| 1990/1127/sys/src/9/power/boot.c:60,66 – 1990/1202/sys/src/9/power/boot.c:59,65 | ||
| 1990/0504 | i = create("#e/sysname", 1, 0666); if(i < 0) error("sysname"); | |
| 1990/1202 | if(write(i, argv[0], strlen(argv[0])) != strlen(argv[0])) | |
| 1990/0504 | error("sysname"); close(i); | |
| 1990/0427 | ||
| 1990/1127/sys/src/9/power/boot.c:77,91 – 1990/1202/sys/src/9/power/boot.c:76,90 | ||
| 1990/0427 | break; | |
| 1990/0227 | } | |
| 1990/0427 |
| |
| 1990/1202 | strcpy(sys, DEFSYS); strcpy(bootfile, DEFFILE); | |
| 1990/0427 | switch(argc){ case 1: | |
| 1990/1202 | strcpy(bootfile, argv[0]); | |
| 1990/0427 | break; case 2: | |
| 1990/1202 | strcpy(bootfile, argv[0]); strcpy(sys, argv[1]); | |
| 1990/0427 | break; | |
| 1990/0227 | } | |
| 1990/0427 | ||
| 1990/1127/sys/src/9/power/boot.c:238,245 – 1990/1202/sys/src/9/power/boot.c:237,243 | ||
| 1990/1127 | char *srvname; if(ask){ | |
| 1990/1202 | outin("server", sys, sizeof(sys)); | |
| 1990/1127 | } for(tries = 0; tries < 5; tries++){ | |
| 1990/1127/sys/src/9/power/boot.c:248,255 – 1990/1202/sys/src/9/power/boot.c:246,253 | ||
| 1990/1127 | fd = bitdial(srvname = &sys[4]); else if(strncmp(sys, "dk!", 3) == 0) fd = dkdial(srvname = &sys[3]); | |
| 1990/1202 | else if(strncmp(sys, "nonet!", 6) == 0) fd = nonetdial(srvname = &sys[6]); | |
| 1990/1127 | else fd = nonetdial(srvname = sys); if(fd >= 0) | |
| 1990/1127/sys/src/9/power/boot.c:385,393 – 1990/1202/sys/src/9/power/boot.c:383,393 | ||
| 1990/0427 | * prompt and get input */ int | |
| 1990/1202 | int outin(char *prompt, char *def, int len) | |
| 1990/0427 | { int n; | |
| 1990/1202 | char buf[256]; | |
| 1990/0427 | do{ print("%s[%s]: ", prompt, def); | |
| 1990/1127/sys/src/9/power/boot.c:395,403 – 1990/1202/sys/src/9/power/boot.c:395,403 | ||
| 1990/0427 | }while(n==0); if(n < 0) error("can't read #c/cons; please reboot"); | |
| 1990/1202 | if(n != 1){ | |
| 1990/0427 | buf[n-1] = 0; | |
| 1990/1202 | strcpy(def, buf); } | |
| 1990/0427 | return n; | |
| 1990/0227 | } | |
| 1990/1202/sys/src/9/power/boot.c:5,10 – 1991/0108/sys/src/9/power/boot.c:5,13 (short | long) | ||
| 1990/1127 | #define DEFSYS "bit!bootes" | |
| 1990/0427 | #define DEFFILE "/mips/9" | |
| 1991/0108 | char *net; char *netdev; | |
| 1990/0227 | Fcall hdr; | |
| 1990/0427 | char *scmd; | |
| 1990/0227 | ||
| 1990/1202/sys/src/9/power/boot.c:171,176 – 1991/0108/sys/src/9/power/boot.c:174,181 | ||
| 1990/1127 | prerror(a->cmd); return -1; | |
| 1990/0427 | } | |
| 1991/0108 | net = "nonet"; netdev = "#nnonet"; | |
| 1990/1127 | return fd; } | |
| 1990/1202/sys/src/9/power/boot.c:227,232 – 1991/0108/sys/src/9/power/boot.c:232,239 | ||
| 1990/1127 | prerror(cmd); return -1; } | |
| 1991/0108 | net = "dk"; netdev = "#kdk"; | |
| 1990/1127 | return fd; } | |
| 1990/1202/sys/src/9/power/boot.c:346,351 – 1991/0108/sys/src/9/power/boot.c:353,372 | ||
| 1990/0227 | error("mount"); print("success\n"); | |
| 1990/0504 | close(fd); | |
| 1991/0108 | if(net){ char buf[128]; fd = create("#e/bootnet", 1, 0666); if(fd >= 0){ if(write(fd, net, strlen(net)) != strlen(net)) error("writing bootnet"); close(fd); sprint(buf, "/net/%s", net); if(bind(netdev, buf, MREPL) < 0) error("binding bootnet"); } } | |
| 1990/0504 | if(ask) | |
| 1990/1122 | execl("/mips/init", "init", "-m", 0); | |
| 1991/0108/sys/src/9/power/boot.c:242,247 – 1991/01151/sys/src/9/power/boot.c:242,249 (short | long) | ||
| 1990/1127 | { int n, f, tries; char *srvname; | |
| 1991/01151 | Dir dir; char dirbuf[DIRLEN]; | |
| 1990/1127 | if(ask){ | |
| 1990/1202 | outin("server", sys, sizeof(sys)); | |
| 1991/0108/sys/src/9/power/boot.c:351,358 – 1991/01151/sys/src/9/power/boot.c:353,373 | ||
| 1990/0227 | error("bind"); | |
| 1990/11211 | if(mount(fd, "/", MAFTER|MCREATE, "", "") < 0) | |
| 1990/0227 | error("mount"); | |
| 1991/01151 | /* * set the time from the access time of the root of the file server, * accessible as /.. */ print("time..."); if(stat("/..", dirbuf) < 0) error("stat"); convM2D(dirbuf, &dir); f = open("#c/time", OWRITE); sprint(dirbuf, "%ld", dir.atime); write(f, dirbuf, strlen(dirbuf)); close(f); | |
| 1990/0227 | print("success\n"); | |
| 1990/0504 |
| |
| 1991/0108 | if(net){ char buf[128]; | |
| 1991/01151/sys/src/9/power/boot.c:369,386 – 1991/0131/sys/src/9/power/boot.c:369,385 (short | long) | ||
| 1991/01151 | ||
| 1990/0227 | print("success\n"); | |
| 1991/0108 | ||
| 1991/0131 | if(netdev){ char buf[64]; sprint(buf, "/net/%s", net); bind(netdev, buf, MREPL); bind(netdev, "/net/net", MREPL); } | |
| 1991/0108 | if(net){ | |
| 1991/0131 | char buf[64]; sprint(buf, "/lib/netaddr.%s", net); print("binding %s onto /lib/netaddr.net\n", buf); bind(buf, "/lib/netaddr.net", MREPL); | |
| 1991/0108 | } | |
| 1990/0504 | if(ask) | |
| 1991/0131/sys/src/9/power/boot.c:44,49 – 1991/0304/sys/src/9/power/boot.c:44,50 (short | long) | ||
| 1990/1127 | int dkdial(char *); int nonetdial(char *); int bitdial(char *); | |
| 1991/0304 | int preamble(int); | |
| 1990/0227 | ||
| 1990/0427 | /* * usage: 9b [-a] [server] [file] | |
| 1991/0131/sys/src/9/power/boot.c:237,274 – 1991/0304/sys/src/9/power/boot.c:238,295 | ||
| 1990/1127 | return fd; } | |
| 1991/0304 | int hotdial(char *arg) | |
| 1990/1127 | { | |
| 1991/01151 |
| |
| 1991/0304 | int fd; char srvdir[100]; Waitmsg m; | |
| 1990/1127 |
| |
| 1990/1202 |
| |
| 1991/0304 | /* * The killer: gotta get a hotrodboot running, so dial up * on datakit and load it. */ fd = dkdial(arg); if(fd < 0) return -1; if(!preamble(fd)){ close(fd); return -1; | |
| 1990/1127 | } | |
| 1990/1202 |
| |
| 1990/1127 |
| |
| 1991/0304 | /* * use /dev; it's local */ if(mount(fd, "/dev", MREPL, "", "") < 0) error("mount"); switch(fork()){ case 0: /* * child: get hotrodboot running */ execl("/dev/mips/bin/hotrodboot", "hotrodboot", "/dev/hobbit/hot", 0); error("execl hotrodboot"); case -1: error("fork"); | |
| 1990/1127 | } | |
| 1990/0427 |
| |
| 1991/0304 | /* * parent: wait, then sleep a while */ wait(&m); if(m.msg[0]) error(m.msg); fprint(2, "sleep 3 seconds\n"); sleep(3*1000); fprint(2, "go for it....\n"); return open("#H/hotrod", ORDWR); } | |
| 1990/0227 | ||
| 1991/0304 | int preamble(int fd) { int n; | |
| 1990/0227 | print("nop..."); hdr.type = Tnop; | |
| 1990/11211 | hdr.tag = ~0; | |
| 1991/0131/sys/src/9/power/boot.c:276,288 – 1991/0304/sys/src/9/power/boot.c:297,309 | ||
| 1990/0427 | if(write(fd, buf, n) != n){ print("n = %d\n", n); prerror("write nop"); | |
| 1991/0304 | return 0; | |
| 1990/0427 | } | |
| 1990/1127 | reread: | |
| 1990/0227 | n = read(fd, buf, sizeof buf); | |
| 1990/0427 | if(n <= 0){ prerror("read nop"); | |
| 1991/0304 | return 0; | |
| 1990/0427 | } | |
| 1990/1127 | if(n == 2) goto reread; | |
| 1991/0131/sys/src/9/power/boot.c:290,304 – 1991/0304/sys/src/9/power/boot.c:311,325 | ||
| 1990/0227 | print("n = %d; buf = %.2x %.2x %.2x %.2x\n", n, buf[0], buf[1], buf[2], buf[3]); | |
| 1990/0427 | prerror("format nop"); | |
| 1991/0304 | return 0; | |
| 1990/0227 | } | |
| 1990/0427 | if(hdr.type != Rnop){ prerror("not Rnop"); | |
| 1991/0304 | return 0; | |
| 1990/0427 | } | |
| 1990/11211 | if(hdr.tag != ~0){ prerror("tag not ~0"); | |
| 1991/0304 | return 0; | |
| 1990/11211 | } | |
| 1990/0227 | print("session..."); | |
| 1991/0131/sys/src/9/power/boot.c:307,335 – 1991/0304/sys/src/9/power/boot.c:328,395 | ||
| 1990/0227 | n = convS2M(&hdr, buf); | |
| 1990/0427 | if(write(fd, buf, n) != n){ prerror("write session"); | |
| 1991/0304 | return 0; | |
| 1990/0427 | } | |
| 1990/0227 | n = read(fd, buf, sizeof buf); | |
| 1990/0427 | if(n <= 0){ prerror("read session"); | |
| 1991/0304 | return 0; | |
| 1990/0427 | } if(convM2S(buf, &hdr, n) == 0){ prerror("format session"); | |
| 1991/0304 | return 0; | |
| 1990/0427 | } | |
| 1990/11211 | if(hdr.tag != ~0){ prerror("tag not ~0"); | |
| 1990/0427 |
| |
| 1991/0304 | return 0; | |
| 1990/0427 | } | |
| 1990/11211 | if(hdr.type == Rerror){ fprint(2, "boot: error %s\n", hdr.ename); | |
| 1990/0427 |
| |
| 1991/0304 | return 0; | |
| 1990/0227 | } | |
| 1990/11211 | if(hdr.type != Rsession){ prerror("not Rsession"); | |
| 1991/0304 | return 0; } return 1; } void boot(int ask) { int n, f, tries; char *srvname; Dir dir; char dirbuf[DIRLEN]; if(ask){ outin("server", sys, sizeof(sys)); } for(tries = 0; tries < 5; tries++){ fd = -1; if(strncmp(sys, "bit!", 4) == 0) fd = bitdial(srvname = &sys[4]); if(strncmp(sys, "hot!", 4) == 0) fd = hotdial(srvname = &sys[4]); else if(strncmp(sys, "dk!", 3) == 0) fd = dkdial(srvname = &sys[3]); else if(strncmp(sys, "nonet!", 6) == 0) fd = nonetdial(srvname = &sys[6]); else fd = nonetdial(srvname = sys); if(fd >= 0) break; print("can't connect, retrying...\n"); sleep(1000); } if(fd < 0){ print("can't connect\n"); | |
| 1990/11211 | return; } | |
| 1991/0304 | if(!preamble(fd)) return; | |
| 1990/0227 | print("post..."); | |
| 1990/1127 | sprint(buf, "#s/%s", srvname); | |
| 1991/0304/sys/src/9/power/boot.c:370,376 – 1991/0315/sys/src/9/power/boot.c:370,376 (short | long) | ||
| 1991/0304 | fd = -1; if(strncmp(sys, "bit!", 4) == 0) fd = bitdial(srvname = &sys[4]); | |
| 1991/0315 | else if(strncmp(sys, "hot!", 4) == 0) | |
| 1991/0304 | fd = hotdial(srvname = &sys[4]); else if(strncmp(sys, "dk!", 3) == 0) fd = dkdial(srvname = &sys[3]); | |
| 1991/0315/sys/src/9/power/boot.c:27,33 – 1991/0327/sys/src/9/power/boot.c:27,33 (short | long) | ||
| 1990/0227 | Address addr[] = { | |
| 1990/1127 | { "ross", "connect 020701005eff" }, | |
| 1991/0327 | { "bootes", "connect 0800690203f3" }, | |
| 1990/1127 | { "helix", "connect 080069020427" }, { "spindle", "connect 0800690202df" }, { "r70", "connect 08002b04265d" }, | |
| 1991/0327/sys/src/9/power/boot.c:442,451 – 1991/0418/sys/src/9/power/boot.c:442,462 (short | long) | ||
| 1991/0131 | bind(buf, "/lib/netaddr.net", MREPL); | |
| 1991/0108 | } | |
| 1990/0504 |
| |
| 1991/0418 | if(ask){ | |
| 1990/1122 | execl("/mips/init", "init", "-m", 0); | |
| 1990/06111 |
| |
| 1990/1122 |
| |
| 1991/0418 | } else { switch(fork()){ case -1: print("can't start connection server\n"); break; case 0: execl("/mips/init", "init", "-d", "/bin/cs", 0); error("/mips/bin/cs"); break; default: execl("/mips/init", "init", 0); } } | |
| 1990/1122 | error("/mips/init"); | |
| 1990/0227 | } | |
| 1991/0418/sys/src/9/power/boot.c:66,71 – 1991/0430/sys/src/9/power/boot.c:66,77 (short | long) | ||
| 1990/1202 | if(write(i, argv[0], strlen(argv[0])) != strlen(argv[0])) | |
| 1990/0504 | error("sysname"); close(i); | |
| 1991/0430 | i = create("#e/terminal", 1, 0666); if(i < 0) error("terminal"); if(write(i, "sgi power 4D", strlen("sgi power 4D")) < 0) error("terminal"); close(i); | |
| 1990/0427 | argv++; argc--; | |
| 1991/0430/sys/src/9/power/boot.c:451,467 – 1991/0507/sys/src/9/power/boot.c:451,457 (short | long) | ||
| 1991/0418 | if(ask){ | |
| 1990/1122 | execl("/mips/init", "init", "-m", 0); | |
| 1991/0418 | } else { | |
| 1991/0507 | execl("/mips/init", "init", 0); | |
| 1991/0418 | } | |
| 1990/1122 | error("/mips/init"); | |
| 1990/0227 | } | |
| 1991/0507/sys/src/9/power/boot.c:31,36 – 1991/0509/sys/src/9/power/boot.c:31,37 (short | long) | ||
| 1990/1127 | { "helix", "connect 080069020427" }, { "spindle", "connect 0800690202df" }, { "r70", "connect 08002b04265d" }, | |
| 1991/0509 | { "fornax", "connect 00007701d2ba" }, | |
| 1990/0227 | { 0 } }; | |
| 1991/0509/sys/src/9/power/boot.c:369,377 – 1991/0719/sys/src/9/power/boot.c:369,376 (short | long) | ||
| 1991/0304 | Dir dir; char dirbuf[DIRLEN]; | |
| 1991/0719 | if(ask) | |
| 1991/0304 | outin("server", sys, sizeof(sys)); | |
| 1991/0719/sys/src/9/power/boot.c:485,491 – 1991/0806/sys/src/9/power/boot.c:485,490 (short | long) | ||
| 1990/0427 | * prompt and get input */ int | |
| 1990/1202 |
| |
| 1990/0427 | { int n; | |
| 1991/0806/sys/src/9/power/boot.c:299,305 – 1991/0820/sys/src/9/power/boot.c:299,305 (short | long) | ||
| 1991/0304 | ||
| 1990/0227 | print("nop..."); hdr.type = Tnop; | |
| 1990/11211 |
| |
| 1991/0820 | hdr.tag = NOTAG; | |
| 1990/0227 | n = convS2M(&hdr, buf); | |
| 1990/0427 | if(write(fd, buf, n) != n){ print("n = %d\n", n); | |
| 1991/0806/sys/src/9/power/boot.c:324,337 – 1991/0820/sys/src/9/power/boot.c:324,337 | ||
| 1990/0427 | prerror("not Rnop"); | |
| 1991/0304 | return 0; | |
| 1990/0427 | } | |
| 1990/11211 |
| |
| 1991/0820 | if(hdr.tag != NOTAG){ prerror("tag not NOTAG"); | |
| 1991/0304 | return 0; | |
| 1990/11211 | } | |
| 1990/0227 | print("session..."); hdr.type = Tsession; | |
| 1990/11211 |
| |
| 1991/0820 | hdr.tag = NOTAG; | |
| 1990/0227 | n = convS2M(&hdr, buf); | |
| 1990/0427 | if(write(fd, buf, n) != n){ prerror("write session"); | |
| 1991/0806/sys/src/9/power/boot.c:346,353 – 1991/0820/sys/src/9/power/boot.c:346,353 | ||
| 1990/0427 | prerror("format session"); | |
| 1991/0304 | return 0; | |
| 1990/0427 | } | |
| 1990/11211 |
| |
| 1991/0820 | if(hdr.tag != NOTAG){ prerror("tag not NOTAG"); | |
| 1991/0304 | return 0; | |
| 1990/0427 | } | |
| 1990/11211 | if(hdr.type == Rerror){ | |
| Too many diffs (26 > 25). Stopping. | ||