vm: factor out embedded image detection code

db4
Joe Groff 2011-11-27 14:39:21 -08:00
parent 63c4bb40e3
commit 26226d460e
2 changed files with 11 additions and 6 deletions

View File

@ -219,6 +219,13 @@ void factor_vm::fixup_code(cell data_offset, cell code_offset)
code->allocator->iterate(updater,fixup); code->allocator->iterate(updater,fixup);
} }
bool factor_vm::read_embedded_image_footer(FILE *file, embedded_image_footer *footer)
{
safe_fseek(file, -(off_t)sizeof(embedded_image_footer), SEEK_END);
safe_fread(footer, (off_t)sizeof(embedded_image_footer), 1, file);
return footer->magic == image_magic;
}
FILE* factor_vm::open_image(vm_parameters *p) FILE* factor_vm::open_image(vm_parameters *p)
{ {
if (p->embedded_image) if (p->embedded_image)
@ -230,10 +237,8 @@ FILE* factor_vm::open_image(vm_parameters *p)
std::cout << strerror(errno) << std::endl; std::cout << strerror(errno) << std::endl;
exit(1); exit(1);
} }
safe_fseek(file, -sizeof(embedded_image_footer), SEEK_END);
embedded_image_footer footer; embedded_image_footer footer;
safe_fread(&footer, sizeof(embedded_image_footer), 1, file); if (!read_embedded_image_footer(file, &footer))
if (footer.magic != image_magic)
{ {
std::cout << "No embedded image" << std::endl; std::cout << "No embedded image" << std::endl;
exit(1); exit(1);
@ -373,11 +378,10 @@ bool factor_vm::embedded_image_p()
FILE *file = OPEN_READ(vm_path); FILE *file = OPEN_READ(vm_path);
if (!file) if (!file)
return false; return false;
safe_fseek(file, -sizeof(embedded_image_footer), SEEK_END);
embedded_image_footer footer; embedded_image_footer footer;
safe_fread(&footer, sizeof(embedded_image_footer), 1, file); bool embedded_p = read_embedded_image_footer(file, &footer);
fclose(file); fclose(file);
return footer.magic == image_magic; return embedded_p;
} }
} }

View File

@ -612,6 +612,7 @@ struct factor_vm
void fixup_code(cell data_offset, cell code_offset); void fixup_code(cell data_offset, cell code_offset);
FILE *open_image(vm_parameters *p); FILE *open_image(vm_parameters *p);
void load_image(vm_parameters *p); void load_image(vm_parameters *p);
bool read_embedded_image_footer(FILE *file, embedded_image_footer *footer);
bool embedded_image_p(); bool embedded_image_p();
// callstack // callstack