static int image_version_file(const char *input) { FILE *fcfg; int version; int ret; fcfg = fopen(input, "r"); if (!fcfg) { fprintf(stderr, "Could not open input file %s\n", input); return -1; } image_cfg = malloc(IMAGE_CFG_ELEMENT_MAX * sizeof(struct image_cfg_element)); if (!image_cfg) { fprintf(stderr, "Cannot allocate memory\n"); fclose(fcfg); return -1; } memset(image_cfg, 0, IMAGE_CFG_ELEMENT_MAX * sizeof(struct image_cfg_element)); rewind(fcfg); ret = image_create_config_parse(fcfg); fclose(fcfg); if (ret) { free(image_cfg); return -1; } version = image_get_version(); /* Fallback to version 0 is no version is provided in the cfg file */ if (version == -1) version = 0; free(image_cfg); return version; }
static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd, struct image_tool_params *params) { FILE *fcfg; void *image = NULL; int version; size_t headersz = 0; uint32_t checksum; int ret; int size; fcfg = fopen(params->imagename, "r"); if (!fcfg) { fprintf(stderr, "Could not open input file %s\n", params->imagename); exit(EXIT_FAILURE); } image_cfg = malloc(IMAGE_CFG_ELEMENT_MAX * sizeof(struct image_cfg_element)); if (!image_cfg) { fprintf(stderr, "Cannot allocate memory\n"); fclose(fcfg); exit(EXIT_FAILURE); } memset(image_cfg, 0, IMAGE_CFG_ELEMENT_MAX * sizeof(struct image_cfg_element)); rewind(fcfg); ret = image_create_config_parse(fcfg); fclose(fcfg); if (ret) { free(image_cfg); exit(EXIT_FAILURE); } /* The MVEBU BootROM does not allow non word aligned payloads */ sbuf->st_size = ALIGN_SUP(sbuf->st_size, 4); version = image_get_version(); switch (version) { /* * Fallback to version 0 if no version is provided in the * cfg file */ case -1: case 0: image = image_create_v0(&headersz, params, sbuf->st_size); break; case 1: image = image_create_v1(&headersz, params, sbuf->st_size); break; default: fprintf(stderr, "Unsupported version %d\n", version); free(image_cfg); exit(EXIT_FAILURE); } if (!image) { fprintf(stderr, "Could not create image\n"); free(image_cfg); exit(EXIT_FAILURE); } free(image_cfg); /* Build and add image checksum header */ checksum = cpu_to_le32(image_checksum32((uint32_t *)ptr, sbuf->st_size)); size = write(ifd, &checksum, sizeof(uint32_t)); if (size != sizeof(uint32_t)) { fprintf(stderr, "Error:%s - Checksum write %d bytes %s\n", params->cmdname, size, params->imagefile); exit(EXIT_FAILURE); } sbuf->st_size += sizeof(uint32_t); /* Finally copy the header into the image area */ memcpy(ptr, image, headersz); free(image); }
static int image_create(const char *input, const char *output, const char *payload, const char *bootmedia, uint32_t dstaddr, uint32_t execaddr, int verbose) { struct image_cfg_element *image_cfg; FILE *fcfg, *outputimg; void *image = NULL; int version; size_t imagesz; int cfgn; int ret; fcfg = fopen(input, "r"); if (!fcfg) { fprintf(stderr, "Could not open input file %s\n", input); return -1; } image_cfg = malloc(IMAGE_CFG_ELEMENT_MAX * sizeof(struct image_cfg_element)); if (!image_cfg) { fprintf(stderr, "Cannot allocate memory\n"); fclose(fcfg); return -1; } memset(image_cfg, 0, IMAGE_CFG_ELEMENT_MAX * sizeof(struct image_cfg_element)); rewind(fcfg); ret = image_create_config_parse(fcfg, image_cfg, &cfgn); if (ret) { free(image_cfg); return -1; } image_override_payload(image_cfg, &cfgn, payload); image_override_bootmedia(image_cfg, &cfgn, bootmedia); image_override_dstaddr(image_cfg, &cfgn, dstaddr); image_override_execaddr(image_cfg, &cfgn, execaddr); if (!image_find_option(image_cfg, cfgn, IMAGE_CFG_BOOT_FROM) || !image_find_option(image_cfg, cfgn, IMAGE_CFG_DEST_ADDR) || !image_find_option(image_cfg, cfgn, IMAGE_CFG_EXEC_ADDR)) { fprintf(stderr, "Missing information (either boot media, exec addr or dest addr)\n"); free(image_cfg); return -1; } if (verbose) image_dump_config(image_cfg, cfgn); version = image_get_version(image_cfg, cfgn); if (version == 0) image = image_create_v0(image_cfg, cfgn, output, &imagesz); else if (version == 1) image = image_create_v1(image_cfg, cfgn, output, &imagesz); else if (version == -1) { fprintf(stderr, "File %s does not have the VERSION field\n", input); free(image_cfg); return -1; } if (!image) { fprintf(stderr, "Could not create image\n"); free(image_cfg); return -1; } free(image_cfg); outputimg = fopen(output, "w"); if (!outputimg) { fprintf(stderr, "Cannot open output image %s for writing\n", output); free(image); return -1; } ret = fwrite(image, imagesz, 1, outputimg); if (ret != 1) { fprintf(stderr, "Cannot write to output image %s\n", output); fclose(outputimg); free(image); return -1; } fclose(outputimg); free(image); return 0; }