int cmd_mmc_restore_raw_partition(const char *partition, const char *filename) { mmc_scan_partitions(); const MmcPartition *p; p = mmc_find_partition_by_name(partition); if (p == NULL) return -1; return mmc_raw_copy(p, filename); }
int cmd_mmc_restore_raw_partition(const char *partition, const char *filename) { if (partition[0] != '/') { mmc_scan_partitions(); const MmcPartition *p; p = mmc_find_partition_by_name(partition); if (p == NULL) return -1; return mmc_raw_copy(p, filename); } else { return mmc_raw_dump_internal(filename, partition); } }
// write_raw_image(file, partition) Value* WriteRawImageFn(const char* name, State* state, int argc, Expr* argv[]) { char* result = NULL; char* partition; char* filename; if (ReadArgs(state, argv, 2, &filename, &partition) < 0) { return NULL; } if (strlen(partition) == 0) { ErrorAbort(state, "partition argument to %s can't be empty", name); goto done; } if (strlen(filename) == 0) { ErrorAbort(state, "file argument to %s can't be empty", name); goto done; } #ifdef BOARD_USES_BMLUTILS if (0 == write_raw_image(name, filename)) { result = partition; } result = strdup("Failure"); #else mtd_scan_partitions(); const MtdPartition* mtd = mtd_find_partition_by_name(partition); if (mtd == NULL) { fprintf(stderr, "%s: no mtd partition named \"%s\"\n", name, partition); result = strdup(""); goto MMC; } MtdWriteContext* ctx = mtd_write_partition(mtd); if (ctx == NULL) { fprintf(stderr, "%s: can't write mtd partition \"%s\"\n", name, partition); result = strdup(""); goto done; } bool success; FILE* f = fopen(filename, "rb"); if (f == NULL) { fprintf(stderr, "%s: can't open %s: %s\n", name, filename, strerror(errno)); result = strdup(""); goto done; } success = true; char* buffer = malloc(BUFSIZ); int read; while (success && (read = fread(buffer, 1, BUFSIZ, f)) > 0) { int wrote = mtd_write_data(ctx, buffer, read); success = success && (wrote == read); if (!success) { fprintf(stderr, "mtd_write_data to %s failed: %s\n", partition, strerror(errno)); } } free(buffer); fclose(f); if (mtd_erase_blocks(ctx, -1) == -1) { fprintf(stderr, "%s: error erasing blocks of %s\n", name, partition); } if (mtd_write_close(ctx) != 0) { fprintf(stderr, "%s: error closing write of %s\n", name, partition); } printf("%s %s partition from %s\n", success ? "wrote" : "failed to write", partition, filename); result = success ? partition : strdup(""); goto done; MMC: mmc_scan_partitions(); const MmcPartition* mmc = mmc_find_partition_by_name(partition); if (mmc == NULL) { fprintf(stderr, "%s: no mmc partition named \"%s\"\n", name, partition); result = strdup(""); goto done; } if (mmc_raw_copy(mmc, filename)) { fprintf(stderr, "%s: error erasing mmc partition named \"%s\"\n", name, partition); result = strdup(""); goto done; } result = partition; #endif done: if (result != partition) free(partition); free(filename); return StringValue(result); }