Virtual ISO: Improve portability of El Torito code

This commit is contained in:
RichardG867
2022-03-31 12:54:46 -03:00
parent b2f9368253
commit 27a6ff7c20

View File

@@ -42,7 +42,7 @@
memset(p, 0x00, n); \
p += n; \
}
#define VISO_TIME_VALID(t) (((t) != 0) && ((t) != ((time_t) -1)))
#define VISO_TIME_VALID(t) (((t) - 1) < ((time_t) -2))
/* ISO 9660 defines "both endian" data formats, which
are stored as little endian followed by big endian. */
@@ -673,7 +673,7 @@ viso_init(const char *dirname, int *error)
stat(dirname, &dir->stats);
if (!S_ISDIR(dir->stats.st_mode))
goto end;
dir->parent = dir; /* for path table filling */
dir->parent = dir; /* for the root's path table and .. entries */
cdrom_image_viso_log("[%08X] %s => [root]\n", dir, dir->path);
/* Traverse directories, starting with the root. */
@@ -963,7 +963,7 @@ next_dir:
/* Handle El Torito boot catalog. */
if (viso->eltorito_entry) {
/* Write a pointer to this boot catalog to the boot descriptor. */
*((uint32_t *) data) = ftello64(viso->tf.file) / viso->sector_size;
*((uint32_t *) data) = cpu_to_le32(ftello64(viso->tf.file) / viso->sector_size);
viso_pwrite(data, viso->eltorito_offset, 4, 1, viso->tf.file);
/* Fill boot catalog validation entry. */
@@ -982,8 +982,8 @@ next_dir:
/* Calculate checksum. */
uint16_t eltorito_checksum = 0;
for (int i = 0; i < (p - data); i += 2)
eltorito_checksum -= *((uint16_t *) &data[i]);
*((uint16_t *) &data[28]) = eltorito_checksum;
eltorito_checksum -= le16_to_cpu(*((uint16_t *) &data[i]));
*((uint16_t *) &data[28]) = cpu_to_le16(eltorito_checksum);
/* Now fill the default boot entry. */
*p++ = 0x88; /* bootable flag */
@@ -1045,10 +1045,7 @@ next_dir:
/* Write this table's sector offset to the corresponding volume descriptor. */
uint32_t pt_temp = pt_start / viso->sector_size;
if (i & 1)
*((uint32_t *) data) = cpu_to_be32(pt_temp);
else
*((uint32_t *) data) = cpu_to_le32(pt_temp);
*((uint32_t *) data) = (i & 1) ? cpu_to_be32(pt_temp) : cpu_to_le32(pt_temp);
viso_pwrite(data, viso->pt_meta_offsets[i >> 1] + 8 + (8 * (i & 1)), 4, 1, viso->tf.file);
/* Go through directories. */
@@ -1077,10 +1074,8 @@ next_dir:
data[1] = 0; /* extended attribute length */
*((uint32_t *) &data[2]) = 0; /* extent location (filled in later) */
if (i & 1) /* parent directory number */
*((uint16_t *) &data[6]) = cpu_to_be16(dir->parent->pt_idx);
else
*((uint16_t *) &data[6]) = cpu_to_le16(dir->parent->pt_idx);
*((uint16_t *) &data[6]) = (i & 1) ? cpu_to_be16(dir->parent->pt_idx) : cpu_to_le16(dir->parent->pt_idx); /* parent directory number */
if (dir == &viso->root_dir) /* directory ID */
data[8] = 0;
@@ -1253,11 +1248,11 @@ next_entry:
uint32_t boot_size = entry->stats.st_size;
if (boot_size % 512) /* round up */
boot_size += 512 - (boot_size % 512);
*((uint16_t *) &data[0]) = boot_size / 512;
*((uint16_t *) &data[0]) = cpu_to_le16(boot_size / 512);
} else { /* emulation */
*((uint16_t *) &data[0]) = 1;
*((uint16_t *) &data[0]) = cpu_to_le16(1);
}
*((uint32_t *) &data[2]) = viso->all_sectors;
*((uint32_t *) &data[2]) = cpu_to_le32(viso->all_sectors);
viso_pwrite(data, viso->eltorito_offset, 6, 1, viso->tf.file);
} else {
p = data;