static void write_firmware_file(const char* filename, struct firmware *f) { int fd; unsigned char* data; off_t size = 0; fd = open(filename, O_WRONLY | O_CREAT, 0644); if(fd < 0) { perror("Error while opening the firmware file"); return; } if(ftruncate(fd, 0) < 0) { perror("Error while deleting the firmware file"); close(fd); return; } write_firmware(f, &data, &size); if(write(fd, data, size) < 0) { perror("Error while writing the firmware file"); close(fd); return; } free(data); close(fd); }
int main(unsigned argc, char **argv) { struct ia_css_blob_info blob_original; const char *filename; if (argc != 2) { fprintf(stderr, "Incorrect number of arguments\n"); exit(1); } filename = argv[1]; /* verbose = (strcomp(argv[2], "verbose") == 0); */ verbose = true; blob_original = fill_header(); write_firmware(filename, &blob_original); return 0; }
static int flasher_flash(const char *serial, const char *rom_name) { libusb_context *ctx = NULL; libusb_device *device = NULL; libusb_device_handle *handle = NULL; int retval; FILE *f = NULL; retval = libusb_init(&ctx); if (retval != 0) { fprintf(stderr, "Error initializing libusb: %s\n", libusb_error_name(retval)); goto done; } switch (retval = flasher_find_matching_device( ctx, &device, &retval, ICDI_VID, ICDI_PID, serial)) { case FLASHER_SUCCESS: break; case FLASHER_ERR_LIBUSB_FAILURE: fprintf(stderr, "Error while matching ICDI devices: %s\n", libusb_error_name(retval)); goto done; case FLASHER_ERR_NO_DEVICES: fprintf(stderr, "Unable to find any ICDI devices\n"); goto done; case FLASHER_ERR_MULTIPLE_DEVICES: if (serial == NULL) fprintf(stderr, "Found multiple ICDI devices\n"); else fprintf(stderr, "Found ICDI serial number collision!\n"); goto done; } retval = libusb_open(device, &handle); if (retval != 0) { fprintf(stderr, "Error opening selected device: %s\n", libusb_error_name(retval)); goto done; } retval = libusb_claim_interface(handle, INTERFACE_NR); if (retval != 0) { fprintf(stderr, "Error claiming interface: %s\n", libusb_error_name(retval)); goto done; } f = fopen(rom_name, "rb"); if (!f) { perror("fopen"); retval = 1; goto done; } retval = write_firmware(handle, f); done: if (f) fclose(f); if (handle) libusb_close(handle); if (device) libusb_unref_device(device); if (ctx) libusb_exit(ctx); return retval; }