wok rev 18775
syslinux/isohybrid.exe: add -a & -i support
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Fri Jan 01 10:53:50 2016 +0100 (2016-01-01) |
parents | 816d2bd9090b |
children | c46b11485c8b |
files | syslinux/stuff/iso2exe/iso2exe.c syslinux/stuff/iso2exe/iso2exe.sh |
line diff
1.1 --- a/syslinux/stuff/iso2exe/iso2exe.c Fri Jan 01 10:37:57 2016 +0100 1.2 +++ b/syslinux/stuff/iso2exe/iso2exe.c Fri Jan 01 10:53:50 2016 +0100 1.3 @@ -9,11 +9,21 @@ 1.4 #ifdef WIN32 1.5 #include <windows.h> 1.6 #endif 1.7 +#ifdef __MSDOS__ 1.8 +#define ftruncate(a,b) 1.9 +#endif 1.10 +#ifdef __MINGW32__ 1.11 +#define ftruncate chsize 1.12 +#endif 1.13 +#if !defined(__MSDOS__) && !defined(WIN32) 1.14 +#define O_BINARY 0 1.15 +#endif 1.16 typedef unsigned char uint8_t; 1.17 typedef unsigned long uint32_t; 1.18 #include "iso2exe.h" 1.19 1.20 static int fd, forced, uninstall, status = 1; 1.21 +static char *append, *initrd; 1.22 static char tazlitoinfo[0x8000U - BOOTISOSZ]; 1.23 #define buffer tazlitoinfo 1.24 #define BUFFERSZ 2048 1.25 @@ -29,6 +39,12 @@ 1.26 } 1.27 } 1.28 1.29 +static unsigned long getcustomsector(void) 1.30 +{ 1.31 + readsector(16UL); 1.32 + return 16UL + LONG(buffer + 80); 1.33 +} 1.34 + 1.35 static int skipmd5 = 0; 1.36 #define ALIGN1 1.37 1.38 @@ -198,6 +214,12 @@ 1.39 */ 1.40 #define md5_end common64_end 1.41 1.42 +static int writenhash(void *buffer, size_t len) 1.43 +{ 1.44 + md5_hash(buffer, len); 1.45 + return write(fd, buffer, len); 1.46 +} 1.47 + 1.48 static void md5sum(void) 1.49 { 1.50 unsigned long sectors = 0; 1.51 @@ -249,7 +271,7 @@ 1.52 unsigned long size, catalog, lba; 1.53 int cylinders, i, j, isohybrid; 1.54 unsigned n; 1.55 -#ifndef WIN32 1.56 +#ifdef __MSDOS__ 1.57 for (bootiso = (char *) install; 1.58 bootiso[0] != 'M' || bootiso[1] != 'Z' || bootiso[2] != '\xEB'; 1.59 bootiso++) if (bootiso < (char *) install) { 1.60 @@ -266,20 +288,87 @@ 1.61 if (uninstall) { 1.62 struct { char check[sizeof(tazlitoinfo) - BUFFERSZ - 1024]; }; 1.63 readsector(0UL); 1.64 - n = BUFFERSZ; 1.65 + n = BUFFERSZ; /* fill with zeros */ 1.66 if (WORD(buffer) == 23117) { 1.67 + /* restore isolinux hybrid boot */ 1.68 readsector((unsigned long) buffer[417]); 1.69 - n = 0; 1.70 + n = 0; /* fill with hybrid boot */ 1.71 } 1.72 lseek(fd, 0UL, SEEK_SET); 1.73 for (i = 0; i < 32; i++, n = BUFFERSZ) { 1.74 write(fd, buffer + n, 1024); 1.75 } 1.76 + i = getcustomsector(); 1.77 + lseek(fd, i * 2048UL, SEEK_SET); 1.78 + for (;i % 512; i++) { 1.79 + /* clear custom config */ 1.80 + write(fd, buffer + 2048, 2048); 1.81 + } 1.82 + ftruncate(fd, i * 2048UL); 1.83 close(fd); 1.84 status = 0; 1.85 return UNINSTALLMSG; 1.86 } 1.87 1.88 + if (append || initrd) { 1.89 + unsigned long pos = getcustomsector() * 2048UL; 1.90 + lseek(fd, pos, SEEK_SET); 1.91 + write(fd, "#!boot 00000000000000000000000000000000\n", 40); 1.92 + md5_begin(); 1.93 + if (append) { 1.94 + writenhash("append=", 7); 1.95 + writenhash(append, strlen(append)); 1.96 + writenhash("\n", 1); 1.97 + } 1.98 + if (initrd) { 1.99 + char number[16], *p; 1.100 + unsigned long end, x; 1.101 + int data = open(initrd,O_RDONLY|O_BINARY); 1.102 + if (data == -1) 1.103 + return OPENINITRDERR; 1.104 + for (end = 0;; end += i) { 1.105 + i = read(data, buffer, BUFFERSZ); 1.106 + if (i <= 0) 1.107 + break; 1.108 + } 1.109 + p = number + sizeof(number) -1; 1.110 + x = end; *p-- = '\n'; 1.111 + do { 1.112 + *p-- = '0' + (x % 10); 1.113 + x /= 10; 1.114 + } while (x); 1.115 + if (*++p != '0') { 1.116 + writenhash("initrd:", 7); 1.117 + i = number - p + sizeof(number); 1.118 + writenhash(p, i); 1.119 + lseek(data, 0UL, SEEK_SET); 1.120 + do { 1.121 + i = read(data, buffer, BUFFERSZ); 1.122 + if (i <= 0) 1.123 + break; 1.124 + if (i > end) 1.125 + i = end; 1.126 + writenhash(buffer, i); 1.127 + end -= i; 1.128 + } while (end != 0); 1.129 + } 1.130 + close(data); 1.131 + } 1.132 + md5_end(); 1.133 + { 1.134 + static char h[] = "0123456789ABCDEF"; 1.135 + char string[32], *s = string + 30; 1.136 + unsigned char *p = (void *) hash; 1.137 + 1.138 + lseek(fd, 7 + pos, SEEK_SET); 1.139 + for (p += 15; s >= string; p--, s -= 2) { 1.140 + s[1] = h[ *p & 15 ]; 1.141 + s[0] = h[ *p >> 4 ]; 1.142 + } 1.143 + write(fd, string, 32); 1.144 + } 1.145 + } 1.146 + 1.147 if (forced == 0) { 1.148 status = 2; 1.149 /* Install hybridiso boot sector */ 1.150 @@ -354,6 +443,19 @@ 1.151 int main(int argc, char *argv[]) 1.152 { 1.153 int i; 1.154 + char *s; 1.155 + 1.156 + while (argc > 2) { 1.157 + s = argv[1]; 1.158 + if (*s != '-') break; 1.159 + while (*s == '-') s++; 1.160 + switch (*s | 0x20) { 1.161 + case 'a' : append=argv[2]; break; 1.162 + case 'i' : initrd=argv[2]; break; 1.163 + } 1.164 + argv += 2; 1.165 + argc -= 2; 1.166 + } 1.167 for (i = 2; i < argc; i++) { 1.168 char *s = argv[i]; 1.169 while ((unsigned)(*s - '-') <= ('/' - '-')) s++;
2.1 --- a/syslinux/stuff/iso2exe/iso2exe.sh Fri Jan 01 10:37:57 2016 +0100 2.2 +++ b/syslinux/stuff/iso2exe/iso2exe.sh Fri Jan 01 10:53:50 2016 +0100 2.3 @@ -184,7 +184,7 @@ 2.4 2.5 #define $(echo $name | tr '[a-z]' '[A-Z]')SZ $BOOTISOSZ 2.6 2.7 -#ifdef WIN32 2.8 +#ifndef __MSDOS__ 2.9 static char $name[] = { 2.10 /* head */ 2.11 $(hexdump -v -n $HSZ -e '" " 16/1 "0x%02X, "' -e '" // %04.4_ax |" 16/1 "%_p" "| \n"' $DATA | sed 's/ 0x ,/ /g') 2.12 @@ -257,7 +257,7 @@ 2.13 fi 2.14 done <<EOT 2.15 READSECTORERR Read sector failure. 2.16 -USAGE Usage: isohybrid.exe file.iso [--forced|--undo|--quick] 2.17 +USAGE Usage: isohybrid.exe [--append cmdline] [--initrd file] file.iso [--forced|--undo|--quick] 2.18 OPENERR Can't open r/w the iso file. 2.19 ELTORITOERR No EL TORITO SPECIFICATION signature. 2.20 CATALOGERR Invalid boot catalog. 2.21 @@ -266,6 +266,7 @@ 2.22 FORCEMSG You can add --forced to proceed anyway. 2.23 MD5MSG Computing md5sum... 2.24 UNINSTALLMSG Uninstall done. 2.25 +OPENINITRDERR Can't open the initrd file. 2.26 EOT 2.27 done 2.28 rm -rf $DATA