Commit 153859be1a0928d07ec2dc2b18847e32e180ff43
Committed by
Blue Swirl
1 parent
3a2eeac0
Use hxtool for qemu-img command list
Use hxtool to generate the 'command syntax' section of qemu-img's help message, and the corresponding section of the texinfo documentation. This has the side-effect of adding 'check' to this list of commands in the texinfo documentation. Signed-off-by: Stuart Brady <stuart.brady@gmail.com>
Showing
5 changed files
with
101 additions
and
38 deletions
.gitignore
Makefile
@@ -238,6 +238,8 @@ libqemu_user.a: $(USER_OBJS) | @@ -238,6 +238,8 @@ libqemu_user.a: $(USER_OBJS) | ||
238 | 238 | ||
239 | ###################################################################### | 239 | ###################################################################### |
240 | 240 | ||
241 | +qemu-img.o: qemu-img-cmds.h | ||
242 | + | ||
241 | qemu-img$(EXESUF): qemu-img.o qemu-tool.o tool-osdep.o $(BLOCK_OBJS) | 243 | qemu-img$(EXESUF): qemu-img.o qemu-tool.o tool-osdep.o $(BLOCK_OBJS) |
242 | 244 | ||
243 | qemu-nbd$(EXESUF): qemu-nbd.o qemu-tool.o tool-osdep.o $(BLOCK_OBJS) | 245 | qemu-nbd$(EXESUF): qemu-nbd.o qemu-tool.o tool-osdep.o $(BLOCK_OBJS) |
@@ -246,6 +248,9 @@ qemu-io$(EXESUF): qemu-io.o qemu-tool.o tool-osdep.o cmd.o $(BLOCK_OBJS) | @@ -246,6 +248,9 @@ qemu-io$(EXESUF): qemu-io.o qemu-tool.o tool-osdep.o cmd.o $(BLOCK_OBJS) | ||
246 | 248 | ||
247 | qemu-img$(EXESUF) qemu-nbd$(EXESUF) qemu-io$(EXESUF): LIBS += -lz | 249 | qemu-img$(EXESUF) qemu-nbd$(EXESUF) qemu-io$(EXESUF): LIBS += -lz |
248 | 250 | ||
251 | +qemu-img-cmds.h: $(SRC_PATH)/qemu-img-cmds.hx | ||
252 | + $(call quiet-command,sh $(SRC_PATH)/hxtool -h < $< > $@," GEN $@") | ||
253 | + | ||
249 | clean: | 254 | clean: |
250 | # avoid old build problems by removing potentially incorrect old files | 255 | # avoid old build problems by removing potentially incorrect old files |
251 | rm -f config.mak config.h op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h | 256 | rm -f config.mak config.h op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h |
@@ -257,7 +262,7 @@ clean: | @@ -257,7 +262,7 @@ clean: | ||
257 | done | 262 | done |
258 | 263 | ||
259 | distclean: clean | 264 | distclean: clean |
260 | - rm -f config-host.mak config-host.h $(DOCS) qemu-options.texi | 265 | + rm -f config-host.mak config-host.h $(DOCS) qemu-options.texi qemu-img-cmds.texi |
261 | rm -f qemu-{doc,tech}.{info,aux,cp,dvi,fn,info,ky,log,pg,toc,tp,vr} | 266 | rm -f qemu-{doc,tech}.{info,aux,cp,dvi,fn,info,ky,log,pg,toc,tp,vr} |
262 | for d in $(TARGET_DIRS) libhw32 libhw64; do \ | 267 | for d in $(TARGET_DIRS) libhw32 libhw64; do \ |
263 | rm -rf $$d || exit 1 ; \ | 268 | rm -rf $$d || exit 1 ; \ |
@@ -335,13 +340,16 @@ qemu-options.texi: $(SRC_PATH)/qemu-options.hx | @@ -335,13 +340,16 @@ qemu-options.texi: $(SRC_PATH)/qemu-options.hx | ||
335 | qemu-monitor.texi: $(SRC_PATH)/qemu-monitor.hx | 340 | qemu-monitor.texi: $(SRC_PATH)/qemu-monitor.hx |
336 | $(call quiet-command,sh $(SRC_PATH)/hxtool -t < $< > $@," GEN $@") | 341 | $(call quiet-command,sh $(SRC_PATH)/hxtool -t < $< > $@," GEN $@") |
337 | 342 | ||
343 | +qemu-img-cmds.texi: $(SRC_PATH)/qemu-img-cmds.hx | ||
344 | + $(call quiet-command,sh $(SRC_PATH)/hxtool -t < $< > $@," GEN $@") | ||
345 | + | ||
338 | qemu.1: qemu-doc.texi qemu-options.texi qemu-monitor.texi | 346 | qemu.1: qemu-doc.texi qemu-options.texi qemu-monitor.texi |
339 | $(call quiet-command, \ | 347 | $(call quiet-command, \ |
340 | perl -Ww -- $(SRC_PATH)/texi2pod.pl $< qemu.pod && \ | 348 | perl -Ww -- $(SRC_PATH)/texi2pod.pl $< qemu.pod && \ |
341 | pod2man --section=1 --center=" " --release=" " qemu.pod > $@, \ | 349 | pod2man --section=1 --center=" " --release=" " qemu.pod > $@, \ |
342 | " GEN $@") | 350 | " GEN $@") |
343 | 351 | ||
344 | -qemu-img.1: qemu-img.texi | 352 | +qemu-img.1: qemu-img.texi qemu-img-cmds.texi |
345 | $(call quiet-command, \ | 353 | $(call quiet-command, \ |
346 | perl -Ww -- $(SRC_PATH)/texi2pod.pl $< qemu-img.pod && \ | 354 | perl -Ww -- $(SRC_PATH)/texi2pod.pl $< qemu-img.pod && \ |
347 | pod2man --section=1 --center=" " --release=" " qemu-img.pod > $@, \ | 355 | pod2man --section=1 --center=" " --release=" " qemu-img.pod > $@, \ |
@@ -359,7 +367,7 @@ dvi: qemu-doc.dvi qemu-tech.dvi | @@ -359,7 +367,7 @@ dvi: qemu-doc.dvi qemu-tech.dvi | ||
359 | 367 | ||
360 | html: qemu-doc.html qemu-tech.html | 368 | html: qemu-doc.html qemu-tech.html |
361 | 369 | ||
362 | -qemu-doc.dvi qemu-doc.html qemu-doc.info: qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-monitor.texi | 370 | +qemu-doc.dvi qemu-doc.html qemu-doc.info: qemu-img.texi qemu-nbd.texi qemu-options.texi qemu-monitor.texi qemu-img-cmds.texi |
363 | 371 | ||
364 | VERSION ?= $(shell cat VERSION) | 372 | VERSION ?= $(shell cat VERSION) |
365 | FILE = qemu-$(VERSION) | 373 | FILE = qemu-$(VERSION) |
qemu-img-cmds.hx
0 → 100644
1 | +HXCOMM Use DEFHEADING() to define headings in both help text and texi | ||
2 | +HXCOMM Text between STEXI and ETEXI are copied to texi version and | ||
3 | +HXCOMM discarded from C version | ||
4 | +HXCOMM DEF(command, callback, arg_string) is used to construct | ||
5 | +HXCOMM command structures and help message. | ||
6 | +HXCOMM HXCOMM can be used for comments, discarded from both texi and C | ||
7 | + | ||
8 | +STEXI | ||
9 | +@table @option | ||
10 | +STEXI | ||
11 | + | ||
12 | +DEF("check", img_check, | ||
13 | + "check [-f fmt] filename") | ||
14 | +STEXI | ||
15 | +@item check [-f @var{fmt}] @var{filename} | ||
16 | +ETEXI | ||
17 | + | ||
18 | +DEF("create", img_create, | ||
19 | + "create [-F fmt] [-b base_image] [-f fmt] [-o options] filename [size]") | ||
20 | +STEXI | ||
21 | +@item create [-F @var{base_fmt}] [-b @var{base_image}] [-f @var{fmt}] [-o @var{options}] @var{filename} [@var{size}] | ||
22 | +ETEXI | ||
23 | + | ||
24 | +DEF("commit", img_commit, | ||
25 | + "commit [-f fmt] filename") | ||
26 | +STEXI | ||
27 | +@item commit [-f @var{fmt}] @var{filename} | ||
28 | +ETEXI | ||
29 | + | ||
30 | +DEF("convert", img_convert, | ||
31 | + "convert [-c] [-f fmt] [-O output_fmt] [-o options] [-B output_base_image] filename [filename2 [...]] output_filename") | ||
32 | +STEXI | ||
33 | +@item convert [-c] [-f @var{fmt}] [-O @var{output_fmt}] [-o @var{options}] [-B @var{output_base_image}] @var{filename} [@var{filename2} [...]] @var{output_filename} | ||
34 | +ETEXI | ||
35 | + | ||
36 | +DEF("info", img_info, | ||
37 | + "info [-f fmt] filename") | ||
38 | +STEXI | ||
39 | +@item info [-f @var{fmt}] @var{filename} | ||
40 | +ETEXI | ||
41 | + | ||
42 | +DEF("snapshot", img_snapshot, | ||
43 | + "snapshot [-l | -a snapshot | -c snapshot | -d snapshot] filename") | ||
44 | +STEXI | ||
45 | +@item snapshot [-l | -a @var{snapshot} | -c @var{snapshot} | -d @var{snapshot}] @var{filename} | ||
46 | +@end table | ||
47 | +ETEXI |
qemu-img.c
@@ -31,6 +31,11 @@ | @@ -31,6 +31,11 @@ | ||
31 | #include <windows.h> | 31 | #include <windows.h> |
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | +typedef struct img_cmd_t { | ||
35 | + const char *name; | ||
36 | + int (*handler)(int argc, char **argv); | ||
37 | +} img_cmd_t; | ||
38 | + | ||
34 | /* Default to cache=writeback as data integrity is not important for qemu-tcg. */ | 39 | /* Default to cache=writeback as data integrity is not important for qemu-tcg. */ |
35 | #define BRDV_O_FLAGS BDRV_O_CACHE_WB | 40 | #define BRDV_O_FLAGS BDRV_O_CACHE_WB |
36 | 41 | ||
@@ -58,12 +63,11 @@ static void help(void) | @@ -58,12 +63,11 @@ static void help(void) | ||
58 | "QEMU disk image utility\n" | 63 | "QEMU disk image utility\n" |
59 | "\n" | 64 | "\n" |
60 | "Command syntax:\n" | 65 | "Command syntax:\n" |
61 | - " check [-f fmt] filename\n" | ||
62 | - " create [-F fmt] [-b base_image] [-f fmt] [-o options] filename [size]\n" | ||
63 | - " commit [-f fmt] filename\n" | ||
64 | - " convert [-c] [-f fmt] [-O output_fmt] [-o options] [-B output_base_image] filename [filename2 [...]] output_filename\n" | ||
65 | - " info [-f fmt] filename\n" | ||
66 | - " snapshot [-l | -a snapshot | -c snapshot | -d snapshot] filename\n" | 66 | +#define DEF(option, callback, arg_string) \ |
67 | + " " arg_string "\n" | ||
68 | +#include "qemu-img-cmds.h" | ||
69 | +#undef DEF | ||
70 | +#undef GEN_DOCS | ||
67 | "\n" | 71 | "\n" |
68 | "Command parameters:\n" | 72 | "Command parameters:\n" |
69 | " 'filename' is a disk image filename\n" | 73 | " 'filename' is a disk image filename\n" |
@@ -919,7 +923,7 @@ static int img_info(int argc, char **argv) | @@ -919,7 +923,7 @@ static int img_info(int argc, char **argv) | ||
919 | #define SNAPSHOT_APPLY 3 | 923 | #define SNAPSHOT_APPLY 3 |
920 | #define SNAPSHOT_DELETE 4 | 924 | #define SNAPSHOT_DELETE 4 |
921 | 925 | ||
922 | -static void img_snapshot(int argc, char **argv) | 926 | +static int img_snapshot(int argc, char **argv) |
923 | { | 927 | { |
924 | BlockDriverState *bs; | 928 | BlockDriverState *bs; |
925 | QEMUSnapshotInfo sn; | 929 | QEMUSnapshotInfo sn; |
@@ -936,18 +940,18 @@ static void img_snapshot(int argc, char **argv) | @@ -936,18 +940,18 @@ static void img_snapshot(int argc, char **argv) | ||
936 | switch(c) { | 940 | switch(c) { |
937 | case 'h': | 941 | case 'h': |
938 | help(); | 942 | help(); |
939 | - return; | 943 | + return 0; |
940 | case 'l': | 944 | case 'l': |
941 | if (action) { | 945 | if (action) { |
942 | help(); | 946 | help(); |
943 | - return; | 947 | + return 0; |
944 | } | 948 | } |
945 | action = SNAPSHOT_LIST; | 949 | action = SNAPSHOT_LIST; |
946 | break; | 950 | break; |
947 | case 'a': | 951 | case 'a': |
948 | if (action) { | 952 | if (action) { |
949 | help(); | 953 | help(); |
950 | - return; | 954 | + return 0; |
951 | } | 955 | } |
952 | action = SNAPSHOT_APPLY; | 956 | action = SNAPSHOT_APPLY; |
953 | snapshot_name = optarg; | 957 | snapshot_name = optarg; |
@@ -955,7 +959,7 @@ static void img_snapshot(int argc, char **argv) | @@ -955,7 +959,7 @@ static void img_snapshot(int argc, char **argv) | ||
955 | case 'c': | 959 | case 'c': |
956 | if (action) { | 960 | if (action) { |
957 | help(); | 961 | help(); |
958 | - return; | 962 | + return 0; |
959 | } | 963 | } |
960 | action = SNAPSHOT_CREATE; | 964 | action = SNAPSHOT_CREATE; |
961 | snapshot_name = optarg; | 965 | snapshot_name = optarg; |
@@ -963,7 +967,7 @@ static void img_snapshot(int argc, char **argv) | @@ -963,7 +967,7 @@ static void img_snapshot(int argc, char **argv) | ||
963 | case 'd': | 967 | case 'd': |
964 | if (action) { | 968 | if (action) { |
965 | help(); | 969 | help(); |
966 | - return; | 970 | + return 0; |
967 | } | 971 | } |
968 | action = SNAPSHOT_DELETE; | 972 | action = SNAPSHOT_DELETE; |
969 | snapshot_name = optarg; | 973 | snapshot_name = optarg; |
@@ -1021,31 +1025,38 @@ static void img_snapshot(int argc, char **argv) | @@ -1021,31 +1025,38 @@ static void img_snapshot(int argc, char **argv) | ||
1021 | 1025 | ||
1022 | /* Cleanup */ | 1026 | /* Cleanup */ |
1023 | bdrv_delete(bs); | 1027 | bdrv_delete(bs); |
1028 | + | ||
1029 | + return 0; | ||
1024 | } | 1030 | } |
1025 | 1031 | ||
1032 | +static const img_cmd_t img_cmds[] = { | ||
1033 | +#define DEF(option, callback, arg_string) \ | ||
1034 | + { option, callback }, | ||
1035 | +#include "qemu-img-cmds.h" | ||
1036 | +#undef DEF | ||
1037 | +#undef GEN_DOCS | ||
1038 | + { NULL, NULL, }, | ||
1039 | +}; | ||
1040 | + | ||
1026 | int main(int argc, char **argv) | 1041 | int main(int argc, char **argv) |
1027 | { | 1042 | { |
1028 | - const char *cmd; | 1043 | + const img_cmd_t *cmd; |
1044 | + const char *cmdname; | ||
1029 | 1045 | ||
1030 | bdrv_init(); | 1046 | bdrv_init(); |
1031 | if (argc < 2) | 1047 | if (argc < 2) |
1032 | help(); | 1048 | help(); |
1033 | - cmd = argv[1]; | 1049 | + cmdname = argv[1]; |
1034 | argc--; argv++; | 1050 | argc--; argv++; |
1035 | - if (!strcmp(cmd, "create")) { | ||
1036 | - img_create(argc, argv); | ||
1037 | - } else if (!strcmp(cmd, "check")) { | ||
1038 | - img_check(argc, argv); | ||
1039 | - } else if (!strcmp(cmd, "commit")) { | ||
1040 | - img_commit(argc, argv); | ||
1041 | - } else if (!strcmp(cmd, "convert")) { | ||
1042 | - img_convert(argc, argv); | ||
1043 | - } else if (!strcmp(cmd, "info")) { | ||
1044 | - img_info(argc, argv); | ||
1045 | - } else if (!strcmp(cmd, "snapshot")) { | ||
1046 | - img_snapshot(argc, argv); | ||
1047 | - } else { | ||
1048 | - help(); | 1051 | + |
1052 | + /* find the command */ | ||
1053 | + for(cmd = img_cmds; cmd->name != NULL; cmd++) { | ||
1054 | + if (!strcmp(cmdname, cmd->name)) { | ||
1055 | + return cmd->handler(argc, argv); | ||
1056 | + } | ||
1049 | } | 1057 | } |
1058 | + | ||
1059 | + /* not found */ | ||
1060 | + help(); | ||
1050 | return 0; | 1061 | return 0; |
1051 | } | 1062 | } |
qemu-img.texi
@@ -7,13 +7,8 @@ usage: qemu-img command [command options] | @@ -7,13 +7,8 @@ usage: qemu-img command [command options] | ||
7 | @c man begin OPTIONS | 7 | @c man begin OPTIONS |
8 | 8 | ||
9 | The following commands are supported: | 9 | The following commands are supported: |
10 | -@table @option | ||
11 | -@item create [-F @var{base_fmt}] [-b @var{base_image}] [-f @var{fmt}] [-o @var{options}] @var{filename} [@var{size}] | ||
12 | -@item commit [-f @var{fmt}] @var{filename} | ||
13 | -@item convert [-c] [-f @var{fmt}] [-O @var{output_fmt}] [-o @var{options}] [-B @var{output_base_image}] @var{filename} [@var{filename2} [...]] @var{output_filename} | ||
14 | -@item info [-f @var{fmt}] @var{filename} | ||
15 | -@item snapshot [-l | -a @var{snapshot} | -c @var{snapshot} | -d @var{snapshot}] @var{filename} | ||
16 | -@end table | 10 | + |
11 | +@include qemu-img-cmds.texi | ||
17 | 12 | ||
18 | Command parameters: | 13 | Command parameters: |
19 | @table @var | 14 | @table @var |