writeisofs: also boots plain binaries with -B

With -n -b file, a.out boot images can be used for CD booting;
with the new -n -B file option, plain binary (like bootxx_cd9660)
can be used instead.
Restore working the -h and -f options while there.
And add a new -F option for 2.8MB floppy image.
This commit is contained in:
Antoine Leca 2012-01-17 16:08:40 +01:00 committed by Ben Gras
parent 2ae897db7b
commit 3f2ab5b34b

View file

@ -115,9 +115,9 @@ struct bc_validation {
#define BOOTMEDIA_UNSPECIFIED -1
#define BOOTMEDIA_NONE 0
#define BOOTMEDIA_120M 1
#define BOOTMEDIA_144M 2
#define BOOTMEDIA_288M 3
#define BOOTMEDIA_1200K 1
#define BOOTMEDIA_1440K 2
#define BOOTMEDIA_2880K 3
#define BOOTMEDIA_HARDDISK 4
struct bc_initial {
@ -170,6 +170,7 @@ int n_reserved_pathtableentries = 0, n_used_pathtableentries = 0;
int bootmedia = BOOTMEDIA_UNSPECIFIED;
unsigned long bootseg = 0;
int system_type = 0;
int bootimage_is_aout = 0;
int get_system_type(int fd);
@ -785,13 +786,21 @@ writebootimage(char *bootimage, int bootfd, int fd, int *currentsector,
ssize_t written = 0, rest;
int virtuals, rem;
struct exec hdr;
struct stat sb;
struct bap {
off_t sector;
int length;
} bap[2];
bap[0].length = bap[0].sector = 0;
bap[1].length = bap[1].sector = 0;
if (fstat(bootfd, &sb) < 0) {
perror("stat boot image");
exit(1);
}
if (bootimage_is_aout) {
Read(bootfd, &hdr, A_MINHDR);
if(hdr.a_magic[0] != A_MAGIC0) {
@ -809,11 +818,26 @@ writebootimage(char *bootimage, int bootfd, int fd, int *currentsector,
/* copy text+data */
rem = hdr.a_text + hdr.a_data;
} else
rem = sb.st_size;
while(rem > 0) {
int want;
want = rem < sizeof(buf) ? rem : sizeof(buf);
Read(bootfd, buf, want);
if (written == 0) {
/* check some properties at beginning. */
if (!bootimage_is_aout && buf[0] == 1 && buf[1] == 3) {
fprintf(stderr, "boot image %s is an a.out executable\n",
bootimage);
exit(1);
}
if (rem >= VIRTUAL_SECTOR
&& (buf[510] != 0x55 || buf[511] != 0xaa) ) {
fprintf(stderr, "invalid boot sector (bad magic.)\n");
exit(1);
}
}
written += Write(fd, buf, want);
rem -= want;
}
@ -833,7 +857,7 @@ writebootimage(char *bootimage, int bootfd, int fd, int *currentsector,
exit(1);
}
fprintf(stderr, " * appended sector info: 0x%lx len 0x%lx\n",
fprintf(stderr, " * appended sector info: 0x%lx len 0x%x\n",
bap[0].sector, bap[0].length);
addr = buf;
@ -931,7 +955,7 @@ main(int argc, char *argv[])
return 1;
}
while ((ch = getopt(argc, argv, "a:b:s:Rb:hl:nf")) != -1) {
while ((ch = getopt(argc, argv, "a:b:B:s:Rb:hl:nfF")) != -1) {
switch(ch) {
case 's':
if(optarg[0] != '0' || optarg[1] != 'x') {
@ -948,7 +972,10 @@ main(int argc, char *argv[])
bootmedia= BOOTMEDIA_NONE;
break;
case 'f':
bootmedia= BOOTMEDIA_144M;
bootmedia= BOOTMEDIA_1440K;
break;
case 'F':
bootmedia= BOOTMEDIA_2880K;
break;
case 'a':
if(!(appendsectorinfo = strdup(optarg)))
@ -957,10 +984,13 @@ main(int argc, char *argv[])
case 'l':
label = optarg;
break;
case 'r':
case 'R':
remove_after = 1;
break;
case 'b':
bootimage_is_aout= 1;
/*FALLTHROUGH*/
case 'B':
bootimage = optarg;
if((bootfd = open(bootimage, O_RDONLY)) < 0) {
perror(bootimage);
@ -976,7 +1006,7 @@ main(int argc, char *argv[])
/* Args check */
if(argc != 2) {
fprintf(stderr, "usage: %s [-l <label>] [-b <bootimage> [-n] [-f] [-h] [-s <bootsegment>] [ -a <appendfile> ] <dir> <isofile>\n",
fprintf(stderr, "usage: %s [-l <label>] [-(b|B) <bootimage> [-n|-f|-F|-h] [-s <bootsegment>] [ -a <appendfile> ] <dir> <isofile>\n",
prog);
return 1;
}
@ -1175,8 +1205,8 @@ main(int argc, char *argv[])
writebootimage(bootimage, bootfd,
fd, &currentsector, appendsectorinfo, &root);
close(bootfd);
}
close(bootfd);
}
fprintf(stderr, " * all ok\n");