int parse_header(t_env *env, int fd) { unsigned short total_map_bytes; if (!is_valid_header(fd) || !read8(fd, &env->map_x) || !read8(fd, &env->map_y) || !read16(fd, &env->block_size) || !read16(fd, &total_map_bytes)) return (ft_error_retint("Invalid file!\n", 1)); env->player->pos_x = 7.0; env->player->pos_y = 7.0; return ((total_map_bytes != (env->map_x * env->map_y)) ? ft_error_retint("Invalid map sum\n", 1) : 0); }
/* Do some basic package checks. */ static int fip_dev_init(io_dev_info_t *dev_info, const uintptr_t init_params) { int result; unsigned int image_id = (unsigned int)init_params; uintptr_t backend_handle; fip_toc_header_t header; size_t bytes_read; /* Obtain a reference to the image by querying the platform layer */ result = plat_get_image_source(image_id, &backend_dev_handle, &backend_image_spec); if (result != 0) { WARN("Failed to obtain reference to image id=%u (%i)\n", image_id, result); result = -ENOENT; goto fip_dev_init_exit; } /* Attempt to access the FIP image */ result = io_open(backend_dev_handle, backend_image_spec, &backend_handle); if (result != 0) { WARN("Failed to access image id=%u (%i)\n", image_id, result); result = -ENOENT; goto fip_dev_init_exit; } result = io_read(backend_handle, (uintptr_t)&header, sizeof(header), &bytes_read); if (result == 0) { if (!is_valid_header(&header)) { WARN("Firmware Image Package header check failed.\n"); result = -ENOENT; } else { VERBOSE("FIP header looks OK.\n"); } } io_close(backend_handle); fip_dev_init_exit: return result; }
/* Do some basic package checks. */ static int fip_dev_init(io_dev_info_t *dev_info, const uintptr_t init_params) { int result = IO_FAIL; char *image_name = (char *)init_params; uintptr_t backend_handle; fip_toc_header_t header; size_t bytes_read; /* Obtain a reference to the image by querying the platform layer */ result = plat_get_image_source(image_name, &backend_dev_handle, &backend_image_spec); if (result != IO_SUCCESS) { WARN("Failed to obtain reference to image '%s' (%i)\n", image_name, result); result = IO_FAIL; goto fip_dev_init_exit; } /* Attempt to access the FIP image */ result = io_open(backend_dev_handle, backend_image_spec, &backend_handle); if (result != IO_SUCCESS) { WARN("Failed to access image '%s' (%i)\n", image_name, result); result = IO_FAIL; goto fip_dev_init_exit; } result = io_read(backend_handle, (uintptr_t)&header, sizeof(header), &bytes_read); if (result == IO_SUCCESS) { if (!is_valid_header(&header)) { WARN("Firmware Image Package header check failed.\n"); result = IO_FAIL; } else { INFO("FIP header looks OK.\n"); } } io_close(backend_handle); fip_dev_init_exit: return result; }
/* * This function will panic if errors occur when attempting to open an image * file. Now if only I could use exceptions to handle the errors in an elegant * fashion... */ int vmware3_image_t::open(const char * pathname) { COW_Header header; int file; int flags = O_RDWR; #ifdef O_BINARY flags |= O_BINARY; #endif // Set so close doesn't segfault, in case something goes wrong images = NULL; /* Open the virtual disk */ file = ::open(pathname, flags); if(file < 0) return -1; /* Read the header */ if(read_header(file, header) < 0) BX_PANIC(("unable to read vmware3 COW Disk header from file '%s'", pathname)); /* Make sure it's a valid header */ if(!is_valid_header(header)) BX_PANIC(("invalid vmware3 COW Disk image")); ::close(file); tlb_size = header.tlb_size_sectors * 512; slb_count = (1 << FL_SHIFT) / tlb_size; // we must have at least one chain unsigned count = header.number_of_chains; if (count < 1) count = 1; images = new COW_Image [count]; off_t offset = 0; for (unsigned i = 0; i < count; ++i) { char * filename = generate_cow_name(pathname, i); current = &images[i]; current->fd = ::open(filename, flags); if(current->fd < 0) BX_PANIC(("unable to open vmware3 COW Disk file '%s'", filename)); if(read_header(current->fd, current->header) < 0) BX_PANIC(("unable to read header or invalid header in vmware3 COW Disk file '%s'", filename)); if(!is_valid_header(current->header)) BX_PANIC(("invalid vmware3 COW Disk file '%s'", filename)); current->flb = new unsigned [current->header.flb_count]; if(current->flb == 0) BX_PANIC(("cannot allocate %d bytes for flb in vmware3 COW Disk '%s'", current->header.flb_count * 4, filename)); current->slb = new unsigned * [current->header.flb_count]; if(current->slb == 0) BX_PANIC(("cannot allocate %d bytes for slb in vmware3 COW Disk '%s'", current->header.flb_count * 4, filename)); unsigned j; for(j = 0; j < current->header.flb_count; ++j) { current->slb[j] = new unsigned [slb_count]; if(current->slb[j] == 0) BX_PANIC(("cannot allocate %d bytes for slb[] in vmware3 COW Disk '%s'", slb_count * 4, filename)); } current->tlb = new Bit8u [tlb_size]; if(current->tlb == 0) BX_PANIC(("cannot allocate %d bytes for tlb in vmware3 COW Disk '%s'", tlb_size, filename)); if(::lseek(current->fd, current->header.flb_offset_sectors * 512, SEEK_SET) < 0) BX_PANIC(("unable to seek vmware3 COW Disk file '%s'", filename)); if(read_ints(current->fd, current->flb, current->header.flb_count) < 0) BX_PANIC(("unable to read flb from vmware3 COW Disk file '%s'", filename)); for(j = 0; j < current->header.flb_count; ++j) if(current->flb[j] != 0) { if(::lseek(current->fd, current->flb[j] * 512, SEEK_SET) < 0) BX_PANIC(("unable to seek vmware3 COW Disk file '%s'", filename)); if(read_ints(current->fd, current->slb[j], slb_count) < 0) BX_PANIC(("unable to read slb from vmware3 COW Disk file '%s'", filename)); } current->min_offset = offset; offset += current->header.total_sectors * 512; current->max_offset = offset; current->offset = INVALID_OFFSET; current->synced = true; delete[] filename; } current = &images[0]; requested_offset = 0; if (header.total_sectors_in_disk!=0) { cylinders = header.cylinders_in_disk; heads = header.heads_in_disk; spt = header.sectors_in_disk; hd_size = header.total_sectors_in_disk * 512; } else { cylinders = header.cylinders; heads = header.heads; spt = header.sectors; hd_size = header.total_sectors * 512; } return 1; }