wok annotate syslinux/stuff/iso2exe/boot.c @ rev 16012

syslinux/iso2exe: access both local and isofs namespaces
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Mar 04 21:00:29 2014 +0000 (2014-03-04)
parents 647e4ebbbcae
children 592369f78d12
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@16012 18 initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz,\\slitaz\\extrafs.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@16002 28 char c, rootfs[16], cmdline[256];
pascal@16012 29 int 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@16002 36 if (strncmp(isofilename, "rootfs", 6)
pascal@16002 37 || c > isofilename[6]) continue;
pascal@13691 38 strcpy(rootfs, isofilename);
pascal@16002 39 c = isofilename[6];
pascal@13691 40 }
pascal@13691 41 if (isoopen(mode))
pascal@13691 42 isoopen("bzImage");
pascal@14257 43 if (loadkernel() < 0x20630)
pascal@14257 44 init = ""; // Does not support multiple initramfs
pascal@13691 45 isoopen(rootfs);
pascal@13691 46 loadinitrd();
pascal@13972 47 lseek(isofd, 24, SEEK_SET);
pascal@13691 48 read(isofd, &magic, 4);
pascal@13691 49 isofilesize = magic & 0xFFFF;
pascal@14264 50 isofileofs = 0x7EE0 - isofilesize;
pascal@13691 51 loadinitrd();
pascal@13691 52 close(isofd);
pascal@13691 53 sprintf(cmdline,"rw root=/dev/null %s iso=%s magic=%lu mode=%s",
pascal@13691 54 init, *iso, magic, mode);
pascal@13691 55 bootlinux(cmdline);
pascal@13691 56 }
pascal@13691 57
pascal@13691 58 static int stricmp(char *ref, char *s)
pascal@13691 59 {
pascal@13691 60 char c;
pascal@13691 61 while (*ref) {
pascal@13691 62 c = *s++;
pascal@13691 63 if (c >= 'A' && c <= 'Z') c += 'a' - 'A';
pascal@13691 64 c -= *ref++;
pascal@13691 65 if (c) return c;
pascal@13691 66 }
pascal@13691 67 return 0;
pascal@13691 68 }
pascal@13691 69
pascal@13691 70 static char *iso;
pascal@13691 71 static int fakeopen(char *file)
pascal@13691 72 {
pascal@16002 73 if (file) {
pascal@16002 74 char *s = file;
pascal@16002 75 while (*s && *s != '\r' && *s != '\n') s++;
pascal@16002 76 *s = 0;
pascal@16002 77 }
pascal@16012 78 if (*file == '\\') {
pascal@16012 79 static fd = -1;
pascal@16012 80 if (fd >= 0) close(fd);
pascal@16012 81 return open(file, O_RDONLY);
pascal@16012 82 }
pascal@13691 83 if (iso) {
pascal@13691 84 isoreset(iso);
pascal@13691 85 return isoopen(file);
pascal@13691 86 }
pascal@13691 87 close(isofd);
pascal@13691 88 isofd = open(file, O_RDONLY);
pascal@13691 89 if (isofd != -1) {
pascal@13691 90 isofileofs = 0;
pascal@13691 91 isofilesize = LONG_MAX;
pascal@13691 92 }
pascal@13691 93 return isofd;
pascal@13691 94 }
pascal@13691 95
pascal@13691 96 static char args[2048];
pascal@13691 97 int main(int argc, char *argv[])
pascal@13691 98 {
pascal@13691 99 char *kernel, *initrd, *cmdline, *cmdfile, *s;
pascal@13691 100
pascal@13691 101 argv[0] = progname();
pascal@14268 102 bootiso(argv); // iso ? parsing is /init.exe stuff !
pascal@14268 103 if (argc == 2)
pascal@14268 104 bootiso(argv + 1);
pascal@13691 105
pascal@13691 106 chdirname(*argv);
pascal@13691 107 cmdfile = "tazboot.cmd";
pascal@13691 108 kernel = "bzImage";
pascal@13691 109 initrd = NULL;
pascal@13691 110 cmdline = "auto";
pascal@13691 111 if (argc > 1) {
pascal@13691 112 if (argv[1][0] == '@')
pascal@13691 113 cmdfile = argv[1] + 1;
pascal@13691 114 else {
pascal@13691 115 cmdfile = NULL;
pascal@13691 116 #asm
pascal@13691 117 push ds
pascal@13691 118 pop es
pascal@13691 119 mov si, #0x82
pascal@13691 120 mov di, #_args
pascal@13691 121 mov cx, #0x7E/2
pascal@13691 122 rep
pascal@13697 123 seg cs
pascal@13691 124 movsw
pascal@13691 125 #endasm
pascal@13691 126 }
pascal@13691 127 }
pascal@13691 128 if (cmdfile) {
pascal@13691 129 int fd;
pascal@13691 130 fd = open(cmdfile, O_RDONLY);;
pascal@13691 131 if (fd != -1) {
pascal@13691 132 read(fd, args, sizeof(args));
pascal@13691 133 close(fd);
pascal@13691 134 for (s = args; s < args + sizeof(args) -1; s++) {
pascal@13691 135 if (*s == '\r') *s++ = ' ';
pascal@13691 136 if (*s == '\n') *s = ' ';
pascal@13691 137 }
pascal@13691 138 }
pascal@13691 139 }
pascal@13691 140 for (s = args; s < args + sizeof(args); s++) {
pascal@13691 141 if (*s == ' ') continue;
pascal@13691 142 if (stricmp("kernel=", s) == 0)
pascal@13691 143 kernel = s + 7;
pascal@13691 144 else if (stricmp("initrd=", s) == 0)
pascal@13691 145 initrd = s + 7;
pascal@13691 146 else if (stricmp("iso=", s) == 0)
pascal@13691 147 iso = s + 4;
pascal@13691 148 else {
pascal@13691 149 cmdline = s;
pascal@13691 150 break;
pascal@13691 151 }
pascal@13691 152 while (*s && *s != ' ') s++;
pascal@13691 153 *s = 0;
pascal@13691 154 }
pascal@16002 155 if (cmdline) {
pascal@16002 156 char *last;
pascal@16002 157 for (s = cmdline; *s && *s != '\r' && *s != '\n'; s++)
pascal@16002 158 if (*s != ' ') last = s;
pascal@16002 159 *++last = 0;
pascal@16002 160 }
pascal@13691 161 if (fakeopen(kernel) == -1)
pascal@13691 162 usage(argv[0]);
pascal@13691 163 loadkernel();
pascal@13691 164 if (initrd) {
pascal@13691 165 char *p, *q = initrd;
pascal@13691 166 while (1) {
pascal@13691 167 char c;
pascal@13691 168 for (p = q; *p && *p != ','; p++);
pascal@13691 169 c = *p;
pascal@13691 170 *p = 0;
pascal@13691 171 if (fakeopen(q) != -1)
pascal@13691 172 loadinitrd();
pascal@13691 173 if (c == 0)
pascal@13691 174 break;
pascal@13691 175 q = ++p;
pascal@13691 176 }
pascal@13691 177 }
pascal@13691 178 bootlinux(cmdline);
pascal@13691 179 }