|
|
1.1 root 1: static char _version[]="boot_cmd version 1.0";
2: /*
3: * This is a standalone program to extract the
4: * command line from /dev/boot_gift.
5: *
6: * Prints the command line on stdout with spaces between arguments.
7: * If there was not command line (i.e. tboot ran /autoboot),
8: * there will be no output.
9: *
10: * An exit value of 0 is normal.
11: * An exit value of 1 indicates that there was no command line.
12: * An exit value of 2 indicates that there is an abnormal
13: * condition--there will be an error message on stderr.
14: */
15: #include <fcntl.h>
16: #define KERNEL
17: #include <sys/typed.h>
18:
19: TYPED_SPACE(boot_gift, BG_LEN, T_FIFO_SIC);
20:
21: #define fd_stdout 1
22: #define fd_stderr 2
23: void
24: main()
25: {
26: int fd;
27: FIFO *ffp;
28: typed_space *tp;
29:
30: /*
31: * Read the boot gift from /dev/boot_gift.
32: */
33: if (-1 == (fd = open("/dev/boot_gift", O_RDONLY))) {
34: write(fd_stderr, "Can not open /dev/boot_gift\n",
35: strlen("Can not open /dev/boot_gift\n") );
36: exit(2);
37: }
38:
39: if (0 == read(fd, &boot_gift, BG_LEN)) {
40: close(fd);
41: write(fd_stderr, "Can not read /dev/boot_gift\n",
42: strlen("Can not read /dev/boot_gift\n") );
43: exit(2);
44: }
45:
46: close(fd);
47:
48: /*
49: * Find the command line in the boot gift.
50: */
51: ffp = fifo_open(&boot_gift, 0);
52:
53: if (F_NULL != ffp) {
54: while (T_NULL != (tp = fifo_read(ffp))) {
55: if (T_STR_ARGF == tp->ts_type) {
56: break;
57: }
58: }
59: }
60:
61: fifo_close(ffp);
62:
63: /*
64: * We've found the command line.
65: */
66: if (T_NULL != tp) {
67: /* Recast the argument list, so we can read it. */
68: RETYPE(tp, T_FIFO_SIC);
69: ffp = fifo_open(tp, 0);
70: while (T_NULL != (tp = fifo_read(ffp))) {
71: if (T_STR_STR == tp->ts_type) {
72: /*
73: * Print out each command item, followed
74: * by a space.
75: */
76: write(fd_stdout, tp->ts_data,
77: strlen(tp->ts_data));
78: write(fd_stdout, " ", strlen(" ") );
79: } else {
80: /*
81: * Illegal item found in the command line.
82: */
83: write(fd_stderr, "/dev/bootgift is corrupt.\n",
84: strlen("/dev/bootgift is corrupt.\n") );
85: fifo_close(ffp);
86: exit(2);
87: }
88: } /* while there are more command arguments */
89: fifo_close(ffp);
90: write(1, "\n", 1);
91: exit(0);
92: } else {
93: /*
94: * There was no command line. Generate no output,
95: * but exit 1 to indicate this fact.
96: */
97: exit(1);
98: }
99: write(fd_stdout, "Unreachable code in main().\n",
100: strlen("Unreachable code in main().\n") );
101: } /* main() */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.