// The update binary ask us to install a firmware file on reboot. Set // that up. Takes ownership of type and filename. static int handle_firmware_update(char* type, char* filename, ZipArchive* zip) { unsigned int data_size; const ZipEntry* entry = NULL; if (strncmp(filename, "PACKAGE:", 8) == 0) { entry = mzFindZipEntry(zip, filename+8); if (entry == NULL) { LOGE("Failed to find \"%s\" in package", filename+8); return INSTALL_ERROR; } data_size = entry->uncompLen; } else { struct stat st_data; if (stat(filename, &st_data) < 0) { LOGE("Error stat'ing %s: %s\n", filename, strerror(errno)); return INSTALL_ERROR; } data_size = st_data.st_size; } LOGI("type is %s; size is %d; file is %s\n", type, data_size, filename); char* data = malloc(data_size); if (data == NULL) { LOGI("Can't allocate %d bytes for firmware data\n", data_size); return INSTALL_ERROR; } if (entry) { if (mzReadZipEntry(zip, entry, data, data_size) == false) { LOGE("Failed to read \"%s\" from package", filename+8); return INSTALL_ERROR; } } else { FILE* f = fopen(filename, "rb"); if (f == NULL) { LOGE("Failed to open %s: %s\n", filename, strerror(errno)); return INSTALL_ERROR; } if (fread(data, 1, data_size, f) != data_size) { LOGE("Failed to read firmware data: %s\n", strerror(errno)); return INSTALL_ERROR; } fclose(f); } #ifndef BOARD_HAS_NO_MISC_PARTITION if (remember_firmware_update(type, data, data_size)) { LOGE("Can't store %s image\n", type); free(data); return INSTALL_ERROR; } #endif free(filename); return INSTALL_SUCCESS; }
// The update binary ask us to install a firmware file on reboot. Set // that up. Takes ownership of type and filename. static int handle_firmware_update(char* type, char* filename, ZipArchive* zip) { unsigned int data_size; const ZipEntry* entry = NULL; if (strncmp(filename, "PACKAGE:", 8) == 0) { entry = mzFindZipEntry(zip, filename+8); if (entry == NULL) { LOGE("从升级包中查找\"%s\"失败", filename+8); return INSTALL_ERROR; } data_size = entry->uncompLen; } else { struct stat st_data; if (stat(filename, &st_data) < 0) { LOGE("错误说明 %s: %s\n", filename, strerror(errno)); return INSTALL_ERROR; } data_size = st_data.st_size; } LOGI("类型:%s; 大小:%d; 文件:%s\n", type, data_size, filename); char* data = malloc(data_size); if (data == NULL) { LOGI("无法分配%d字节的固件数据\n", data_size); return INSTALL_ERROR; } if (entry) { if (mzReadZipEntry(zip, entry, data, data_size) == false) { LOGE("无法从升级包中读取\"%s\"", filename+8); return INSTALL_ERROR; } } else { FILE* f = fopen(filename, "rb"); if (f == NULL) { LOGE("无法打开 %s: %s\n", filename, strerror(errno)); return INSTALL_ERROR; } if (fread(data, 1, data_size, f) != data_size) { LOGE("无法读取固件数据: %s\n", strerror(errno)); return INSTALL_ERROR; } fclose(f); } if (remember_firmware_update(type, data, data_size)) { LOGE("无法存储镜像%s\n", type); free(data); return INSTALL_ERROR; } free(filename); return INSTALL_SUCCESS; }
/* write_radio_image <src-image> * write_hboot_image <src-image> * Doesn't actually take effect until the rest of installation finishes. */ static int cmd_write_firmware_image(const char *name, void *cookie, int argc, const char *argv[]) { UNUSED(cookie); CHECK_WORDS(); if (argc != 1) { LOGE("Command %s requires exactly one argument\n", name); return 1; } const char *type; if (!strcmp(name, "write_radio_image")) { type = "radio"; } else if (!strcmp(name, "write_hboot_image")) { type = "hboot"; } else { LOGE("Unknown firmware update command %s\n", name); return 1; } if (!is_package_root_path(argv[0])) { LOGE("Command %s: non-package image file \"%s\" not supported\n", name, argv[0]); return 1; } ui_print("Extracting %s image...\n", type); char path[PATH_MAX]; const ZipArchive *package; if (!translate_package_root_path(argv[0], path, sizeof(path), &package)) { LOGE("Command %s: bad source path \"%s\"\n", name, argv[0]); return 1; } const ZipEntry *entry = mzFindZipEntry(package, path); if (entry == NULL) { LOGE("Can't find %s\n", path); return 1; } // Load the update image into RAM. struct FirmwareContext context; context.total_bytes = mzGetZipEntryUncompLen(entry); context.done_bytes = 0; context.data = malloc(context.total_bytes); if (context.data == NULL) { LOGE("Can't allocate %d bytes for %s\n", context.total_bytes, argv[0]); return 1; } if (!mzProcessZipEntryContents(package, entry, firmware_fn, &context) || context.done_bytes != context.total_bytes) { LOGE("Can't read %s\n", argv[0]); free(context.data); return 1; } if (remember_firmware_update(type, context.data, context.total_bytes)) { LOGE("Can't store %s image\n", type); free(context.data); return 1; } return 0; }