monitor: New argument type 'b'
This is a double value with optional suffixes G, g, M, m, K, k. We'll need this to get migrate_set_speed() QMP-ready. Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
acc3b0336c
commit
3350a4dd07
64
monitor.c
64
monitor.c
@ -47,6 +47,7 @@
|
||||
#include "kvm.h"
|
||||
#include "acl.h"
|
||||
#include "qint.h"
|
||||
#include "qfloat.h"
|
||||
#include "qlist.h"
|
||||
#include "qdict.h"
|
||||
#include "qbool.h"
|
||||
@ -70,6 +71,10 @@
|
||||
* 'l' target long (32 or 64 bit)
|
||||
* 'M' just like 'l', except in user mode the value is
|
||||
* multiplied by 2^20 (think Mebibyte)
|
||||
* 'b' double
|
||||
* user mode accepts an optional G, g, M, m, K, k suffix,
|
||||
* which multiplies the value by 2^30 for suffixes G and
|
||||
* g, 2^20 for M and m, 2^10 for K and k
|
||||
* '/' optional gdb-like print format (like "/10x")
|
||||
*
|
||||
* '?' optional type (for all types, except '/')
|
||||
@ -3299,6 +3304,27 @@ static int get_expr(Monitor *mon, int64_t *pval, const char **pp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_double(Monitor *mon, double *pval, const char **pp)
|
||||
{
|
||||
const char *p = *pp;
|
||||
char *tailp;
|
||||
double d;
|
||||
|
||||
d = strtod(p, &tailp);
|
||||
if (tailp == p) {
|
||||
monitor_printf(mon, "Number expected\n");
|
||||
return -1;
|
||||
}
|
||||
if (d != d || d - d != 0) {
|
||||
/* NaN or infinity */
|
||||
monitor_printf(mon, "Bad number\n");
|
||||
return -1;
|
||||
}
|
||||
*pval = d;
|
||||
*pp = tailp;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_str(char *buf, int buf_size, const char **pp)
|
||||
{
|
||||
const char *p;
|
||||
@ -3635,6 +3661,38 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
|
||||
qdict_put(qdict, key, qint_from_int(val));
|
||||
}
|
||||
break;
|
||||
case 'b':
|
||||
{
|
||||
double val;
|
||||
|
||||
while (qemu_isspace(*p))
|
||||
p++;
|
||||
if (*typestr == '?') {
|
||||
typestr++;
|
||||
if (*p == '\0') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (get_double(mon, &val, &p) < 0) {
|
||||
goto fail;
|
||||
}
|
||||
if (*p) {
|
||||
switch (*p) {
|
||||
case 'K': case 'k':
|
||||
val *= 1 << 10; p++; break;
|
||||
case 'M': case 'm':
|
||||
val *= 1 << 20; p++; break;
|
||||
case 'G': case 'g':
|
||||
val *= 1 << 30; p++; break;
|
||||
}
|
||||
}
|
||||
if (*p && !qemu_isspace(*p)) {
|
||||
monitor_printf(mon, "Unknown unit suffix\n");
|
||||
goto fail;
|
||||
}
|
||||
qdict_put(qdict, key, qfloat_from_double(val));
|
||||
}
|
||||
break;
|
||||
case '-':
|
||||
{
|
||||
const char *tmp = p;
|
||||
@ -4060,6 +4118,12 @@ static int check_arg(const CmdArgs *cmd_args, QDict *args)
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
case 'b':
|
||||
if (qobject_type(value) != QTYPE_QINT && qobject_type(value) != QTYPE_QFLOAT) {
|
||||
qemu_error_new(QERR_INVALID_PARAMETER_TYPE, name, "number");
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
case '-':
|
||||
if (qobject_type(value) != QTYPE_QINT &&
|
||||
qobject_type(value) != QTYPE_QBOOL) {
|
||||
|
Loading…
Reference in New Issue
Block a user