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++;