rev |
line source |
pascal@13691
|
1 #include <asm/limits.h>
|
pascal@13691
|
2 #include <sys/types.h>
|
pascal@13691
|
3 #include <unistd.h>
|
pascal@13691
|
4 #include <fcntl.h>
|
pascal@13691
|
5 #include <stdio.h>
|
pascal@13691
|
6 #include "iso9660.h"
|
pascal@13691
|
7 #include "bootlinux.h"
|
pascal@13691
|
8 #include "libdos.h"
|
pascal@13691
|
9
|
pascal@13691
|
10 static void usage(char *iso)
|
pascal@13691
|
11 {
|
pascal@13691
|
12 printf("Usage: %s [[@commands]|[kernel=<bzimage>] \
|
pascal@13691
|
13 [initrd=<rootfs>[,<rootfs2>...]] [iso=<isofile>] ...]\n\n\
|
pascal@13691
|
14 Defaults: %s @tazboot.cmd or %s kernel=bzImage auto\n\n\
|
pascal@13691
|
15 Examples for tazboot.cmd:\n\n\
|
pascal@13691
|
16 iso=\\isos\\slitaz-4.0.iso\n\
|
pascal@13691
|
17 kernel=boot/bzImage\n\
|
pascal@13691
|
18 initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz\n\
|
pascal@13691
|
19 rw root=/dev/null vga=normal autologin\n\n\
|
pascal@13691
|
20 kernel=\\slitaz\\vmlinuz\n\
|
pascal@13691
|
21 root=/dev/sda5 ro\n",iso,iso,iso);
|
pascal@13691
|
22 exit(1);
|
pascal@13691
|
23 }
|
pascal@13691
|
24
|
pascal@13691
|
25 static void bootiso(char **iso)
|
pascal@13691
|
26 {
|
pascal@13691
|
27 char *init = "rdinit=/init.exe", *mode="menu";
|
pascal@13691
|
28 char c, *s, rootfs[16], cmdline[256];
|
pascal@13691
|
29 int fd, restart;
|
pascal@13691
|
30 unsigned long magic;
|
pascal@13691
|
31
|
pascal@13691
|
32 if (isoreset(*iso) || isoopen("boot")) return;
|
pascal@13691
|
33 if (iso[1] && !strcmp(mode = iso[1], "text"))
|
pascal@13691
|
34 init = "";
|
pascal@13691
|
35 for (c = 0, restart = 1; isoreaddir(restart) == 0; restart = 0) {
|
pascal@13691
|
36 if (strncmp(isofilename, "rootfs", 6) || c > s[6]) continue;
|
pascal@13691
|
37 strcpy(rootfs, isofilename);
|
pascal@13691
|
38 c = s[6];
|
pascal@13691
|
39 }
|
pascal@13691
|
40 if (isoopen(mode))
|
pascal@13691
|
41 isoopen("bzImage");
|
pascal@14257
|
42 if (loadkernel() < 0x20630)
|
pascal@14257
|
43 init = ""; // Does not support multiple initramfs
|
pascal@13691
|
44 isoopen(rootfs);
|
pascal@13691
|
45 loadinitrd();
|
pascal@13972
|
46 lseek(isofd, 24, SEEK_SET);
|
pascal@13691
|
47 read(isofd, &magic, 4);
|
pascal@13691
|
48 isofilesize = magic & 0xFFFF;
|
pascal@14264
|
49 isofileofs = 0x7EE0 - isofilesize;
|
pascal@13691
|
50 loadinitrd();
|
pascal@13691
|
51 close(isofd);
|
pascal@13691
|
52 sprintf(cmdline,"rw root=/dev/null %s iso=%s magic=%lu mode=%s",
|
pascal@13691
|
53 init, *iso, magic, mode);
|
pascal@13691
|
54 bootlinux(cmdline);
|
pascal@13691
|
55 }
|
pascal@13691
|
56
|
pascal@13691
|
57 static int stricmp(char *ref, char *s)
|
pascal@13691
|
58 {
|
pascal@13691
|
59 char c;
|
pascal@13691
|
60 while (*ref) {
|
pascal@13691
|
61 c = *s++;
|
pascal@13691
|
62 if (c >= 'A' && c <= 'Z') c += 'a' - 'A';
|
pascal@13691
|
63 c -= *ref++;
|
pascal@13691
|
64 if (c) return c;
|
pascal@13691
|
65 }
|
pascal@13691
|
66 return 0;
|
pascal@13691
|
67 }
|
pascal@13691
|
68
|
pascal@13691
|
69 static char *iso;
|
pascal@13691
|
70 static int fakeopen(char *file)
|
pascal@13691
|
71 {
|
pascal@13691
|
72 if (iso) {
|
pascal@13691
|
73 isoreset(iso);
|
pascal@13691
|
74 return isoopen(file);
|
pascal@13691
|
75 }
|
pascal@13691
|
76 close(isofd);
|
pascal@13691
|
77 isofd = open(file, O_RDONLY);
|
pascal@13691
|
78 if (isofd != -1) {
|
pascal@13691
|
79 isofileofs = 0;
|
pascal@13691
|
80 isofilesize = LONG_MAX;
|
pascal@13691
|
81 }
|
pascal@13691
|
82 return isofd;
|
pascal@13691
|
83 }
|
pascal@13691
|
84
|
pascal@13691
|
85 static char args[2048];
|
pascal@13691
|
86 int main(int argc, char *argv[])
|
pascal@13691
|
87 {
|
pascal@13691
|
88 char *kernel, *initrd, *cmdline, *cmdfile, *s;
|
pascal@13691
|
89
|
pascal@13691
|
90 argv[0] = progname();
|
pascal@14268
|
91 bootiso(argv); // iso ? parsing is /init.exe stuff !
|
pascal@14268
|
92 if (argc == 2)
|
pascal@14268
|
93 bootiso(argv + 1);
|
pascal@13691
|
94
|
pascal@13691
|
95 chdirname(*argv);
|
pascal@13691
|
96 cmdfile = "tazboot.cmd";
|
pascal@13691
|
97 kernel = "bzImage";
|
pascal@13691
|
98 initrd = NULL;
|
pascal@13691
|
99 cmdline = "auto";
|
pascal@13691
|
100 if (argc > 1) {
|
pascal@13691
|
101 if (argv[1][0] == '@')
|
pascal@13691
|
102 cmdfile = argv[1] + 1;
|
pascal@13691
|
103 else {
|
pascal@13691
|
104 cmdfile = NULL;
|
pascal@13691
|
105 #asm
|
pascal@13691
|
106 push ds
|
pascal@13691
|
107 pop es
|
pascal@13691
|
108 mov si, #0x82
|
pascal@13691
|
109 mov di, #_args
|
pascal@13691
|
110 mov cx, #0x7E/2
|
pascal@13691
|
111 rep
|
pascal@13697
|
112 seg cs
|
pascal@13691
|
113 movsw
|
pascal@13691
|
114 #endasm
|
pascal@13691
|
115 }
|
pascal@13691
|
116 }
|
pascal@13691
|
117 if (cmdfile) {
|
pascal@13691
|
118 int fd;
|
pascal@13691
|
119 fd = open(cmdfile, O_RDONLY);;
|
pascal@13691
|
120 if (fd != -1) {
|
pascal@13691
|
121 read(fd, args, sizeof(args));
|
pascal@13691
|
122 close(fd);
|
pascal@13691
|
123 for (s = args; s < args + sizeof(args) -1; s++) {
|
pascal@13691
|
124 if (*s == '\r') *s++ = ' ';
|
pascal@13691
|
125 if (*s == '\n') *s = ' ';
|
pascal@13691
|
126 }
|
pascal@13691
|
127 }
|
pascal@13691
|
128 }
|
pascal@13691
|
129 for (s = args; s < args + sizeof(args); s++) {
|
pascal@13691
|
130 if (*s == ' ') continue;
|
pascal@13691
|
131 if (stricmp("kernel=", s) == 0)
|
pascal@13691
|
132 kernel = s + 7;
|
pascal@13691
|
133 else if (stricmp("initrd=", s) == 0)
|
pascal@13691
|
134 initrd = s + 7;
|
pascal@13691
|
135 else if (stricmp("iso=", s) == 0)
|
pascal@13691
|
136 iso = s + 4;
|
pascal@13691
|
137 else {
|
pascal@13691
|
138 cmdline = s;
|
pascal@13691
|
139 break;
|
pascal@13691
|
140 }
|
pascal@13691
|
141 while (*s && *s != ' ') s++;
|
pascal@13691
|
142 *s = 0;
|
pascal@13691
|
143 }
|
pascal@13691
|
144 if (fakeopen(kernel) == -1)
|
pascal@13691
|
145 usage(argv[0]);
|
pascal@13691
|
146 loadkernel();
|
pascal@13691
|
147 if (initrd) {
|
pascal@13691
|
148 char *p, *q = initrd;
|
pascal@13691
|
149 while (1) {
|
pascal@13691
|
150 char c;
|
pascal@13691
|
151 for (p = q; *p && *p != ','; p++);
|
pascal@13691
|
152 c = *p;
|
pascal@13691
|
153 *p = 0;
|
pascal@13691
|
154 if (fakeopen(q) != -1)
|
pascal@13691
|
155 loadinitrd();
|
pascal@13691
|
156 if (c == 0)
|
pascal@13691
|
157 break;
|
pascal@13691
|
158 q = ++p;
|
pascal@13691
|
159 }
|
pascal@13691
|
160 }
|
pascal@13691
|
161 bootlinux(cmdline);
|
pascal@13691
|
162 }
|