wok diff syslinux/stuff/iso2exe/iso2exe.c @ rev 18897
syslinux/isohybrid.exe add -r support
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sun Feb 14 22:06:06 2016 +0100 (2016-02-14) |
parents | ee7f5b80836f |
children | 62104f2454a3 |
line diff
1.1 --- a/syslinux/stuff/iso2exe/iso2exe.c Tue Jan 05 11:03:10 2016 +0100 1.2 +++ b/syslinux/stuff/iso2exe/iso2exe.c Sun Feb 14 22:06:06 2016 +0100 1.3 @@ -33,6 +33,7 @@ 1.4 static char tazlitoinfo[0x8000U - BOOTISOSZ]; 1.5 #define buffer tazlitoinfo 1.6 #define BUFFERSZ 2048 1.7 +#define BYTE(n) * (unsigned char *) (n) 1.8 #define WORD(n) * (unsigned short *) (n) 1.9 #define LONG(n) * (unsigned long *) (n) 1.10 1.11 @@ -493,22 +494,144 @@ 1.12 return SUCCESSMSG; 1.13 } 1.14 1.15 +static unsigned short files[] = { // to move to iso2exe.sh .... 1.16 + WIN32_EXE, /* 0 */ 1.17 + SYSLINUX_MBR, /* 1 */ 1.18 + FLAVOR_INFO, /* 2 */ 1.19 + FLOPPY_BOOT, /* 3 */ 1.20 + TAZBOOT_COM, /* 4 */ 1.21 + ROOTFS_GZ, /* 5 */ 1.22 + DOSSTUB, /* 6 */ 1.23 + BOOT_MD5, /* 7 */ 1.24 + FS_ISO, /* 8 */ 1.25 + CUSTOM_MAGIC, /* 9 */ 1.26 + CUSTOM_APPEND, /* 10 */ 1.27 + CUSTOM_INITRD /* 11 */ 1.28 +}; 1.29 + 1.30 +static long file_offset, file_size; 1.31 +static void fileofs(int number) 1.32 +{ 1.33 + unsigned long i, c, stub; 1.34 + char *s; 1.35 + 1.36 + c = getcustomsector(); 1.37 + readsector(0); 1.38 + i = 1024; 1.39 + if (WORD(buffer+1024) != 35615) i = 512 * (1 + BYTE(buffer+417)); 1.40 + stub = WORD(buffer+20) - 0xC0; 1.41 + file_size = file_offset = 0; 1.42 + switch (files[number]) { 1.43 + case WIN32_EXE: /* win32.exe */ 1.44 + if (i != 1024) file_size = i - 512; break; 1.45 + case SYSLINUX_MBR: /* syslinux.mbr */ 1.46 + if (i != 1024) file_offset = i - 512; 1.47 + file_size = 512; break; 1.48 + case FLAVOR_INFO: /* flavor.info */ 1.49 + file_offset = i; file_size = 0; break; 1.50 + case FLOPPY_BOOT: /* floppy.boot */ 1.51 + file_size = BYTE(buffer+26)*512; 1.52 + file_offset = WORD(buffer+64) - 0xC0 - file_size; break; 1.53 + case TAZBOOT_COM: /* tazboot.com */ 1.54 + file_offset = WORD(buffer+64) - 0xC0; 1.55 + file_size = stub - WORD(buffer+24) - file_offset; break; 1.56 + case ROOTFS_GZ: /* rootfs.gz */ 1.57 + file_size = WORD(buffer+24); 1.58 + file_offset = stub - file_size; break; 1.59 + case DOSSTUB: /* dosstub */ 1.60 + file_offset = stub; 1.61 + file_size = 0x8000U - file_offset; break; 1.62 + case BOOT_MD5: /* boot.md5 */ 1.63 + file_offset = 0x7FF0U; file_size = 16; break; 1.64 + case FS_ISO: /* fs.iso */ 1.65 + file_offset = 0x8000U; file_size = 2048*c - file_offset; break; 1.66 + case CUSTOM_MAGIC: /* custom.magic */ 1.67 + readsector(c); 1.68 + if (!strncmp(buffer, "#!boot", 6)) { 1.69 + file_size = 39; file_offset = 2048*c; 1.70 + }; break; 1.71 + case CUSTOM_APPEND: /* custom.append */ 1.72 + readsector(c); 1.73 + file_offset = 2048*c + 47; s = strstr(buffer, "append="); 1.74 + if (s) file_size = strchr(s,'\n') - s - 7; 1.75 + break; 1.76 + case CUSTOM_INITRD: /* custom.initrd */ 1.77 + readsector(c); 1.78 + s = strstr(buffer,"initrd:"); 1.79 + if (!s) break; 1.80 + file_size = atoi(s + 7); 1.81 + s = strchr(s,'\n') + 1; 1.82 + file_offset = 2048*c + (s - buffer); 1.83 + } 1.84 +} 1.85 + 1.86 +static void list(void) 1.87 +{ 1.88 + int num, heap = 0; 1.89 + 1.90 + for (num = 0; num < sizeof(files)/sizeof(files[0]); num++) { 1.91 + fileofs(num); 1.92 + if (file_size <= 0 || file_offset > 0x3FFFFFFFUL) continue; 1.93 + readsector(file_offset / 2048); 1.94 + if (WORD(buffer + file_offset % 2048) == 0) continue; 1.95 + if (file_offset > heap && (file_offset - heap) > 16) 1.96 + printf("%d free bytes in %04X..%04X\n", 1.97 + file_offset - heap, heap, file_offset); 1.98 + if (file_offset >= heap) heap = file_offset + file_size; 1.99 + printf("%s at %04X (%d bytes).\n", bootiso + files[num], 1.100 + file_offset, file_size); 1.101 + } 1.102 + file_offset=lseek(fd, 0UL, SEEK_END); 1.103 + if (file_offset > heap) 1.104 + printf("%d free bytes in %04X..%04X\n", 1.105 + file_offset - heap, heap, file_offset); 1.106 +} 1.107 + 1.108 +static void extract(char *name) 1.109 +{ 1.110 + int num; 1.111 + 1.112 + for (num = sizeof(files)/sizeof(files[0]) - 1; 1.113 + strcmp(name,bootiso + files[num]); num--) if (num <= 0) return; 1.114 + fileofs(num); 1.115 + if (file_size == 0) return; 1.116 + lseek(fd, file_offset, SEEK_SET); 1.117 + num = open(name, O_WRONLY|O_BINARY|O_CREAT, 0x644); 1.118 + while (file_size > 0) { 1.119 + int n = read(fd, buffer, BUFFERSZ); 1.120 + if (n <= 0) break; 1.121 + if (n > file_size) n = file_size; 1.122 + write(num,buffer,n); 1.123 + file_size -= n; 1.124 + } 1.125 + close(num); 1.126 +} 1.127 + 1.128 int main(int argc, char *argv[]) 1.129 { 1.130 int i; 1.131 char *s; 1.132 1.133 - while (argc > 2) { 1.134 + for (i = 0; argc > 2;) { 1.135 s = argv[1]; 1.136 if (*s != '-') break; 1.137 while (*s == '-') s++; 1.138 switch (*s | 0x20) { 1.139 case 'a' : append=argv[2]; break; 1.140 case 'i' : initrd=argv[2]; break; 1.141 + case 'r' : case 'l' : 1.142 + i++; argv++; argc--; continue; 1.143 } 1.144 argv += 2; 1.145 argc -= 2; 1.146 } 1.147 + if (i != 0) { 1.148 + fd = open(argv[i],O_RDONLY|O_BINARY); 1.149 + if (fd == -1) puts(bootiso + OPENERR); 1.150 + else if (argc <= 2) list(); 1.151 + else for (i = 2; i < argc; i++) extract(argv[i]); 1.152 + return 0; 1.153 + } 1.154 for (i = 2; i < argc; i++) { 1.155 char *s = argv[i]; 1.156 while ((unsigned)(*s - '-') <= ('/' - '-')) s++;