static int cmd_rmdir(const struct command *c, int argc, char *argv[]) { imgtoolerr_t err; imgtool_image *image = NULL; imgtool_partition *partition = NULL; int partition_index = 0; err = imgtool_image_open_byname(argv[0], argv[1], OSD_FOPEN_RW, &image); if (err) goto done; err = imgtool_partition_open(image, partition_index, &partition); if (err) goto done; err = imgtool_partition_delete_directory(partition, argv[2]); if (err) goto done; done: if (partition) imgtool_partition_close(partition); if (image) imgtool_image_close(image); if (err) reporterror(err, c, argv[0], argv[1], argv[2], NULL, NULL); return err ? -1 : 0; }
static int cmd_getall(const struct command *c, int argc, char *argv[]) { imgtoolerr_t err; imgtool_image *image = NULL; imgtool_partition *partition = NULL; imgtool_directory *imgenum = NULL; imgtool_dirent ent; filter_getinfoproc filter; int unnamedargs; const char *path = NULL; int arg; int partition_index = 0; err = imgtool_image_open_byname(argv[0], argv[1], OSD_FOPEN_READ, &image); if (err) goto done; err = imgtool_partition_open(image, partition_index, &partition); if (err) goto done; arg = 2; if ((argc > 2) && (argv[2][0] != '-')) { path = argv[arg++]; } unnamedargs = parse_options(argc, argv, arg, arg, NULL, &filter, NULL); if (unnamedargs < 0) goto done; err = imgtool_directory_open(partition, path, &imgenum); if (err) goto done; memset(&ent, 0, sizeof(ent)); while (((err = imgtool_directory_get_next(imgenum, &ent)) == 0) && !ent.eof) { fprintf(stdout, "Retrieving %s (%u bytes)\n", ent.filename, (unsigned int) ent.filesize); err = imgtool_partition_get_file(partition, ent.filename, NULL, NULL, filter); if (err) goto done; } done: if (imgenum) imgtool_directory_close(imgenum); if (partition) imgtool_partition_close(partition); if (image) imgtool_image_close(image); if (err) reporterror(err, c, argv[0], argv[1], NULL, NULL, NULL); return err ? -1 : 0; }
static int cmd_readsector(const struct command *c, int argc, char *argv[]) { imgtoolerr_t err; imgtool_image *img; imgtool_stream *stream = NULL; void *buffer = NULL; UINT32 size, track, head, sector; /* attempt to open image */ err = imgtool_image_open_byname(argv[0], argv[1], OSD_FOPEN_READ, &img); if (err) goto done; track = atoi(argv[2]); head = atoi(argv[3]); sector = atoi(argv[4]); err = imgtool_image_get_sector_size(img, track, head, sector, &size); if (err) goto done; buffer = malloc(size); if (!buffer) { err = IMGTOOLERR_OUTOFMEMORY; goto done; } err = imgtool_image_read_sector(img, track, head, sector, buffer, size); if (err) goto done; stream = stream_open(argv[5], OSD_FOPEN_WRITE); if (!stream) { err = (imgtoolerr_t)(IMGTOOLERR_FILENOTFOUND | IMGTOOLERR_SRC_NATIVEFILE); goto done; } stream_write(stream, buffer, size); done: if (buffer) free(buffer); if (stream) stream_close(stream); if (err) reporterror(err, c, argv[0], argv[1], NULL, NULL, 0); return err ? -1 : 0; }
static int cmd_readsector(const struct command *c, int argc, char *argv[]) { imgtoolerr_t err; imgtool_image *img; imgtool_stream *stream = nullptr; dynamic_buffer buffer; UINT32 size, track, head, sector; /* attempt to open image */ err = imgtool_image_open_byname(argv[0], argv[1], OSD_FOPEN_READ, &img); if (err) goto done; track = atoi(argv[2]); head = atoi(argv[3]); sector = atoi(argv[4]); err = imgtool_image_get_sector_size(img, track, head, sector, &size); if (err) goto done; buffer.resize(size); err = imgtool_image_read_sector(img, track, head, sector, &buffer[0], size); if (err) goto done; stream = stream_open(argv[5], OSD_FOPEN_WRITE); if (!stream) { err = (imgtoolerr_t)(IMGTOOLERR_FILENOTFOUND | IMGTOOLERR_SRC_NATIVEFILE); goto done; } stream_write(stream, &buffer[0], size); done: if (stream) stream_close(stream); if (err) reporterror(err, c, argv[0], argv[1], nullptr, nullptr, nullptr); return err ? -1 : 0; }
static int cmd_get(const struct command *c, int argc, char *argv[]) { imgtoolerr_t err; imgtool_image *image = NULL; imgtool_partition *partition = NULL; const char *filename; char *new_filename; int unnamedargs = 0; filter_getinfoproc filter; const char *fork; int partition_index = 0; err = imgtool_image_open_byname(argv[0], argv[1], OSD_FOPEN_READ, &image); if (err) goto done; err = imgtool_partition_open(image, partition_index, &partition); if (err) goto done; filename = interpret_filename(argv[2]); unnamedargs = parse_options(argc, argv, 3, 4, NULL, &filter, &fork); if (unnamedargs < 0) goto done; new_filename = (unnamedargs == 4) ? argv[3] : NULL; err = imgtool_partition_get_file(partition, filename, fork, new_filename, filter); if (err) goto done; err = IMGTOOLERR_SUCCESS; done: if (err) reporterror(err, c, argv[0], argv[1], argv[2], argv[3], NULL); if (partition) imgtool_partition_close(partition); if (image) imgtool_image_close(image); return (err || (unnamedargs < 0)) ? -1 : 0; }
static int cmd_dir(const struct command *c, int argc, char *argv[]) { imgtoolerr_t err; int total_count, total_size, freespace_err; UINT64 freespace; imgtool_image *image = NULL; imgtool_partition *partition = NULL; imgtool_directory *imgenum = NULL; imgtool_dirent ent; char buf[512]; char last_modified[19]; const char *path; int partition_index = 0; /* attempt to open image */ err = imgtool_image_open_byname(argv[0], argv[1], OSD_FOPEN_READ, &image); if (err) goto done; /* attempt to open partition */ err = imgtool_partition_open(image, partition_index, &partition); if (err) goto done; path = argc > 2 ? argv[2] : NULL; err = imgtool_directory_open(partition, path, &imgenum); if (err) goto done; memset(&ent, 0, sizeof(ent)); last_modified[0] = '\0'; total_count = 0; total_size = 0; fprintf(stdout, "Contents of %s:%s\n", argv[1], path ? path : ""); imgtool_image_info(image, buf, sizeof(buf)); if (buf[0]) fprintf(stdout, "%s\n", buf); fprintf(stdout, "------------------------------ -------- --------------- ------------------\n"); while (((err = imgtool_directory_get_next(imgenum, &ent)) == 0) && !ent.eof) { if (ent.directory) snprintf(buf, sizeof(buf), "<DIR>"); else snprintf(buf, sizeof(buf), "%u", (unsigned int) ent.filesize); if (ent.lastmodified_time != 0) strftime(last_modified, sizeof(last_modified), "%d-%b-%y %H:%M:%S", localtime(&ent.lastmodified_time)); if (ent.hardlink) strcat(ent.filename, " <hl>"); fprintf(stdout, "%-30s %8s %15s %18s\n", ent.filename, buf, ent.attr, last_modified); if (ent.softlink && ent.softlink[0] != '\0') fprintf(stdout, "-> %s\n", ent.softlink); if (ent.comment && ent.comment[0] != '\0') fprintf(stdout, ": %s\n", ent.comment); total_count++; total_size += ent.filesize; memset(&ent, 0, sizeof(ent)); } freespace_err = imgtool_partition_get_free_space(partition, &freespace); if (err) goto done; fprintf(stdout, "------------------------ ------ ---------------\n"); fprintf(stdout, "%8i File(s) %8i bytes\n", total_count, total_size); if (!freespace_err) fprintf(stdout, " %8u bytes free\n", (unsigned int) freespace); done: if (imgenum) imgtool_directory_close(imgenum); if (partition) imgtool_partition_close(partition); if (image) imgtool_image_close(image); if (err) reporterror(err, c, argv[0], argv[1], NULL, NULL, NULL); return err ? -1 : 0; }