|
|
1.1 root 1: #include <sys/reboot.h>
2: #include <machine/sunromvec.h>
3:
4: /*
5: * Boot program... argument from monitor determines
6: * whether boot stops to ask for system name and which device
7: * boot comes from.
8: */
9:
10: int (*readfile())();
11:
12: char aline[100];
13:
14: char bunix[] = "unix"; /* and room to patch to whatever */
15:
16: main()
17: {
18: register struct bootparam *bp;
19: register char *arg;
20: register int howto;
21: register int io;
22: int (*go2)();
23:
24: bp = *(romp->v_bootparam); /* S-2: via romvec */
25:
26: arg = bp->bp_argv[0];
27: howto = bootflags(bp->bp_argv[1]);
28: if ((howto&RB_ASKNAME)==0) {
29: register char *s, *p;
30:
31: for (s = arg, p = aline; *s; s++, p++)
32: *p = *s;
33:
34: /*
35: * If no file name given, default to "unix"
36: * We only do this if we aren't asking for input
37: */
38: for (s = aline; *s;)
39: if (*s++ == ')')
40: break;
41: if (*s == '\0') {
42: for (p = bunix; *p;)
43: *s++ = *p++;
44: *s = '\0';
45: }
46: }
47: for (;;) {
48: if (howto & RB_ASKNAME) {
49: printf("Boot: ");
50: gets(aline);
51: if (*aline == 0)
52: continue; /* Null input - try again */
53: parseparam(aline, howto, bp);
54: } else
55: printf("Boot: %s\n", aline);
56: io = open(aline, 0);
57: if (io >= 0) {
58: go2 = readfile(io, 1);
59: if (!(howto & RB_ASKNAME)) {
60: _exitto(go2);
61: /*NOTREACHED*/ ;
62: }
63: if ((int)go2 != -1)
64: (*go2)(arg);
65: } else {
66: printf("boot failed\n");
67: if (!(howto & RB_ASKNAME))
68: _stop((char *) 0);
69: }
70: }
71: }
72:
73:
74: struct bootf {
75: char let;
76: short bit;
77: } bootf[] = {
78: 'a', RB_ASKNAME,
79: 's', RB_SINGLE,
80: 'i', 0,
81: 'h', RB_HALT,
82: 0, 0,
83: };
84:
85: /*
86: * Parse the boot line to determine boot flags
87: */
88: bootflags(cp)
89: register char *cp;
90: {
91: register int i, boothowto = 0;
92:
93: if (*cp++ == '-')
94: do {
95: for (i = 0; bootf[i].let; i++) {
96: if (*cp == bootf[i].let) {
97: boothowto |= bootf[i].bit;
98: break;
99: }
100: }
101: cp++;
102: } while (bootf[i].let && *cp);
103: return (boothowto);
104: }
105:
106: /*
107: * Parse the boot line and put it in bootparam. Stuff in -a -s or -as if
108: * s/he only typed one argument and if they were in effect before.
109: */
110: parseparam(line, defaults, bp)
111: register char *line;
112: int defaults;
113: register struct bootparam *bp;
114: {
115: register int narg = 0, i;
116: register char *cp = bp->bp_strings;
117:
118: while(*line) {
119: if (narg == 1) /* terminate line for open */
120: *line++ = 0;
121: while (*line == ' ')
122: line++;
123: if (*line)
124: bp->bp_argv[narg++] = cp;
125: while (*line != ' ' && *line != 0)
126: *cp++ = *line++;
127: *cp++ = 0;
128: };
129: bp->bp_argv[narg] = 0;
130: /*
131: * Stuff in default switches
132: */
133: if (narg == 1 && defaults) {
134: bp->bp_argv[narg++] = cp;
135: *cp++ = '-';
136: for (i = 0; bootf[i].let; i++) {
137: if (defaults & bootf[i].bit)
138: *cp++ = bootf[i].let;
139: }
140: *cp = 0;
141: bp->bp_argv[narg] = 0;
142: }
143: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.