114 lines
3.0 KiB
Diff
114 lines
3.0 KiB
Diff
Index: xen-3.3.1-testing/tools/ioemu-remote/qemu-img.c
|
|
===================================================================
|
|
--- xen-3.3.1-testing.orig/tools/ioemu-remote/qemu-img.c
|
|
+++ xen-3.3.1-testing/tools/ioemu-remote/qemu-img.c
|
|
@@ -57,6 +57,7 @@ static void help(void)
|
|
" commit [-f fmt] filename\n"
|
|
" convert [-c] [-e] [-6] [-f fmt] [-O output_fmt] filename [filename2 [...]] output_filename\n"
|
|
" info [-f fmt] filename\n"
|
|
+ " snapshot [-l|-a snapshot|-d snapshot] filename\n"
|
|
"\n"
|
|
"Command parameters:\n"
|
|
" 'filename' is a disk image filename\n"
|
|
@@ -694,6 +695,91 @@ static int img_info(int argc, char **arg
|
|
return 0;
|
|
}
|
|
|
|
+#define SNAPSHOT_LIST 1
|
|
+#define SNAPSHOT_APPLY 2
|
|
+#define SNAPSHOT_DELETE 3
|
|
+
|
|
+static void img_snapshot(int argc, char **argv)
|
|
+{
|
|
+ BlockDriverState *bs;
|
|
+ char *filename, *snapshot_name = NULL;
|
|
+ char c;
|
|
+ int ret;
|
|
+ int action = 0;
|
|
+
|
|
+ /* Parse commandline parameters */
|
|
+ for(;;) {
|
|
+ c = getopt(argc, argv, "la:d:h");
|
|
+ if (c == -1)
|
|
+ break;
|
|
+ switch(c) {
|
|
+ case 'h':
|
|
+ help();
|
|
+ return;
|
|
+ case 'l':
|
|
+ if (action) {
|
|
+ help();
|
|
+ return;
|
|
+ }
|
|
+ action = SNAPSHOT_LIST;
|
|
+ break;
|
|
+ case 'a':
|
|
+ if (action) {
|
|
+ help();
|
|
+ return;
|
|
+ }
|
|
+ action = SNAPSHOT_APPLY;
|
|
+ snapshot_name = optarg;
|
|
+ break;
|
|
+ case 'd':
|
|
+ if (action) {
|
|
+ help();
|
|
+ return;
|
|
+ }
|
|
+ action = SNAPSHOT_DELETE;
|
|
+ snapshot_name = optarg;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (optind >= argc)
|
|
+ help();
|
|
+ filename = argv[optind++];
|
|
+
|
|
+ /* Open the image */
|
|
+ bs = bdrv_new("");
|
|
+ if (!bs)
|
|
+ error("Not enough memory");
|
|
+
|
|
+ if (bdrv_open2(bs, filename, 0, NULL) < 0) {
|
|
+ error("Could not open '%s'", filename);
|
|
+ }
|
|
+
|
|
+ /* Perform the requested action */
|
|
+ switch(action) {
|
|
+ case SNAPSHOT_LIST:
|
|
+ dump_snapshots(bs);
|
|
+ break;
|
|
+
|
|
+ case SNAPSHOT_APPLY:
|
|
+ ret = bdrv_snapshot_goto(bs, snapshot_name);
|
|
+ if (ret)
|
|
+ error("Could not apply snapshot '%s': %d (%s)",
|
|
+ snapshot_name, strerror(ret), ret);
|
|
+ break;
|
|
+
|
|
+ case SNAPSHOT_DELETE:
|
|
+ ret = bdrv_snapshot_delete(bs, snapshot_name);
|
|
+ if (ret)
|
|
+ error("Could not delete snapshot '%s': %d (%s)",
|
|
+ snapshot_name, strerror(ret), ret);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ /* Cleanup */
|
|
+ bdrv_delete(bs);
|
|
+}
|
|
+
|
|
int main(int argc, char **argv)
|
|
{
|
|
const char *cmd;
|
|
@@ -711,6 +797,8 @@ int main(int argc, char **argv)
|
|
img_convert(argc, argv);
|
|
} else if (!strcmp(cmd, "info")) {
|
|
img_info(argc, argv);
|
|
+ } else if (!strcmp(cmd, "snapshot")) {
|
|
+ img_snapshot(argc, argv);
|
|
} else {
|
|
help();
|
|
}
|