Make qemu-io commands available in the monitor
v2 cover Make qemu-io commands available in the monitor
This is a prerequisite for some kind of tests. It involves reorganising the qemu-io code so that the command part can be separated and doesn't pollute the global namespace any more, so we can link it with qemu.
v2:
- Drop the QMP command, make it HMP only
- Minor review comments like typos
Kevin Wolf (16):
qemu-io: Remove unused args_command
cutils: Support 'P' and 'E' suffixes in strtosz()
qemu-io: Make cvtnum() a wrapper around strtosz_suffix()
qemu-io: Handle cvtnum() errors in 'alloc'
qemu-io: Don't use global bs in command implementations
qemu-io: Split off commands to qemu-io-cmds.c
qemu-io: Factor out qemuio_command
qemu-io: Move 'help' function
qemu-io: Move 'quit' function
qemu-io: Move qemu_strsep() to cutils.c
qemu-io: Move functions for registering and running commands
qemu-io: Move command_loop() and friends
qemu-io: Move remaining helpers from cmd.c
qemu-io: Interface cleanup
qemu-io: Use the qemu version for -V
Make qemu-io commands available in HMP
Makefile | 2 +- Makefile.objs | 1 + cmd.c | 612 ------------- cmd.h | 79 -- hmp-commands.hx | 16 + hmp.c | 18 + hmp.h | 1 + include/qemu-common.h | 3 + include/qemu-io.h | 46 + monitor.c | 8 +- qemu-img.c | 10 +- qemu-io-cmds.c | 2118 ++++++++++++++++++++++++++++++++++++++++++++ qemu-io.c | 1990 ++++------------------------------------- tests/qemu-iotests/049.out | 8 +- util/cutils.c | 25 + 15 files changed, 2416 insertions(+), 2521 deletions(-) delete mode 100644 cmd.c delete mode 100644 cmd.h create mode 100644 include/qemu-io.h create mode 100644 qemu-io-cmds.c
Signature · 1 line
1.8.1.4
PATCH v2 1/16 qemu-io: Remove unused args_command
The original intention seems to be something with handling multiple images at once, but this has never been implemented and the only function ever registered is implemented to make everything behave like a "global" command. Just do that unconditionally now.
--- cmd.c | 28 ++-------------------------- cmd.h | 2 -- qemu-io.c | 10 ---------- 3 files changed, 2 insertions(+), 38 deletions(-)
cmd.c +2 -26
@@ -34,7 +34,6 @@cmdinfo_t *cmdtab;int ncmds; -static argsfunc_t args_func;static checkfunc_t check_func;static int ncmdline;static char **cmdline;
@@ -127,22 +126,6 @@ void add_user_command(char *optarg) cmdline[ncmdline-1 ] = optarg; } -static int -args_command ( -int index) -{ -if (args_func) -return args_func (index); -return 0 ; -} - -void -add_args_command ( -argsfunc_t af) -{ - args_func = af; -} -static void prep_fetchline (void *opaque) {int *fetchable = opaque;
@@ -155,7 +138,7 @@ static char *get_prompt(void);void command_loop (void ) { -int c, i, j =0 , done =0 , fetchable =0 , prompted =0 ; +int c, i, done =0 , fetchable =0 , prompted =0 ;char *input;char **v;const cmdinfo_t *ct;
@@ -171,14 +154,7 @@ void command_loop(void)if (c) { ct =find_command (v[0 ]);if (ct) { -if (ct->flags &CMD_FLAG_GLOBAL ) { - done =command (ct, c, v); - }else { - j =0 ; -while (!done && (j =args_command (j))) { - done =command (ct, c, v); - } - } + done =command (ct, c, v); }else {fprintf (stderr,_ ("command \"%s\" not found\n" ), v[0 ]); }
cmd.h +0 -2
@@ -41,12 +41,10 @@ extern int ncmds;void help_init (void );void quit_init (void ); -typedef int (*argsfunc_t )(int index);typedef int (*checkfunc_t )(const cmdinfo_t *ci);void add_command (const cmdinfo_t *ci);void add_user_command (char *optarg); -void add_args_command (argsfunc_t af);void add_check_command (checkfunc_t cf);const cmdinfo_t *find_command (const char *cmd);
qemu-io.c +0 -10
@@ -1888,15 +1888,6 @@ static int open_f(int argc, char **argv)return openfile (argv[optind], flags, growable); } -static int init_args_command (int index) -{ -/* only one device allowed so far */ -if (index >=1 ) { -return 0 ; - } -return ++index; -} -static int init_check_command (const cmdinfo_t *ct) {if (ct->flags &CMD_FLAG_GLOBAL ) {
@@ -2043,7 +2034,6 @@ int main(int argc, char **argv)add_command (&wait_break_cmd);add_command (&abort_cmd); -add_args_command (init_args_command);add_check_command (init_check_command);/* open the device */
Signature · 1 line
1.8.1.4
PATCH v2 2/16 cutils: Support 'P' and 'E' suffixes in strtosz()
In reply to Kevin Wolf--- include/qemu-common.h | 2 ++ monitor.c | 8 ++++---- qemu-img.c | 10 ++++++---- tests/qemu-iotests/049.out | 8 ++++---- util/cutils.c | 4 ++++ 5 files changed, 20 insertions(+), 12 deletions(-)
include/qemu-common.h +2 -0
@@ -191,6 +191,8 @@ int parse_uint_full(const char *s, unsigned long long *value, int base);* A-Z, as strtosz() will use qemu_toupper() on the given argument * prior to comparison. */ +#define STRTOSZ_DEFSUFFIX_EB 'E' +#define STRTOSZ_DEFSUFFIX_PB 'P'#define STRTOSZ_DEFSUFFIX_TB 'T'#define STRTOSZ_DEFSUFFIX_GB 'G'#define STRTOSZ_DEFSUFFIX_MB 'M'
monitor.c +4 -4
@@ -93,10 +93,10 @@* 'M' Non-negative target long (32 or 64 bit), in user mode the * value is multiplied by 2^20 (think Mebibyte) * 'o' octets (aka bytes) -* user mode accepts an optional T, t, G, g, M, m, K, k -* suffix, which multiplies the value by 2^40 for -* suffixes T and t, 2^30 for suffixes G and g, 2^20 for -* M and m, 2^10 for K and k +* user mode accepts an optional E, e, P, p, T, t, G, g, M, m, +* K, k suffix, which multiplies the value by 2^60 for suffixes E +* and e, 2^50 for suffixes P and p, 2^40 for suffixes T and t, +* 2^30 for suffixes G and g, 2^20 for M and m, 2^10 for K and k * 'T' double * user mode accepts an optional ms, us, ns suffix, * which divides the value by 1e3, 1e6, 1e9, respectively
qemu-img.c +6 -4
@@ -85,8 +85,9 @@ static void help(void)" options are: 'none', 'writeback' (default, except for convert), 'writethrough',\n" " 'directsync' and 'unsafe' (default for convert)\n" " 'size' is the disk image size in bytes. Optional suffixes\n" -" 'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M)\n" -" and T (terabyte, 1024G) are supported. 'b' is ignored.\n" +" 'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M),\n" +" 'T' (terabyte, 1024G), 'P' (petabyte, 1024T) and 'E' (exabyte, 1024P) are\n" +" supported. 'b' is ignored.\n" " 'output_filename' is the destination disk image filename\n" " 'output_fmt' is the destination format\n" " 'options' is a comma separated list of format specific options in a\n"
@@ -387,8 +388,9 @@ static int img_create(int argc, char **argv)error_report ("Image size must be less than 8 EiB!" ); }else {error_report ("Invalid image size specified! You may use k, M, " -"G or T suffixes for " ); -error_report ("kilobytes, megabytes, gigabytes and terabytes." ); +"G, T, P or E suffixes for " ); +error_report ("kilobytes, megabytes, gigabytes, terabytes, " +"petabytes and exabytes." ); }return 1 ; }
tests/qemu-iotests/049.out +4 -4
@@ -108,15 +108,15 @@ qemu-img: Formatting or formatting option not supported for file format 'qcow2' Formatting 'TEST_DIR/t.qcow2', fmt=qcow2 size=-1024 encryption=off cluster_size=65536 lazy_refcounts=off qemu-img create -f qcow2 TEST_DIR/t.qcow2 -- 1kilobyte -qemu-img: Invalid image size specified! You may use k, M, G or T suffixes for -qemu-img: kilobytes, megabytes, gigabytes and terabytes. +qemu-img: Invalid image size specified! You may use k, M, G, T, P or E suffixes for +qemu-img: kilobytes, megabytes, gigabytes, terabytes, petabytes and exabytes. qemu-img create -f qcow2 -o size=1kilobyte TEST_DIR/t.qcow2 Formatting 'TEST_DIR/t.qcow2', fmt=qcow2 size=1024 encryption=off cluster_size=65536 lazy_refcounts=off qemu-img create -f qcow2 TEST_DIR/t.qcow2 -- foobar -qemu-img: Invalid image size specified! You may use k, M, G or T suffixes for -qemu-img: kilobytes, megabytes, gigabytes and terabytes. +qemu-img: Invalid image size specified! You may use k, M, G, T, P or E suffixes for +qemu-img: kilobytes, megabytes, gigabytes, terabytes, petabytes and exabytes. qemu-img create -f qcow2 -o size=foobar TEST_DIR/t.qcow2 qemu-img: Parameter 'size' expects a size
util/cutils.c +4 -0
@@ -267,6 +267,10 @@ static int64_t suffix_mul(char suffix, int64_t unit)return unit * unit * unit;case STRTOSZ_DEFSUFFIX_TB :return unit * unit * unit * unit; +case STRTOSZ_DEFSUFFIX_PB : +return unit * unit * unit * unit * unit; +case STRTOSZ_DEFSUFFIX_EB : +return unit * unit * unit * unit * unit * unit; }return -1 ; }
Signature · 1 line
1.8.1.4
PATCH v2 3/16 qemu-io: Make cvtnum() a wrapper around strtosz_suffix()
In reply to Kevin WolfNo reason to implement the same thing multiple times. A nice side effect is that fractional numbers like 0.5M can be used in qemu-io now.
--- cmd.c | 37 ------------------------------------- cmd.h | 1 - qemu-io.c | 6 ++++++ 3 files changed, 6 insertions(+), 38 deletions(-)
cmd.c +0 -37
@@ -344,43 +344,6 @@ doneline(#define MEGABYTES (x) ((long long)(x) << 20)#define KILOBYTES (x) ((long long)(x) << 10) -long long -cvtnum ( -char *s) -{ -long long i; -char *sp; -int c; - - i =strtoll (s, &sp,0 ); -if (i ==0 && sp == s) -return -1LL ; -if (*sp =='\0' ) -return i; - -if (sp[1 ] !='\0' ) -return -1LL ; - - c =qemu_tolower (*sp); -switch (c) { -default : -return i; -case 'k' : -return KILOBYTES (i); -case 'm' : -return MEGABYTES (i); -case 'g' : -return GIGABYTES (i); -case 't' : -return TERABYTES (i); -case 'p' : -return PETABYTES (i); -case 'e' : -return EXABYTES (i); - } -return -1LL ; -} -#define TO_EXABYTES (x) ((x) / EXABYTES(1))#define TO_PETABYTES (x) ((x) / PETABYTES(1))#define TO_TERABYTES (x) ((x) / TERABYTES(1))
cmd.h +0 -1
@@ -58,7 +58,6 @@ char **breakline(char *input, int *count);void doneline (char *input,char **vec);char *fetchline (void ); -long long cvtnum (char *s);void cvtstr (double value,char *str,size_t sz);struct timeval tsub (struct timeval t1,struct timeval t2);
qemu-io.c +6 -0
@@ -29,6 +29,12 @@ static BlockDriverState *bs;static int misalign; +static int64_t cvtnum (const char *s) +{ +char *end; +return strtosz_suffix (s, &end,STRTOSZ_DEFSUFFIX_B ); +} +/* * Parse the pattern argument to various sub-commands. *
Signature · 1 line
1.8.1.4
PATCH v2 4/16 qemu-io: Handle cvtnum() errors in 'alloc'
In reply to Kevin Wolf--- qemu-io.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
qemu-io.c +8 -1
@@ -1596,7 +1596,10 @@ static int alloc_f(int argc, char **argv)int ret; offset =cvtnum (argv[1 ]); -if (offset &0x1ff ) { +if (offset <0 ) { +printf ("non-numeric offset argument -- %s\n" , argv[1 ]); +return 0 ; + }else if (offset &0x1ff ) {printf ("offset %" PRId64" is not sector aligned\n" , offset);return 0 ;
@@ -1604,6 +1607,10 @@ static int alloc_f(int argc, char **argv)if (argc ==3 ) { nb_sectors =cvtnum (argv[2 ]); +if (nb_sectors <0 ) { +printf ("non-numeric length argument -- %s\n" , argv[2 ]); +return 0 ; + } }else { nb_sectors =1 ; }
Signature · 1 line
1.8.1.4
PATCH v2 5/16 qemu-io: Don't use global bs in command implementations
In reply to Kevin WolfPass in the BlockDriverState to the command handlers instead of using the global variable. This is an important step to make the commands usable outside of qemu-io.
--- cmd.c | 6 ++- cmd.h | 8 ++- qemu-io.c | 167 ++++++++++++++++++++++++++++++++++---------------------------- 3 files changed, 101 insertions(+), 80 deletions(-)
cmd.c +4 -2
@@ -57,7 +57,7 @@ check_command( const cmdinfo_t *ci) {if (check_func) -return check_func (ci); +return check_func (qemuio_bs, ci);return 1 ; }
@@ -103,7 +103,7 @@ command(return 0 ; } optind =0 ; -return ct->cfunc (argc, argv); +return ct->cfunc (qemuio_bs, argc, argv); } const cmdinfo_t *
@@ -452,6 +452,7 @@ static cmdinfo_t quit_cmd;/* ARGSUSED */ static int quit_f ( +BlockDriverState *bs,int argc,char **argv) {
@@ -490,6 +491,7 @@ help_all(void)static int help_f ( +BlockDriverState *bs,int argc,char **argv) {
cmd.h +6 -2
@@ -17,9 +17,13 @@ #ifndef __COMMAND_H__ #define __COMMAND_H__ +#include "qemu-common.h" + #define CMD_FLAG_GLOBAL ((int)0x80000000) /* don't iterate "args" */ -typedef int (*cfunc_t)(int argc, char **argv); +extern BlockDriverState *qemuio_bs; + +typedef int (*cfunc_t)(BlockDriverState *bs, int argc, char **argv); typedef void (*helpfunc_t)(void); typedef struct cmdinfo {
@@ -41,7 +45,7 @@ extern int ncmds;void help_init (void );void quit_init (void ); -typedef int (*checkfunc_t )(const cmdinfo_t *ci); +typedef int (*checkfunc_t )(BlockDriverState *bs,const cmdinfo_t *ci);void add_command (const cmdinfo_t *ci);void add_user_command (char *optarg);
qemu-io.c +91 -76
567 lines not on this page · raw message
Signature · 1 line
1.8.1.4
PATCH v2 6/16 qemu-io: Split off commands to qemu-io-cmds.c
In reply to Kevin WolfThis is the implementation of all qemu-io commands that make sense to be called from the qemu monitor, i.e. everything except open, close and quit.
--- Makefile | 2 +- qemu-io-cmds.c | 1835 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ qemu-io.c | 1817 +------------------------------------------------------ 3 files changed, 1838 insertions(+), 1816 deletions(-) create mode 100644 qemu-io-cmds.c
Makefile +1 -1
@@ -186,7 +186,7 @@ qemu-img.o: qemu-img-cmds.h qemu-img$(EXESUF): qemu-img.o $(block-obj-y) libqemuutil.a libqemustub.a qemu-nbd$(EXESUF): qemu-nbd.o $(block-obj-y) libqemuutil.a libqemustub.a -qemu-io$(EXESUF): qemu-io.o cmd.o $(block-obj-y) libqemuutil.a libqemustub.a +qemu-io$(EXESUF): qemu-io.o qemu-io-cmds.o cmd.o $(block-obj-y) libqemuutil.a libqemustub.a qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o
qemu-io-cmds.c new file +1835 -0
1,835 lines not on this page · raw message
qemu-io.c +2 -1815
1,157 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Signature · 1 line
1.8.1.4
Part of the diff is not shown here. View the raw message.
PATCH v2 7/16 qemu-io: Factor out qemuio_command
In reply to Kevin WolfIt's duplicated code. Move it to qemu-io-cmds.c because it's not dependent on any static data of the qemu-io tool.
--- cmd.c | 43 +++++-------------------------------------- cmd.h | 3 ++- qemu-io-cmds.c | 24 ++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 39 deletions(-)
cmd.c +5 -38
@@ -138,28 +138,11 @@ static char *get_prompt(void);void command_loop (void ) { -int c, i, done =0 , fetchable =0 , prompted =0 ; +int i, done =0 , fetchable =0 , prompted =0 ;char *input; -char **v; -const cmdinfo_t *ct;for (i =0 ; !done && i < ncmdline; i++) { - input =strdup (cmdline[i]); -if (!input) { -fprintf (stderr,_ ("cannot strdup command '%s': %s\n" ), - cmdline[i],strerror (errno)); -exit (1 ); - } - v =breakline (input, &c); -if (c) { - ct =find_command (v[0 ]); -if (ct) { - done =command (ct, c, v); - }else { -fprintf (stderr,_ ("command \"%s\" not found\n" ), v[0 ]); - } - } -doneline (input, v); + done =qemuio_command (cmdline[i]); }if (cmdline) {g_free (cmdline);
@@ -179,20 +162,13 @@ void command_loop(void)if (!fetchable) {continue ; } + input =fetchline ();if (input ==NULL ) {break ; } - v =breakline (input, &c); -if (c) { - ct =find_command (v[0 ]); -if (ct) { - done =command (ct, c, v); - }else { -fprintf (stderr,_ ("command \"%s\" not found\n" ), v[0 ]); - } - } -doneline (input, v); + done =qemuio_command (input); +free (input); prompted =0 ; fetchable =0 ;
@@ -328,15 +304,6 @@ char **breakline(char *input, int *count)return rval; } -void -doneline ( -char *input, -char **vec) -{ -free (input); -free (vec); -} -#define EXABYTES (x) ((long long)(x) << 60)#define PETABYTES (x) ((long long)(x) << 50)#define TERABYTES (x) ((long long)(x) << 40)
cmd.h +2 -1
@@ -59,7 +59,6 @@ int command(const cmdinfo_t *ci, int argc, char **argv);/* from input.h */ char **breakline (char *input,int *count); -void doneline (char *input,char **vec);char *fetchline (void );void cvtstr (double value,char *str,size_t sz);
@@ -77,4 +76,6 @@ void timestr(struct timeval *tv, char *str, size_t sz, int flags);extern char *progname; +bool qemuio_command (const char *cmd); +#endif /* __COMMAND_H__ */
qemu-io-cmds.c +24 -0
@@ -1807,6 +1807,30 @@ static int init_check_command(BlockDriverState *bs, const cmdinfo_t *ct)return 1 ; } +bool qemuio_command (const char *cmd) +{ +char *input; +const cmdinfo_t *ct; +char **v; +int c; +bool done = false; + + input =g_strdup (cmd); + v =breakline (input, &c); +if (c) { + ct =find_command (v[0 ]); +if (ct) { + done =command (ct, c, v); + }else { +fprintf (stderr,"command \"%s\" not found\n" , v[0 ]); + } + } +g_free (input); +g_free (v); + +return done; +} +static void __attribute((constructor))init_qemuio_commands (void ) {/* initialize commands */
Signature · 1 line
1.8.1.4
PATCH v2 8/16 qemu-io: Move 'help' function
In reply to Kevin WolfNo reason to treat it different from other commands. Move it to qemu-io-cmds.c, adapt the coding style and register it like any other command.
--- cmd.c | 79 ---------------------------------------------------------- cmd.h | 1 - qemu-io-cmds.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 66 insertions(+), 81 deletions(-)
cmd.c +0 -79
@@ -439,82 +439,3 @@ quit_init(void)add_command (&quit_cmd); } - -/* from libxcmd/help.c */ - -static cmdinfo_t help_cmd; -static void help_onecmd (const char *cmd,const cmdinfo_t *ct); -static void help_oneline (const char *cmd,const cmdinfo_t *ct); - -static void -help_all (void ) -{ -const cmdinfo_t *ct; - -for (ct = cmdtab; ct < &cmdtab[ncmds]; ct++) -help_oneline (ct->name, ct); -printf (_ ("\nUse 'help commandname' for extended help.\n" )); -} - -static int -help_f ( -BlockDriverState *bs, -int argc, -char **argv) -{ -const cmdinfo_t *ct; - -if (argc ==1 ) { -help_all (); -return 0 ; - } - ct =find_command (argv[1 ]); -if (ct ==NULL ) { -printf (_ ("command %s not found\n" ), argv[1 ]); -return 0 ; - } -help_onecmd (argv[1 ], ct); -return 0 ; -} - -static void -help_onecmd ( -const char *cmd, -const cmdinfo_t *ct) -{ -help_oneline (cmd, ct); -if (ct->help) - ct->help (); -} - -static void -help_oneline ( -const char *cmd, -const cmdinfo_t *ct) -{ -if (cmd) -printf ("%s " , cmd); -else { -printf ("%s " , ct->name); -if (ct->altname) -printf ("(or %s) " , ct->altname); - } -if (ct->args) -printf ("%s " , ct->args); -printf ("-- %s\n" , ct->oneline); -} - -void -help_init (void ) -{ - help_cmd.name =_ ("help" ); - help_cmd.altname =_ ("?" ); - help_cmd.cfunc = help_f; - help_cmd.argmin =0 ; - help_cmd.argmax =1 ; - help_cmd.flags =CMD_FLAG_GLOBAL ; - help_cmd.args =_ ("[command]" ); - help_cmd.oneline =_ ("help for one or all commands" ); - -add_command (&help_cmd); -}
cmd.h +0 -1
@@ -42,7 +42,6 @@ typedef struct cmdinfo {extern cmdinfo_t *cmdtab;extern int ncmds; -void help_init (void );void quit_init (void );typedef int (*checkfunc_t )(BlockDriverState *bs,const cmdinfo_t *ci);
qemu-io-cmds.c +66 -1
79 lines not on this page · raw message
Signature · 1 line
1.8.1.4
PATCH v2 9/16 qemu-io: Move 'quit' function
In reply to Kevin WolfThis one only makes sense in the context of the qemu-io tool, so move it to qemu-io.c. Adapt coding style and register it like other commands.
--- cmd.c | 29 ----------------------------- cmd.h | 2 -- qemu-io.c | 17 ++++++++++++++++- 3 files changed, 16 insertions(+), 32 deletions(-)
cmd.c +0 -29
@@ -410,32 +410,3 @@ timestr(snprintf (ts, size,"0.%04u sec" , (unsigned int ) (usec *10000 )); } } - - -/* from libxcmd/quit.c */ - -static cmdinfo_t quit_cmd; - -/* ARGSUSED */ -static int -quit_f ( -BlockDriverState *bs, -int argc, -char **argv) -{ -return 1 ; -} - -void -quit_init (void ) -{ - quit_cmd.name =_ ("quit" ); - quit_cmd.altname =_ ("q" ); - quit_cmd.cfunc = quit_f; - quit_cmd.argmin =-1 ; - quit_cmd.argmax =-1 ; - quit_cmd.flags =CMD_FLAG_GLOBAL ; - quit_cmd.oneline =_ ("exit the program" ); - -add_command (&quit_cmd); -}
cmd.h +0 -2
@@ -42,8 +42,6 @@ typedef struct cmdinfo {extern cmdinfo_t *cmdtab;extern int ncmds; -void quit_init (void ); -typedef int (*checkfunc_t )(BlockDriverState *bs,const cmdinfo_t *ci);void add_command (const cmdinfo_t *ci);
qemu-io.c +16 -1
@@ -137,6 +137,21 @@ static int open_f(BlockDriverState *bs, int argc, char **argv)return openfile (argv[optind], flags, growable); } +static int quit_f (BlockDriverState *bs,int argc,char **argv) +{ +return 1 ; +} + +static const cmdinfo_t quit_cmd = { + .name ="quit" , + .altname ="q" , + .cfunc = quit_f, + .argmin =-1 , + .argmax =-1 , + .flags =CMD_FLAG_GLOBAL , + .oneline ="exit the program" , +}; +static void usage (const char *name) { printf(
@@ -247,7 +262,7 @@ int main(int argc, char **argv)bdrv_init ();/* initialize commands */ -quit_init (); +add_command (&quit_cmd);add_command (&open_cmd);add_command (&close_cmd);
Signature · 1 line
1.8.1.4
PATCH v2 10/16 qemu-io: Move qemu_strsep() to cutils.c
In reply to Kevin Wolf--- cmd.c | 21 --------------------- include/qemu-common.h | 1 + util/cutils.c | 21 +++++++++++++++++++++ 3 files changed, 22 insertions(+), 21 deletions(-)
cmd.c +0 -21
@@ -255,27 +255,6 @@ fetchline(void) }#endif -static char *qemu_strsep (char **input,const char *delim) -{ -char *result = *input; -if (result !=NULL ) { -char *p; - -for (p = result; *p !='\0' ; p++) { -if (strchr (delim, *p)) { -break ; - } - } -if (*p =='\0' ) { - *input =NULL ; - }else { - *p ='\0' ; - *input = p +1 ; - } - } -return result; -} -char **breakline (char *input,int *count) {int c =0 ;
include/qemu-common.h +1 -0
@@ -174,6 +174,7 @@ char *pstrcat(char *buf, int buf_size, const char *s);int strstart (const char *str,const char *val,const char **ptr);int stristart (const char *str,const char *val,const char **ptr);int qemu_strnlen (const char *s,int max_len); +char *qemu_strsep (char **input,const char *delim);time_t mktimegm (struct tm *tm);int qemu_fls (int i);int qemu_fdatasync (int fd);
util/cutils.c +21 -0
@@ -107,6 +107,27 @@ int qemu_strnlen(const char *s, int max_len)return i; } +char *qemu_strsep (char **input,const char *delim) +{ +char *result = *input; +if (result !=NULL ) { +char *p; + +for (p = result; *p !='\0' ; p++) { +if (strchr (delim, *p)) { +break ; + } + } +if (*p =='\0' ) { + *input =NULL ; + }else { + *p ='\0' ; + *input = p +1 ; + } + } +return result; +} +time_t mktimegm (struct tm *tm) {time_t t;
Signature · 1 line
1.8.1.4
PATCH v2 11/16 qemu-io: Move functions for registering and running commands
In reply to Kevin Wolf--- cmd.c | 113 --------------------------------- cmd.h | 11 +--- qemu-io-cmds.c | 192 ++++++++++++++++++++++++++++++++++++++++++--------------- qemu-io.c | 10 +-- 4 files changed, 148 insertions(+), 178 deletions(-)
cmd.c +0 -113
@@ -31,94 +31,9 @@/* from libxcmd/command.c */ -cmdinfo_t *cmdtab; -int ncmds; - -static checkfunc_t check_func;static int ncmdline;static char **cmdline; -static int -compare (const void *a,const void *b) -{ -return strcmp (((const cmdinfo_t *)a)->name, - ((const cmdinfo_t *)b)->name); -} - -void add_command (const cmdinfo_t *ci) -{ - cmdtab =g_realloc ((void *)cmdtab, ++ncmds *sizeof (*cmdtab)); - cmdtab[ncmds -1 ] = *ci; -qsort (cmdtab, ncmds,sizeof (*cmdtab), compare); -} - -static int -check_command ( -const cmdinfo_t *ci) -{ -if (check_func) -return check_func (qemuio_bs, ci); -return 1 ; -} - -void -add_check_command ( -checkfunc_t cf) -{ - check_func = cf; -} - -int -command_usage ( -const cmdinfo_t *ci) -{ -printf ("%s %s -- %s\n" , ci->name, ci->args, ci->oneline); -return 0 ; -} - -int -command ( -const cmdinfo_t *ct, -int argc, -char **argv) -{ -char *cmd = argv[0 ]; - -if (!check_command (ct)) -return 0 ; - -if (argc-1 < ct->argmin || (ct->argmax !=-1 && argc-1 > ct->argmax)) { -if (ct->argmax ==-1 ) -fprintf (stderr, -_ ("bad argument count %d to %s, expected at least %d arguments\n" ), - argc-1 , cmd, ct->argmin); -else if (ct->argmin == ct->argmax) -fprintf (stderr, -_ ("bad argument count %d to %s, expected %d arguments\n" ), - argc-1 , cmd, ct->argmin); -else -fprintf (stderr, -_ ("bad argument count %d to %s, expected between %d and %d arguments\n" ), - argc-1 , cmd, ct->argmin, ct->argmax); -return 0 ; - } - optind =0 ; -return ct->cfunc (qemuio_bs, argc, argv); -} - -const cmdinfo_t * -find_command ( -const char *cmd) -{ -cmdinfo_t *ct; - -for (ct = cmdtab; ct < &cmdtab[ncmds]; ct++) { -if (strcmp (ct->name, cmd) ==0 || - (ct->altname &&strcmp (ct->altname, cmd) ==0 )) -return (const cmdinfo_t *)ct; - } -return NULL ; -}void add_user_command (char *optarg) {
@@ -255,34 +170,6 @@ fetchline(void) }#endif -char **breakline (char *input,int *count) -{ -int c =0 ; -char *p; -char **rval =calloc (sizeof (char *),1 ); -char **tmp; - -while (rval && (p =qemu_strsep (&input," " )) !=NULL ) { -if (!*p) { -continue ; - } - c++; - tmp =realloc (rval,sizeof (*rval) * (c +1 )); -if (!tmp) { -free (rval); - rval =NULL ; - c =0 ; -break ; - }else { - rval = tmp; - } - rval[c -1 ] = p; - rval[c] =NULL ; - } - *count = c; -return rval; -} -#define EXABYTES (x) ((long long)(x) << 60)#define PETABYTES (x) ((long long)(x) << 50)#define TERABYTES (x) ((long long)(x) << 40)
cmd.h +2 -9
@@ -39,23 +39,16 @@ typedef struct cmdinfo {helpfunc_t help; } cmdinfo_t; -extern cmdinfo_t *cmdtab; -extern int ncmds; -typedef int (*checkfunc_t )(BlockDriverState *bs,const cmdinfo_t *ci); -void add_command (const cmdinfo_t *ci); +void qemuio_add_command (const cmdinfo_t *ci);void add_user_command (char *optarg);void add_check_command (checkfunc_t cf); -const cmdinfo_t *find_command (const char *cmd); -void command_loop (void ); -int command_usage (const cmdinfo_t *ci); -int command (const cmdinfo_t *ci,int argc,char **argv); +int qemuio_command_usage (const cmdinfo_t *ci);/* from input.h */ -char **breakline (char *input,int *count);char *fetchline (void );void cvtstr (double value,char *str,size_t sz);
qemu-io-cmds.c +141 -51
296 lines not on this page · raw message
qemu-io.c +5 -5
@@ -122,7 +122,7 @@ static int open_f(BlockDriverState *bs, int argc, char **argv) growable =1 ;break ;default : -return command_usage (&open_cmd); +return qemuio_command_usage (&open_cmd); } }
@@ -131,7 +131,7 @@ static int open_f(BlockDriverState *bs, int argc, char **argv) }if (optind != argc -1 ) { -return command_usage (&open_cmd); +return qemuio_command_usage (&open_cmd); }return openfile (argv[optind], flags, growable);
@@ -262,9 +262,9 @@ int main(int argc, char **argv)bdrv_init ();/* initialize commands */ -add_command (&quit_cmd); -add_command (&open_cmd); -add_command (&close_cmd); +qemuio_add_command (&quit_cmd); +qemuio_add_command (&open_cmd); +qemuio_add_command (&close_cmd);/* open the device */ if (!readonly) {
Signature · 1 line
1.8.1.4
PATCH v2 12/16 qemu-io: Move command_loop() and friends
In reply to Kevin Wolf--- cmd.c | 139 -------------------------------------------------------------- cmd.h | 9 ---- qemu-io.c | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 148 deletions(-)
cmd.c +0 -139
@@ -31,145 +31,6 @@/* from libxcmd/command.c */ -static int ncmdline; -static char **cmdline; - - -void add_user_command (char *optarg) -{ - cmdline =g_realloc (cmdline, ++ncmdline *sizeof (char *)); - cmdline[ncmdline-1 ] = optarg; -} - -static void prep_fetchline (void *opaque) -{ -int *fetchable = opaque; - -qemu_set_fd_handler (STDIN_FILENO ,NULL ,NULL ,NULL ); - *fetchable=1 ; -} - -static char *get_prompt (void ); - -void command_loop (void ) -{ -int i, done =0 , fetchable =0 , prompted =0 ; -char *input; - -for (i =0 ; !done && i < ncmdline; i++) { - done =qemuio_command (cmdline[i]); - } -if (cmdline) { -g_free (cmdline); -return ; - } - -while (!done) { -if (!prompted) { -printf ("%s" ,get_prompt ()); -fflush (stdout); -qemu_set_fd_handler (STDIN_FILENO , prep_fetchline,NULL , &fetchable); - prompted =1 ; - } - -main_loop_wait (false); - -if (!fetchable) { -continue ; - } - - input =fetchline (); -if (input ==NULL ) { -break ; - } - done =qemuio_command (input); -free (input); - - prompted =0 ; - fetchable =0 ; - } -qemu_set_fd_handler (STDIN_FILENO ,NULL ,NULL ,NULL ); -} - -/* from libxcmd/input.c */ - -#if defined(ENABLE_READLINE ) -# include <readline/history.h> -# include <readline/readline.h> -#elif defined(ENABLE_EDITLINE ) -# include <histedit.h> -#endif - -static char * -get_prompt (void ) -{ -static char prompt[FILENAME_MAX +2 /*"> "*/ +1 /*"\0"*/ ]; - -if (!prompt[0 ]) -snprintf (prompt,sizeof (prompt),"%s> " , progname); -return prompt; -} - -#if defined(ENABLE_READLINE ) -char * -fetchline (void ) -{ -char *line; - - line =readline (get_prompt ()); -if (line && *line) -add_history (line); -return line; -} -#elif defined(ENABLE_EDITLINE ) -static char *el_get_prompt (EditLine *e) {return get_prompt (); } -char * -fetchline (void ) -{ -static EditLine *el; -static History *hist; -HistEvent hevent; -char *line; -int count; - -if (!el) { - hist =history_init (); -history (hist, &hevent,H_SETSIZE ,100 ); - el =el_init (progname, stdin, stdout, stderr); -el_source (el,NULL ); -el_set (el,EL_SIGNAL ,1 ); -el_set (el,EL_PROMPT , el_get_prompt); -el_set (el,EL_HIST , history, (const char *)hist); - } - line =strdup (el_gets (el, &count)); -if (line) { -if (count >0 ) - line[count-1 ] ='\0' ; -if (*line) -history (hist, &hevent,H_ENTER , line); - } -return line; -} -#else -# define MAXREADLINESZ 1024 -char * -fetchline (void ) -{ -char *p, *line =malloc (MAXREADLINESZ ); - -if (!line) -return NULL ; -if (!fgets (line,MAXREADLINESZ , stdin)) { -free (line); -return NULL ; - } - p = line +strlen (line); -if (p != line && p[-1 ] =='\n' ) - p[-1 ] ='\0' ; -return line; -} -#endif -#define EXABYTES (x) ((long long)(x) << 60)#define PETABYTES (x) ((long long)(x) << 50)#define TERABYTES (x) ((long long)(x) << 40)
cmd.h +0 -9
@@ -39,18 +39,11 @@ typedef struct cmdinfo {helpfunc_t help; } cmdinfo_t; -typedef int (*checkfunc_t )(BlockDriverState *bs,const cmdinfo_t *ci); -void qemuio_add_command (const cmdinfo_t *ci); -void add_user_command (char *optarg); -void add_check_command (checkfunc_t cf); -void command_loop (void );int qemuio_command_usage (const cmdinfo_t *ci);/* from input.h */ -char *fetchline (void ); -void cvtstr (double value,char *str,size_t sz);struct timeval tsub (struct timeval t1,struct timeval t2);
@@ -64,8 +57,6 @@ enum {void timestr (struct timeval *tv,char *str,size_t sz,int flags); -extern char *progname; -bool qemuio_command (const char *cmd);#endif /* __COMMAND_H__ */
qemu-io.c +139 -0
151 lines not on this page · raw message
Signature · 1 line
1.8.1.4
PATCH v2 13/16 qemu-io: Move remaining helpers from cmd.c
In reply to Kevin Wolf--- Makefile | 2 +- cmd.c | 139 --------------------------------------------------------- cmd.h | 14 ------ qemu-io-cmds.c | 104 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 154 deletions(-) delete mode 100644 cmd.c
Makefile +1 -1
@@ -186,7 +186,7 @@ qemu-img.o: qemu-img-cmds.h qemu-img$(EXESUF): qemu-img.o $(block-obj-y) libqemuutil.a libqemustub.a qemu-nbd$(EXESUF): qemu-nbd.o $(block-obj-y) libqemuutil.a libqemustub.a -qemu-io$(EXESUF): qemu-io.o qemu-io-cmds.o cmd.o $(block-obj-y) libqemuutil.a libqemustub.a +qemu-io$(EXESUF): qemu-io.o qemu-io-cmds.o $(block-obj-y) libqemuutil.a libqemustub.a qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o
cmd.c deleted +0 -139
139 lines not on this page · raw message
cmd.h +0 -14
@@ -43,20 +43,6 @@ void qemuio_add_command(const cmdinfo_t *ci);int qemuio_command_usage (const cmdinfo_t *ci); -/* from input.h */ -void cvtstr (double value,char *str,size_t sz); - -struct timeval tsub (struct timeval t1,struct timeval t2); -double tdiv (double value,struct timeval tv); - -enum { -DEFAULT_TIME =0x0 , -TERSE_FIXED_TIME =0x1 , -VERBOSE_FIXED_TIME =0x2 -}; - -void timestr (struct timeval *tv,char *str,size_t sz,int flags); -bool qemuio_command (const char *cmd);#endif /* __COMMAND_H__ */
qemu-io-cmds.c +104 -0
110 lines not on this page · raw message
Signature · 1 line
1.8.1.4
PATCH v2 14/16 qemu-io: Interface cleanup
In reply to Kevin Wolf--- cmd.h | 48 ------------------------------------------------ include/qemu-io.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ qemu-io-cmds.c | 14 +++++++------- qemu-io.c | 7 +++---- 4 files changed, 56 insertions(+), 59 deletions(-) delete mode 100644 cmd.h create mode 100644 include/qemu-io.h
cmd.h deleted +0 -48
@@ -1,48 +0,0 @@ -/* -* Copyright (c) 2000-2005 Silicon Graphics, Inc. -* All Rights Reserved. -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License as -* published by the Free Software Foundation. -* -* This program is distributed in the hope that it would be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ -#ifndef __COMMAND_H__ -#define __COMMAND_H__ - -#include "qemu-common.h" - -#define CMD_FLAG_GLOBAL ((int)0x80000000)/* don't iterate "args" */ - -extern BlockDriverState *qemuio_bs; - -typedef int (*cfunc_t )(BlockDriverState *bs,int argc,char **argv); -typedef void (*helpfunc_t )(void ); - -typedef struct cmdinfo { -const char *name; -const char *altname; -cfunc_t cfunc; -int argmin; -int argmax; -int canpush; -int flags; -const char *args; -const char *oneline; -helpfunc_t help; -}cmdinfo_t ; - -void qemuio_add_command (const cmdinfo_t *ci); - -int qemuio_command_usage (const cmdinfo_t *ci); - -bool qemuio_command (const char *cmd); - -#endif /* __COMMAND_H__ */
include/qemu-io.h new file +46 -0
46 lines not on this page · raw message
qemu-io-cmds.c +7 -7
@@ -8,9 +8,8 @@* See the COPYING file in the top-level directory. */ -#include "qemu-common.h" +#include "qemu-io.h" #include "block/block_int.h" -#include "cmd.h" #define CMD_NOFILE_OK 0x01
@@ -50,11 +49,12 @@ static int init_check_command(BlockDriverState *bs, const cmdinfo_t *ct)return 1 ; } -static int command (const cmdinfo_t *ct,int argc,char **argv) +static int command (BlockDriverState *bs,const cmdinfo_t *ct,int argc, +char **argv) {char *cmd = argv[0 ]; -if (!init_check_command (qemuio_bs, ct)) { +if (!init_check_command (bs, ct)) {return 0 ; }
@@ -75,7 +75,7 @@ static int command(const cmdinfo_t *ct, int argc, char **argv)return 0 ; } optind =0 ; -return ct->cfunc (qemuio_bs, argc, argv); +return ct->cfunc (bs, argc, argv); }static const cmdinfo_t *find_command (const char *cmd)
@@ -2068,7 +2068,7 @@ static const cmdinfo_t help_cmd = { .oneline = "help for one or all commands", }; -bool qemuio_command (const char *cmd) +bool qemuio_command (BlockDriverState *bs,const char *cmd) {char *input;const cmdinfo_t *ct;
@@ -2081,7 +2081,7 @@ bool qemuio_command(const char *cmd)if (c) { ct =find_command (v[0 ]);if (ct) { - done =command (ct, c, v); + done =command (bs, ct, c, v); }else {fprintf (stderr,"command \"%s\" not found\n" , v[0 ]); }
qemu-io.c +3 -4
@@ -14,10 +14,9 @@#include <getopt.h> #include <libgen.h> -#include "qemu-common.h" +#include "qemu-io.h" #include "qemu/main-loop.h" #include "block/block_int.h" -#include "cmd.h" #include "trace/control.h" #define VERSION "0.0.1"
@@ -273,7 +272,7 @@ static void command_loop(void)char *input;for (i =0 ; !done && i < ncmdline; i++) { - done =qemuio_command (cmdline[i]); + done =qemuio_command (qemuio_bs, cmdline[i]); }if (cmdline) {g_free (cmdline);
@@ -298,7 +297,7 @@ static void command_loop(void)if (input ==NULL ) {break ; } - done =qemuio_command (input); + done =qemuio_command (qemuio_bs, input);g_free (input); prompted =0 ;
Signature · 1 line
1.8.1.4
PATCH v2 15/16 qemu-io: Use the qemu version for -V
In reply to Kevin WolfAlways printing 0.0.1 and never updating the version number wasn't very useful. qemu-io is released with qemu, so using the same version number makes most sense.
--- qemu-io.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
qemu-io.c +1 -3
@@ -19,8 +19,6 @@#include "block/block_int.h" #include "trace/control.h" -#define VERSION "0.0.1" -#define CMD_NOFILE_OK 0x01char *progname;
@@ -380,7 +378,7 @@ int main(int argc, char **argv) }break ;case 'V' : -printf ("%s version %s\n" , progname,VERSION ); +printf ("%s version %s\n" , progname,QEMU_VERSION );exit (0 );case 'h' :usage (progname);
Signature · 1 line
1.8.1.4
PATCH v2 16/16 Make qemu-io commands available in HMP
In reply to Kevin WolfIt was decided to not make this command available in QMP in order to make clear that this is not supposed to be a stable API and should be used only for testing and debugging purposes.
--- Makefile | 2 +- Makefile.objs | 1 + hmp-commands.hx | 16 ++++++++++++++++ hmp.c | 18 ++++++++++++++++++ hmp.h | 1 + 5 files changed, 37 insertions(+), 1 deletion(-)
Makefile +1 -1
@@ -186,7 +186,7 @@ qemu-img.o: qemu-img-cmds.h qemu-img$(EXESUF): qemu-img.o $(block-obj-y) libqemuutil.a libqemustub.a qemu-nbd$(EXESUF): qemu-nbd.o $(block-obj-y) libqemuutil.a libqemustub.a -qemu-io$(EXESUF): qemu-io.o qemu-io-cmds.o $(block-obj-y) libqemuutil.a libqemustub.a +qemu-io$(EXESUF): qemu-io.o $(block-obj-y) libqemuutil.a libqemustub.a qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o
Makefile.objs +1 -0
@@ -13,6 +13,7 @@ block-obj-$(CONFIG_POSIX) += aio-posix.o block-obj-$(CONFIG_WIN32) += aio-win32.o block-obj-y += block/ block-obj-y += qapi-types.o qapi-visit.o +block-obj-y += qemu-io-cmds.o block-obj-y += qemu-coroutine.o qemu-coroutine-lock.o qemu-coroutine-io.o block-obj-y += qemu-coroutine-sleep.o
hmp-commands.hx +16 -0
@@ -1551,6 +1551,22 @@ Removes the chardev @var{id}. ETEXI { + .name = "qemu-io", + .args_type = "device:B,command:s", + .params = "[device] \"[command]\"", + .help = "run a qemu-io command on a block device", + .mhandler.cmd = hmp_qemu_io, + }, + +STEXI +@item qemu-io @var{device} @var{command} +@findex qemu-io + +Executes a qemu-io command on the given block device. + +ETEXI + + { .name = "info", .args_type = "item:s?", .params = "[subcommand]",
hmp.c +18 -0
@@ -22,6 +22,7 @@#include "qemu/sockets.h" #include "monitor/monitor.h" #include "ui/console.h" +#include "qemu-io.h" static void hmp_handle_error (Monitor *mon,Error **errp) {
@@ -1425,3 +1426,20 @@ void hmp_chardev_remove(Monitor *mon, const QDict *qdict)qmp_chardev_remove (qdict_get_str (qdict,"id" ), &local_err);hmp_handle_error (mon, &local_err); } + +void hmp_qemu_io (Monitor *mon,const QDict *qdict) +{ +BlockDriverState *bs; +const char * device =qdict_get_str (qdict,"device" ); +const char * command =qdict_get_str (qdict,"command" ); +Error *err =NULL ; + + bs =bdrv_find (device); +if (bs) { +qemuio_command (bs, command); + }else { +error_set (&err,QERR_DEVICE_NOT_FOUND , device); + } + +hmp_handle_error (mon, &err); +}
hmp.h +1 -0
@@ -85,5 +85,6 @@ void hmp_nbd_server_add(Monitor *mon, const QDict *qdict);void hmp_nbd_server_stop (Monitor *mon,const QDict *qdict);void hmp_chardev_add (Monitor *mon,const QDict *qdict);void hmp_chardev_remove (Monitor *mon,const QDict *qdict); +void hmp_qemu_io (Monitor *mon,const QDict *qdict);#endif
Signature · 1 line
1.8.1.4
Re: [Qemu-devel] [PATCH v2 16/16] Make qemu-io commands available in HMP
Quoted 3 lines · On Wed, 5 Jun 2013 14:19:41 +0200 Kevin Wolf <[email protected]> wrote:
It was decided to not make this command available in QMP in order to make clear that this is not supposed to be a stable API and should be used only for testing and debugging purposes.
I like this as a temporary solution.
But I also see that commands seem to print to stderr, so this needs work before being available in QMP. Even for HMP or the -debug extension this is not desirable.
Quoted 106 lines
Signed-off-by Kevin Wolf <[email protected]>--- Makefile | 2 +- Makefile.objs | 1 + hmp-commands.hx | 16 ++++++++++++++++ hmp.c | 18 ++++++++++++++++++ hmp.h | 1 + 5 files changed, 37 insertions(+), 1 deletion(-)Makefile +1
-1@@ -186,7 +186,7 @@ qemu-img.o: qemu-img-cmds.h qemu-img$(EXESUF): qemu-img.o $(block-obj-y) libqemuutil.a libqemustub.a qemu-nbd$(EXESUF): qemu-nbd.o $(block-obj-y) libqemuutil.a libqemustub.a -qemu-io$(EXESUF): qemu-io.o qemu-io-cmds.o $(block-obj-y) libqemuutil.a libqemustub.a +qemu-io$(EXESUF): qemu-io.o $(block-obj-y) libqemuutil.a libqemustub.a qemu-bridge-helper$(EXESUF): qemu-bridge-helper.oMakefile.objs +1
-0@@ -13,6 +13,7 @@ block-obj-$(CONFIG_POSIX) += aio-posix.o block-obj-$(CONFIG_WIN32) += aio-win32.o block-obj-y += block/ block-obj-y += qapi-types.o qapi-visit.o +block-obj-y += qemu-io-cmds.o block-obj-y += qemu-coroutine.o qemu-coroutine-lock.o qemu-coroutine-io.o block-obj-y += qemu-coroutine-sleep.ohmp-commands.hx +16
-0@@ -1551,6 +1551,22 @@ Removes the chardev @var{id}. ETEXI { + .name = "qemu-io", + .args_type = "device:B,command:s", + .params = "[device] \"[command]\"", + .help = "run a qemu-io command on a block device", + .mhandler.cmd = hmp_qemu_io, + }, + +STEXI +@item qemu-io @var{device} @var{command} +@findex qemu-io + +Executes a qemu-io command on the given block device. + +ETEXI + + { .name = "info", .args_type = "item:s?", .params = "[subcommand]",hmp.c +18
-0@@ -22,6 +22,7 @@#include "qemu/sockets.h" #include "monitor/monitor.h" #include "ui/console.h" +#include "qemu-io.h" static void hmp_handle_error (Monitor *mon,Error **errp) {@@ -1425,3 +1426,20 @@ void hmp_chardev_remove(Monitor *mon, const QDict *qdict)qmp_chardev_remove (qdict_get_str (qdict,"id" ), &local_err);hmp_handle_error (mon, &local_err); } + +void hmp_qemu_io (Monitor *mon,const QDict *qdict) +{ +BlockDriverState *bs; +const char * device =qdict_get_str (qdict,"device" ); +const char * command =qdict_get_str (qdict,"command" ); +Error *err =NULL ; + + bs =bdrv_find (device); +if (bs) { +qemuio_command (bs, command); + }else { +error_set (&err,QERR_DEVICE_NOT_FOUND , device); + } + +hmp_handle_error (mon, &err); +}hmp.h +1
-0@@ -85,5 +85,6 @@ void hmp_nbd_server_add(Monitor *mon, const QDict *qdict);void hmp_nbd_server_stop (Monitor *mon,const QDict *qdict);void hmp_chardev_add (Monitor *mon,const QDict *qdict);void hmp_chardev_remove (Monitor *mon,const QDict *qdict); +void hmp_qemu_io (Monitor *mon,const QDict *qdict);#endif
Stefan Hajnoczi
AppliedQuoted 38 lines · Kevin Wolf
This is a prerequisite for some kind of tests. It involves reorganising the qemu-io code so that the command part can be separated and doesn't pollute the global namespace any more, so we can link it with qemu.
v2:
- Drop the QMP command, make it HMP only
- Minor review comments like typosKevin Wolf (16):
qemu-io: Remove unusedargs_command
cutils: Support 'P' and 'E' suffixes instrtosz()
qemu-io: Makecvtnum()a wrapper aroundstrtosz_suffix()
qemu-io: Handlecvtnum()errors in 'alloc'
qemu-io: Don't use global bs in command implementations
qemu-io: Split off commands toqemu-io-cmds.c
qemu-io: Factor outqemuio_command
qemu-io: Move 'help' function
qemu-io: Move 'quit' function
qemu-io: Moveqemu_strsep()tocutils.c
qemu-io: Move functions for registering and running commands
qemu-io: Movecommand_loop()and friends
qemu-io: Move remaining helpers fromcmd.c
qemu-io: Interface cleanup
qemu-io: Use the qemu version for -V
Make qemu-io commands available in HMPMakefile | 2 +- Makefile.objs | 1 + cmd.c | 612 ------------- cmd.h | 79 -- hmp-commands.hx | 16 + hmp.c | 18 + hmp.h | 1 + include/qemu-common.h | 3 + include/qemu-io.h | 46 + monitor.c | 8 +- qemu-img.c | 10 +- qemu-io-cmds.c | 2118 ++++++++++++++++++++++++++++++++++++++++++++
Quoted 12 lines
qemu-io.c | 1990 ++++------------------------------------- tests/qemu-iotests/049.out | 8 +- util/cutils.c | 25 + 15 files changed, 2416 insertions(+), 2521 deletions(-) delete mode 100644 cmd.c delete mode 100644 cmd.h create mode 100644 include/qemu-io.h create mode 100644 qemu-io-cmds.cSignature · 1 line
1.8.1.4
On IRC kwolf explained that he moved cmd.c into qemu-io-cmds.c since there are no other users and cmd.c uses global state (it's not easily reusable anyway). I'm happy with dropping cmd.c now.
Thanks, applied to my block tree:
https://github.com/stefanha/qemu/commits/block
Stefan