Support for patching isolinux images.

This commit is contained in:
Vreixo Formoso 2008-01-11 17:09:31 +01:00
parent 807c43b20e
commit 953da9ff8f
1 changed files with 89 additions and 6 deletions

View File

@ -740,7 +740,7 @@ int eltorito_writer_write_vol_desc(IsoImageWriter *writer)
struct ecma119_boot_rec_vol_desc vol;
if (writer == NULL) {
return ISO_MEM_ERROR;
return ISO_NULL_POINTER;
}
t = writer->target;
@ -758,10 +758,97 @@ int eltorito_writer_write_vol_desc(IsoImageWriter *writer)
return iso_write(t, &vol, sizeof(struct ecma119_boot_rec_vol_desc));
}
/**
* Patch an isolinux boot image.
*/
static
void patch_boot_image(uint8_t *buf, Ecma119Image *t, size_t imgsize)
{
struct boot_info_table *info;
uint32_t checksum;
size_t offset;
if (imgsize < 64) {
iso_msg_warn(t->image->messenger, LIBISO_ISOLINUX_CANT_PATCH,
"Isolinux image too small. We won't patch it.");
return;
}
memset(&info, 0, sizeof(info));
/* compute checksum, as the the sum of all 32 bit words in boot image
* from offset 64 */
checksum = 0;
offset = (size_t) 64;
while (offset <= imgsize - 4) {
checksum += iso_read_lsb(buf + offset, 4);
offset += 4;
}
if (offset != imgsize) {
/* file length not multiple of 4 */
iso_msg_warn(t->image->messenger, LIBISO_ISOLINUX_CANT_PATCH,
"Unexpected isolinux image length. Patch might not work.");
}
/* patch boot info table */
info = (struct boot_info_table*)(buf + 8);
memset(info, 0, sizeof(struct boot_info_table));
iso_lsb(info->bi_pvd, t->ms_block + 16, 4);
iso_lsb(info->bi_file, t->bootimg->block, 4);
iso_lsb(info->bi_length, imgsize, 4);
iso_lsb(info->bi_csum, checksum, 4);
}
static
int eltorito_writer_write_data(IsoImageWriter *writer)
{
/* nothing to do */
/*
* We have nothing to write, but if we need to patch an isolinux image,
* this is a good place to do so.
*/
Ecma119Image *t;
int ret;
if (writer == NULL) {
return ISO_NULL_POINTER;
}
t = writer->target;
if (t->catalog->image->isolinux) {
/* we need to patch the image */
size_t size;
uint8_t *buf;
IsoStream *new = NULL;
IsoStream *original = t->bootimg->stream;
size = (size_t) iso_stream_get_size(original);
buf = malloc(size);
if (buf == NULL) {
return ISO_MEM_ERROR;
}
ret = iso_stream_open(original);
if (ret < 0) {
return ret;
}
ret = iso_stream_read(original, buf, size);
iso_stream_close(original);
if (ret != size) {
return (ret < 0) ? ret : ISO_FILE_READ_ERROR;
}
/* ok, patch the read buffer */
patch_boot_image(buf, t, size);
/* replace the original stream with a memory stream that reads from
* the patched buffer */
ret = iso_memory_stream_new(buf, size, &new);
if (ret < 0) {
return ret;
}
t->bootimg->stream = new;
iso_stream_unref(original);
}
return ISO_SUCCESS;
}
@ -812,10 +899,6 @@ int eltorito_writer_create(Ecma119Image *target)
}
target->bootimg = src;
if (target->catalog->image->isolinux) {
// TODO
}
/* we need the bootable volume descriptor */
target->curblock++;
return ISO_SUCCESS;