int vhd_util_revert(int argc, char **argv) { char *name, *jname; vhd_journal_t journal; int c, err; name = NULL; jname = NULL; optind = 0; while ((c = getopt(argc, argv, "n:j:h")) != -1) { switch (c) { case 'n': name = optarg; break; case 'j': jname = optarg; break; case 'h': default: goto usage; } } if (!name || !jname || argc != optind) goto usage; libvhd_set_log_level(1); err = vhd_journal_open(&journal, name, jname); if (err) { printf("opening journal failed: %d\n", err); return err; } err = vhd_journal_revert(&journal); if (err) { printf("reverting journal failed: %d\n", err); vhd_journal_close(&journal); return err; } err = vhd_journal_remove(&journal); if (err) { printf("removing journal failed: %d\n", err); vhd_journal_close(&journal); return err; } return 0; usage: printf("options: <-n name> <-j journal> [-h help]\n"); return -EINVAL; }
int vhd_journal_create(vhd_journal_t *j, const char *file, const char *jfile) { int err; memset(j, 0, sizeof(vhd_journal_t)); j->jfd = -1; j->jname = strdup(jfile); if (j->jname == NULL) { err = -ENOMEM; goto fail1; } if (access(j->jname, F_OK) == 0) { err = vhd_test_file_fixed(j->jname, &j->is_block); if (err) goto fail1; if (!j->is_block) { err = -EEXIST; goto fail1; } } if (j->is_block) j->jfd = open(j->jname, O_LARGEFILE | O_RDWR, 0644); else j->jfd = open(j->jname, O_CREAT | O_TRUNC | O_LARGEFILE | O_RDWR, 0644); if (j->jfd == -1) { err = -errno; goto fail1; } err = vhd_open(&j->vhd, file, VHD_OPEN_RDWR | VHD_OPEN_STRICT); if (err) goto fail1; err = vhd_get_bat(&j->vhd); if (err) goto fail2; if (vhd_has_batmap(&j->vhd)) { err = vhd_get_batmap(&j->vhd); if (err) goto fail2; } err = vhd_journal_add_journal_header(j); if (err) goto fail2; err = vhd_journal_add_metadata(j); if (err) goto fail2; err = vhd_journal_disable_vhd(j); if (err) goto fail2; err = vhd_journal_sync(j); if (err) goto fail2; return 0; fail1: if (j->jfd != -1) { close(j->jfd); if (!j->is_block) unlink(j->jname); } free(j->jname); memset(j, 0, sizeof(vhd_journal_t)); return err; fail2: vhd_journal_remove(j); return err; }