mirror of https://github.com/xemu-project/xemu.git
Removal of deprecated options and improvements for the qtests
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJbiPfvAAoJEC7Z13T+cC21+yUP/ibp2ux3BDXhd7L82YwIu7f2 VHrXxmJPdyPhYNu96GMrGsbX4uiNKx0J0BGAdIScMv1Pf8XrWVP5C6+vkPuknCbI upN5HHZlGYbc2kM/XPBJaH/jqfkmBXX/xzEU1DVwi9V9jYIVv4Yi1rGmWXelHXoc eenywK5M0fWWrSIdfA44UC2O78RnF/FIHgavnO6DPpTxtbU3abbZSYMW3H7+hX3k VtqKdfuouLjY9KfUaij5BaihYGXnIX6cEY4g+uet34ci+pQITWqOScVQyqU64KKf PiDrd8y5bV+5Xf4doCTizVvA89BbAFfuSnLmhb4KPlEtiikvtNV2uRSojCzviqoC XYzPA/KkogZ1VM3A9L5/JOJlIxj9483gZffjEqRd/cdasY55X88cdv+tFH83lEaA eE7sNep0NBEBKIGE32QmElbv7Z9bv5Rf6UQq5xwkZaFswSLabDQUUEhDiZP9+am1 cV8vC02FYQxi9tfHr7sr5Jauyrln46UfT9aE1R3S5KiRQj4ggTALidptKzHyxSIz 6ST07qx6lTEVZXOTtLbziAW2LFXrni0KZUK71PYIIiKTrickNIoIj0xamr/9YUcQ kLyPUXL8wJ3MrkR7g1c3d/umgURGw89U6gU7MlIYKcRUBwDVNNnPoogt7p6h+6vg PcS9cfVOs97SEbfUPOzY =NcP+ -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/huth-gitlab/tags/pull-request-2018-08-31' into staging Removal of deprecated options and improvements for the qtests # gpg: Signature made Fri 31 Aug 2018 09:10:23 BST # gpg: using RSA key 2ED9D774FE702DB5 # gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" # gpg: aka "Thomas Huth <thuth@redhat.com>" # gpg: aka "Thomas Huth <huth@tuxfamily.org>" # gpg: aka "Thomas Huth <th.huth@posteo.de>" # Primary key fingerprint: 27B8 8847 EEE0 2501 18F3 EAB9 2ED9 D774 FE70 2DB5 * remotes/huth-gitlab/tags/pull-request-2018-08-31: tests: add a qmp success-response test tests: add qmp/qom-set-without-value test tests: add qmp/object-add-without-props test tests: add qmp_assert_error_class() tests/libqos: Utilize newer glib spawn check net: Remove the deprecated -tftp, -bootp, -redir and -smb options Remove the deprecated options -startdate, -localtime and -rtc-td-hack Remove the deprecated -nodefconfig option Remove the deprecated -balloon option Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
09d8277eb0
|
@ -129,7 +129,7 @@ To show some example invocations of command-line, we will use the
|
||||||
following invocation of QEMU, with a QMP server running over UNIX
|
following invocation of QEMU, with a QMP server running over UNIX
|
||||||
socket::
|
socket::
|
||||||
|
|
||||||
$ ./x86_64-softmmu/qemu-system-x86_64 -display none -nodefconfig \
|
$ ./x86_64-softmmu/qemu-system-x86_64 -display none -no-user-config \
|
||||||
-M q35 -nodefaults -m 512 \
|
-M q35 -nodefaults -m 512 \
|
||||||
-blockdev node-name=node-A,driver=qcow2,file.driver=file,file.node-name=file,file.filename=./a.qcow2 \
|
-blockdev node-name=node-A,driver=qcow2,file.driver=file,file.node-name=file,file.filename=./a.qcow2 \
|
||||||
-device virtio-blk,drive=node-A,id=virtio0 \
|
-device virtio-blk,drive=node-A,id=virtio0 \
|
||||||
|
@ -694,7 +694,7 @@ instance, with the following invocation. (As noted earlier, for
|
||||||
simplicity's sake, the destination QEMU is started on the same host, but
|
simplicity's sake, the destination QEMU is started on the same host, but
|
||||||
it could be located elsewhere)::
|
it could be located elsewhere)::
|
||||||
|
|
||||||
$ ./x86_64-softmmu/qemu-system-x86_64 -display none -nodefconfig \
|
$ ./x86_64-softmmu/qemu-system-x86_64 -display none -no-user-config \
|
||||||
-M q35 -nodefaults -m 512 \
|
-M q35 -nodefaults -m 512 \
|
||||||
-blockdev node-name=node-TargetDisk,driver=qcow2,file.driver=file,file.node-name=file,file.filename=./target-disk.qcow2 \
|
-blockdev node-name=node-TargetDisk,driver=qcow2,file.driver=file,file.node-name=file,file.filename=./target-disk.qcow2 \
|
||||||
-device virtio-blk,drive=node-TargetDisk,id=virtio0 \
|
-device virtio-blk,drive=node-TargetDisk,id=virtio0 \
|
||||||
|
|
|
@ -61,9 +61,9 @@ It's also important to note the following:
|
||||||
respond to the request the timer will never be re-armed, which has
|
respond to the request the timer will never be re-armed, which has
|
||||||
the same effect as disabling polling
|
the same effect as disabling polling
|
||||||
|
|
||||||
Here are a few examples. QEMU is started with '-balloon virtio', which
|
Here are a few examples. QEMU is started with '-device virtio-balloon',
|
||||||
generates '/machine/peripheral-anon/device[1]' as the QOM path for the
|
which generates '/machine/peripheral-anon/device[1]' as the QOM path for
|
||||||
balloon device.
|
the balloon device.
|
||||||
|
|
||||||
Enable polling with 2 seconds interval:
|
Enable polling with 2 seconds interval:
|
||||||
|
|
||||||
|
|
|
@ -201,9 +201,6 @@ extern NICInfo nd_table[MAX_NICS];
|
||||||
extern const char *host_net_devices[];
|
extern const char *host_net_devices[];
|
||||||
|
|
||||||
/* from net.c */
|
/* from net.c */
|
||||||
extern const char *legacy_tftp_prefix;
|
|
||||||
extern const char *legacy_bootp_filename;
|
|
||||||
|
|
||||||
int net_client_parse(QemuOptsList *opts_list, const char *str);
|
int net_client_parse(QemuOptsList *opts_list, const char *str);
|
||||||
int net_init_clients(Error **errp);
|
int net_init_clients(Error **errp);
|
||||||
void net_check_clients(void);
|
void net_check_clients(void);
|
||||||
|
|
|
@ -30,10 +30,6 @@
|
||||||
void hmp_hostfwd_add(Monitor *mon, const QDict *qdict);
|
void hmp_hostfwd_add(Monitor *mon, const QDict *qdict);
|
||||||
void hmp_hostfwd_remove(Monitor *mon, const QDict *qdict);
|
void hmp_hostfwd_remove(Monitor *mon, const QDict *qdict);
|
||||||
|
|
||||||
int net_slirp_redir(const char *redir_str);
|
|
||||||
|
|
||||||
int net_slirp_smb(const char *exported_dir);
|
|
||||||
|
|
||||||
void hmp_info_usernet(Monitor *mon, const QDict *qdict);
|
void hmp_info_usernet(Monitor *mon, const QDict *qdict);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
132
net/slirp.c
132
net/slirp.c
|
@ -67,13 +67,11 @@ static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
|
||||||
/* slirp network adapter */
|
/* slirp network adapter */
|
||||||
|
|
||||||
#define SLIRP_CFG_HOSTFWD 1
|
#define SLIRP_CFG_HOSTFWD 1
|
||||||
#define SLIRP_CFG_LEGACY 2
|
|
||||||
|
|
||||||
struct slirp_config_str {
|
struct slirp_config_str {
|
||||||
struct slirp_config_str *next;
|
struct slirp_config_str *next;
|
||||||
int flags;
|
int flags;
|
||||||
char str[1024];
|
char str[1024];
|
||||||
int legacy_format;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct SlirpState {
|
typedef struct SlirpState {
|
||||||
|
@ -87,19 +85,13 @@ typedef struct SlirpState {
|
||||||
} SlirpState;
|
} SlirpState;
|
||||||
|
|
||||||
static struct slirp_config_str *slirp_configs;
|
static struct slirp_config_str *slirp_configs;
|
||||||
const char *legacy_tftp_prefix;
|
|
||||||
const char *legacy_bootp_filename;
|
|
||||||
static QTAILQ_HEAD(slirp_stacks, SlirpState) slirp_stacks =
|
static QTAILQ_HEAD(slirp_stacks, SlirpState) slirp_stacks =
|
||||||
QTAILQ_HEAD_INITIALIZER(slirp_stacks);
|
QTAILQ_HEAD_INITIALIZER(slirp_stacks);
|
||||||
|
|
||||||
static int slirp_hostfwd(SlirpState *s, const char *redir_str,
|
static int slirp_hostfwd(SlirpState *s, const char *redir_str, Error **errp);
|
||||||
int legacy_format, Error **errp);
|
static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **errp);
|
||||||
static int slirp_guestfwd(SlirpState *s, const char *config_str,
|
|
||||||
int legacy_format, Error **errp);
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
static const char *legacy_smb_export;
|
|
||||||
|
|
||||||
static int slirp_smb(SlirpState *s, const char *exported_dir,
|
static int slirp_smb(SlirpState *s, const char *exported_dir,
|
||||||
struct in_addr vserver_addr, Error **errp);
|
struct in_addr vserver_addr, Error **errp);
|
||||||
static void slirp_smb_cleanup(SlirpState *s);
|
static void slirp_smb_cleanup(SlirpState *s);
|
||||||
|
@ -196,13 +188,6 @@ static int net_slirp_init(NetClientState *peer, const char *model,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!tftp_export) {
|
|
||||||
tftp_export = legacy_tftp_prefix;
|
|
||||||
}
|
|
||||||
if (!bootfile) {
|
|
||||||
bootfile = legacy_bootp_filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vnetwork) {
|
if (vnetwork) {
|
||||||
if (get_str_sep(buf, sizeof(buf), &vnetwork, '/') < 0) {
|
if (get_str_sep(buf, sizeof(buf), &vnetwork, '/') < 0) {
|
||||||
if (!inet_aton(vnetwork, &net)) {
|
if (!inet_aton(vnetwork, &net)) {
|
||||||
|
@ -382,21 +367,16 @@ static int net_slirp_init(NetClientState *peer, const char *model,
|
||||||
|
|
||||||
for (config = slirp_configs; config; config = config->next) {
|
for (config = slirp_configs; config; config = config->next) {
|
||||||
if (config->flags & SLIRP_CFG_HOSTFWD) {
|
if (config->flags & SLIRP_CFG_HOSTFWD) {
|
||||||
if (slirp_hostfwd(s, config->str,
|
if (slirp_hostfwd(s, config->str, errp) < 0) {
|
||||||
config->flags & SLIRP_CFG_LEGACY, errp) < 0) {
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (slirp_guestfwd(s, config->str,
|
if (slirp_guestfwd(s, config->str, errp) < 0) {
|
||||||
config->flags & SLIRP_CFG_LEGACY, errp) < 0) {
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
if (!smb_export) {
|
|
||||||
smb_export = legacy_smb_export;
|
|
||||||
}
|
|
||||||
if (smb_export) {
|
if (smb_export) {
|
||||||
if (slirp_smb(s, smb_export, smbsrv, errp) < 0) {
|
if (slirp_smb(s, smb_export, smbsrv, errp) < 0) {
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -506,8 +486,7 @@ void hmp_hostfwd_remove(Monitor *mon, const QDict *qdict)
|
||||||
monitor_printf(mon, "invalid format\n");
|
monitor_printf(mon, "invalid format\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int slirp_hostfwd(SlirpState *s, const char *redir_str,
|
static int slirp_hostfwd(SlirpState *s, const char *redir_str, Error **errp)
|
||||||
int legacy_format, Error **errp)
|
|
||||||
{
|
{
|
||||||
struct in_addr host_addr = { .s_addr = INADDR_ANY };
|
struct in_addr host_addr = { .s_addr = INADDR_ANY };
|
||||||
struct in_addr guest_addr = { .s_addr = 0 };
|
struct in_addr guest_addr = { .s_addr = 0 };
|
||||||
|
@ -532,18 +511,16 @@ static int slirp_hostfwd(SlirpState *s, const char *redir_str,
|
||||||
goto fail_syntax;
|
goto fail_syntax;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!legacy_format) {
|
if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
|
||||||
if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
|
fail_reason = "Missing : separator";
|
||||||
fail_reason = "Missing : separator";
|
goto fail_syntax;
|
||||||
goto fail_syntax;
|
}
|
||||||
}
|
if (buf[0] != '\0' && !inet_aton(buf, &host_addr)) {
|
||||||
if (buf[0] != '\0' && !inet_aton(buf, &host_addr)) {
|
fail_reason = "Bad host address";
|
||||||
fail_reason = "Bad host address";
|
goto fail_syntax;
|
||||||
goto fail_syntax;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (get_str_sep(buf, sizeof(buf), &p, legacy_format ? ':' : '-') < 0) {
|
if (get_str_sep(buf, sizeof(buf), &p, '-') < 0) {
|
||||||
fail_reason = "Bad host port separator";
|
fail_reason = "Bad host port separator";
|
||||||
goto fail_syntax;
|
goto fail_syntax;
|
||||||
}
|
}
|
||||||
|
@ -602,35 +579,13 @@ void hmp_hostfwd_add(Monitor *mon, const QDict *qdict)
|
||||||
}
|
}
|
||||||
if (s) {
|
if (s) {
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
if (slirp_hostfwd(s, redir_str, 0, &err) < 0) {
|
if (slirp_hostfwd(s, redir_str, &err) < 0) {
|
||||||
error_report_err(err);
|
error_report_err(err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int net_slirp_redir(const char *redir_str)
|
|
||||||
{
|
|
||||||
struct slirp_config_str *config;
|
|
||||||
Error *err = NULL;
|
|
||||||
int res;
|
|
||||||
|
|
||||||
if (QTAILQ_EMPTY(&slirp_stacks)) {
|
|
||||||
config = g_malloc(sizeof(*config));
|
|
||||||
pstrcpy(config->str, sizeof(config->str), redir_str);
|
|
||||||
config->flags = SLIRP_CFG_HOSTFWD | SLIRP_CFG_LEGACY;
|
|
||||||
config->next = slirp_configs;
|
|
||||||
slirp_configs = config;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = slirp_hostfwd(QTAILQ_FIRST(&slirp_stacks), redir_str, 1, &err);
|
|
||||||
if (res < 0) {
|
|
||||||
error_report_err(err);
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
|
|
||||||
/* automatic user mode samba server configuration */
|
/* automatic user mode samba server configuration */
|
||||||
|
@ -746,28 +701,6 @@ static int slirp_smb(SlirpState* s, const char *exported_dir,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* automatic user mode samba server configuration (legacy interface) */
|
|
||||||
int net_slirp_smb(const char *exported_dir)
|
|
||||||
{
|
|
||||||
struct in_addr vserver_addr = { .s_addr = 0 };
|
|
||||||
|
|
||||||
if (legacy_smb_export) {
|
|
||||||
fprintf(stderr, "-smb given twice\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
legacy_smb_export = exported_dir;
|
|
||||||
if (!QTAILQ_EMPTY(&slirp_stacks)) {
|
|
||||||
Error *err = NULL;
|
|
||||||
int res = slirp_smb(QTAILQ_FIRST(&slirp_stacks), exported_dir,
|
|
||||||
vserver_addr, &err);
|
|
||||||
if (res < 0) {
|
|
||||||
error_report_err(err);
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* !defined(_WIN32) */
|
#endif /* !defined(_WIN32) */
|
||||||
|
|
||||||
struct GuestFwd {
|
struct GuestFwd {
|
||||||
|
@ -789,8 +722,7 @@ static void guestfwd_read(void *opaque, const uint8_t *buf, int size)
|
||||||
slirp_socket_recv(fwd->slirp, fwd->server, fwd->port, buf, size);
|
slirp_socket_recv(fwd->slirp, fwd->server, fwd->port, buf, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int slirp_guestfwd(SlirpState *s, const char *config_str,
|
static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **errp)
|
||||||
int legacy_format, Error **errp)
|
|
||||||
{
|
{
|
||||||
struct in_addr server = { .s_addr = 0 };
|
struct in_addr server = { .s_addr = 0 };
|
||||||
struct GuestFwd *fwd;
|
struct GuestFwd *fwd;
|
||||||
|
@ -800,26 +732,20 @@ static int slirp_guestfwd(SlirpState *s, const char *config_str,
|
||||||
int port;
|
int port;
|
||||||
|
|
||||||
p = config_str;
|
p = config_str;
|
||||||
if (legacy_format) {
|
if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
|
||||||
if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
|
goto fail_syntax;
|
||||||
goto fail_syntax;
|
}
|
||||||
}
|
if (strcmp(buf, "tcp") && buf[0] != '\0') {
|
||||||
} else {
|
goto fail_syntax;
|
||||||
if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
|
}
|
||||||
goto fail_syntax;
|
if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
|
||||||
}
|
goto fail_syntax;
|
||||||
if (strcmp(buf, "tcp") && buf[0] != '\0') {
|
}
|
||||||
goto fail_syntax;
|
if (buf[0] != '\0' && !inet_aton(buf, &server)) {
|
||||||
}
|
goto fail_syntax;
|
||||||
if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
|
}
|
||||||
goto fail_syntax;
|
if (get_str_sep(buf, sizeof(buf), &p, '-') < 0) {
|
||||||
}
|
goto fail_syntax;
|
||||||
if (buf[0] != '\0' && !inet_aton(buf, &server)) {
|
|
||||||
goto fail_syntax;
|
|
||||||
}
|
|
||||||
if (get_str_sep(buf, sizeof(buf), &p, '-') < 0) {
|
|
||||||
goto fail_syntax;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
port = strtol(buf, &end, 10);
|
port = strtol(buf, &end, 10);
|
||||||
if (*end != '\0' || port < 1 || port > 65535) {
|
if (*end != '\0' || port < 1 || port > 65535) {
|
||||||
|
|
|
@ -168,14 +168,6 @@ static bool os_parse_runas_uid_gid(const char *optarg)
|
||||||
int os_parse_cmd_args(int index, const char *optarg)
|
int os_parse_cmd_args(int index, const char *optarg)
|
||||||
{
|
{
|
||||||
switch (index) {
|
switch (index) {
|
||||||
#ifdef CONFIG_SLIRP
|
|
||||||
case QEMU_OPTION_smb:
|
|
||||||
error_report("The -smb option is deprecated. "
|
|
||||||
"Please use '-netdev user,smb=...' instead.");
|
|
||||||
if (net_slirp_smb(optarg) < 0)
|
|
||||||
exit(1);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case QEMU_OPTION_runas:
|
case QEMU_OPTION_runas:
|
||||||
user_pwd = getpwnam(optarg);
|
user_pwd = getpwnam(optarg);
|
||||||
if (user_pwd) {
|
if (user_pwd) {
|
||||||
|
|
|
@ -40,40 +40,6 @@ which is the default.
|
||||||
The ``-no-kvm'' argument is now a synonym for setting
|
The ``-no-kvm'' argument is now a synonym for setting
|
||||||
``-machine accel=tcg''.
|
``-machine accel=tcg''.
|
||||||
|
|
||||||
@subsection -tftp (since 2.6.0)
|
|
||||||
|
|
||||||
The ``-tftp /some/dir'' argument is replaced by either
|
|
||||||
``-netdev user,id=x,tftp=/some/dir '' (for pluggable NICs, accompanied
|
|
||||||
with ``-device ...,netdev=x''), or ``-nic user,tftp=/some/dir''
|
|
||||||
(for embedded NICs). The new syntax allows different settings to be
|
|
||||||
provided per NIC.
|
|
||||||
|
|
||||||
@subsection -bootp (since 2.6.0)
|
|
||||||
|
|
||||||
The ``-bootp /some/file'' argument is replaced by either
|
|
||||||
``-netdev user,id=x,bootp=/some/file '' (for pluggable NICs, accompanied
|
|
||||||
with ``-device ...,netdev=x''), or ``-nic user,bootp=/some/file''
|
|
||||||
(for embedded NICs). The new syntax allows different settings to be
|
|
||||||
provided per NIC.
|
|
||||||
|
|
||||||
@subsection -redir (since 2.6.0)
|
|
||||||
|
|
||||||
The ``-redir [tcp|udp]:hostport:[guestaddr]:guestport'' argument is
|
|
||||||
replaced by either
|
|
||||||
``-netdev user,id=x,hostfwd=[tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport''
|
|
||||||
(for pluggable NICs, accompanied with ``-device ...,netdev=x'') or
|
|
||||||
``-nic user,hostfwd=[tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport''
|
|
||||||
(for embedded NICs). The new syntax allows different settings to be
|
|
||||||
provided per NIC.
|
|
||||||
|
|
||||||
@subsection -smb (since 2.6.0)
|
|
||||||
|
|
||||||
The ``-smb /some/dir'' argument is replaced by either
|
|
||||||
``-netdev user,id=x,smb=/some/dir '' (for pluggable NICs, accompanied
|
|
||||||
with ``-device ...,netdev=x''), or ``-nic user,smb=/some/dir''
|
|
||||||
(for embedded NICs). The new syntax allows different settings to be
|
|
||||||
provided per NIC.
|
|
||||||
|
|
||||||
@subsection -usbdevice (since 2.10.0)
|
@subsection -usbdevice (since 2.10.0)
|
||||||
|
|
||||||
The ``-usbdevice DEV'' argument is now a synonym for setting
|
The ``-usbdevice DEV'' argument is now a synonym for setting
|
||||||
|
@ -82,15 +48,6 @@ would automatically enable USB support on the machine type.
|
||||||
If using the new syntax, USB support must be explicitly
|
If using the new syntax, USB support must be explicitly
|
||||||
enabled via the ``-machine usb=on'' argument.
|
enabled via the ``-machine usb=on'' argument.
|
||||||
|
|
||||||
@subsection -nodefconfig (since 2.11.0)
|
|
||||||
|
|
||||||
The ``-nodefconfig`` argument is a synonym for ``-no-user-config``.
|
|
||||||
|
|
||||||
@subsection -balloon (since 2.12.0)
|
|
||||||
|
|
||||||
The @option{--balloon virtio} argument has been superseded by
|
|
||||||
@option{--device virtio-balloon}.
|
|
||||||
|
|
||||||
@subsection -fsdev handle (since 2.12.0)
|
@subsection -fsdev handle (since 2.12.0)
|
||||||
|
|
||||||
The ``handle'' fsdev backend does not support symlinks and causes the 9p
|
The ``handle'' fsdev backend does not support symlinks and causes the 9p
|
||||||
|
@ -105,19 +62,6 @@ The @code{--no-frame} argument works with SDL 1.2 only. The other user
|
||||||
interfaces never implemented this in the first place. So this will be
|
interfaces never implemented this in the first place. So this will be
|
||||||
removed together with SDL 1.2 support.
|
removed together with SDL 1.2 support.
|
||||||
|
|
||||||
@subsection -rtc-td-hack (since 2.12.0)
|
|
||||||
|
|
||||||
The @code{-rtc-td-hack} option has been replaced by
|
|
||||||
@code{-rtc driftfix=slew}.
|
|
||||||
|
|
||||||
@subsection -localtime (since 2.12.0)
|
|
||||||
|
|
||||||
The @code{-localtime} option has been replaced by @code{-rtc base=localtime}.
|
|
||||||
|
|
||||||
@subsection -startdate (since 2.12.0)
|
|
||||||
|
|
||||||
The @code{-startdate} option has been replaced by @code{-rtc base=@var{date}}.
|
|
||||||
|
|
||||||
@subsection -virtioconsole (since 3.0.0)
|
@subsection -virtioconsole (since 3.0.0)
|
||||||
|
|
||||||
Option @option{-virtioconsole} has been replaced by
|
Option @option{-virtioconsole} has been replaced by
|
||||||
|
|
|
@ -454,16 +454,6 @@ modprobe i810_audio clocking=48000
|
||||||
@end example
|
@end example
|
||||||
ETEXI
|
ETEXI
|
||||||
|
|
||||||
DEF("balloon", HAS_ARG, QEMU_OPTION_balloon,
|
|
||||||
"-balloon virtio[,addr=str]\n"
|
|
||||||
" enable virtio balloon device (deprecated)\n", QEMU_ARCH_ALL)
|
|
||||||
STEXI
|
|
||||||
@item -balloon virtio[,addr=@var{addr}]
|
|
||||||
@findex -balloon
|
|
||||||
Enable virtio balloon device, optionally with PCI address @var{addr}. This
|
|
||||||
option is deprecated, use @option{-device virtio-balloon} instead.
|
|
||||||
ETEXI
|
|
||||||
|
|
||||||
DEF("device", HAS_ARG, QEMU_OPTION_device,
|
DEF("device", HAS_ARG, QEMU_OPTION_device,
|
||||||
"-device driver[,prop[=value][,...]]\n"
|
"-device driver[,prop[=value][,...]]\n"
|
||||||
" add device (based on driver)\n"
|
" add device (based on driver)\n"
|
||||||
|
@ -1721,9 +1711,6 @@ Windows 2000 is installed, you no longer need this option (this option
|
||||||
slows down the IDE transfers).
|
slows down the IDE transfers).
|
||||||
ETEXI
|
ETEXI
|
||||||
|
|
||||||
HXCOMM Deprecated by -rtc
|
|
||||||
DEF("rtc-td-hack", 0, QEMU_OPTION_rtc_td_hack, "", QEMU_ARCH_I386)
|
|
||||||
|
|
||||||
DEF("no-fd-bootchk", 0, QEMU_OPTION_no_fd_bootchk,
|
DEF("no-fd-bootchk", 0, QEMU_OPTION_no_fd_bootchk,
|
||||||
"-no-fd-bootchk disable boot signature checking for floppy disks\n",
|
"-no-fd-bootchk disable boot signature checking for floppy disks\n",
|
||||||
QEMU_ARCH_I386)
|
QEMU_ARCH_I386)
|
||||||
|
@ -1826,16 +1813,6 @@ STEXI
|
||||||
@table @option
|
@table @option
|
||||||
ETEXI
|
ETEXI
|
||||||
|
|
||||||
HXCOMM Legacy slirp options (now moved to -net user):
|
|
||||||
#ifdef CONFIG_SLIRP
|
|
||||||
DEF("tftp", HAS_ARG, QEMU_OPTION_tftp, "", QEMU_ARCH_ALL)
|
|
||||||
DEF("bootp", HAS_ARG, QEMU_OPTION_bootp, "", QEMU_ARCH_ALL)
|
|
||||||
DEF("redir", HAS_ARG, QEMU_OPTION_redir, "", QEMU_ARCH_ALL)
|
|
||||||
#ifndef _WIN32
|
|
||||||
DEF("smb", HAS_ARG, QEMU_OPTION_smb, "", QEMU_ARCH_ALL)
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
|
DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
|
||||||
#ifdef CONFIG_SLIRP
|
#ifdef CONFIG_SLIRP
|
||||||
"-netdev user,id=str[,ipv4[=on|off]][,net=addr[/mask]][,host=addr]\n"
|
"-netdev user,id=str[,ipv4[=on|off]][,net=addr[/mask]][,host=addr]\n"
|
||||||
|
@ -2163,11 +2140,6 @@ qemu-system-i386 -nic 'user,id=n1,guestfwd=tcp:10.0.2.100:1234-cmd:netcat 10.10
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
Note: Legacy stand-alone options -tftp, -bootp, -smb and -redir are still
|
|
||||||
processed and applied to -net user. Mixing them with the new configuration
|
|
||||||
syntax gives undefined results. Their use for new applications is discouraged
|
|
||||||
as they will be removed from future versions.
|
|
||||||
|
|
||||||
@item -netdev tap,id=@var{id}[,fd=@var{h}][,ifname=@var{name}][,script=@var{file}][,downscript=@var{dfile}][,br=@var{bridge}][,helper=@var{helper}]
|
@item -netdev tap,id=@var{id}[,fd=@var{h}][,ifname=@var{name}][,script=@var{file}][,downscript=@var{dfile}][,br=@var{bridge}][,helper=@var{helper}]
|
||||||
Configure a host TAP network backend with ID @var{id}.
|
Configure a host TAP network backend with ID @var{id}.
|
||||||
|
|
||||||
|
@ -3481,10 +3453,6 @@ ETEXI
|
||||||
HXCOMM Silently ignored for compatibility
|
HXCOMM Silently ignored for compatibility
|
||||||
DEF("clock", HAS_ARG, QEMU_OPTION_clock, "", QEMU_ARCH_ALL)
|
DEF("clock", HAS_ARG, QEMU_OPTION_clock, "", QEMU_ARCH_ALL)
|
||||||
|
|
||||||
HXCOMM Options deprecated by -rtc
|
|
||||||
DEF("localtime", 0, QEMU_OPTION_localtime, "", QEMU_ARCH_ALL)
|
|
||||||
DEF("startdate", HAS_ARG, QEMU_OPTION_startdate, "", QEMU_ARCH_ALL)
|
|
||||||
|
|
||||||
DEF("rtc", HAS_ARG, QEMU_OPTION_rtc, \
|
DEF("rtc", HAS_ARG, QEMU_OPTION_rtc, \
|
||||||
"-rtc [base=utc|localtime|date][,clock=host|rt|vm][,driftfix=none|slew]\n" \
|
"-rtc [base=utc|localtime|date][,clock=host|rt|vm][,driftfix=none|slew]\n" \
|
||||||
" set the RTC base and clock, enable drift fix for clock ticks (x86 only)\n",
|
" set the RTC base and clock, enable drift fix for clock ticks (x86 only)\n",
|
||||||
|
@ -3843,8 +3811,7 @@ Write device configuration to @var{file}. The @var{file} can be either filename
|
||||||
command line and device configuration into file or dash @code{-}) character to print the
|
command line and device configuration into file or dash @code{-}) character to print the
|
||||||
output to stdout. This can be later used as input file for @code{-readconfig} option.
|
output to stdout. This can be later used as input file for @code{-readconfig} option.
|
||||||
ETEXI
|
ETEXI
|
||||||
HXCOMM Deprecated, same as -no-user-config
|
|
||||||
DEF("nodefconfig", 0, QEMU_OPTION_nodefconfig, "", QEMU_ARCH_ALL)
|
|
||||||
DEF("no-user-config", 0, QEMU_OPTION_nouserconfig,
|
DEF("no-user-config", 0, QEMU_OPTION_nouserconfig,
|
||||||
"-no-user-config\n"
|
"-no-user-config\n"
|
||||||
" do not load default user-provided config files at startup\n",
|
" do not load default user-provided config files at startup\n",
|
||||||
|
@ -3855,6 +3822,7 @@ STEXI
|
||||||
The @code{-no-user-config} option makes QEMU not load any of the user-provided
|
The @code{-no-user-config} option makes QEMU not load any of the user-provided
|
||||||
config files on @var{sysconfdir}.
|
config files on @var{sysconfdir}.
|
||||||
ETEXI
|
ETEXI
|
||||||
|
|
||||||
DEF("trace", HAS_ARG, QEMU_OPTION_trace,
|
DEF("trace", HAS_ARG, QEMU_OPTION_trace,
|
||||||
"-trace [[enable=]<pattern>][,events=<file>][,file=<file>]\n"
|
"-trace [[enable=]<pattern>][,events=<file>][,file=<file>]\n"
|
||||||
" specify tracing options\n",
|
" specify tracing options\n",
|
||||||
|
|
|
@ -67,7 +67,6 @@ static void test_after_failed_device_add(void)
|
||||||
{
|
{
|
||||||
char driver[32];
|
char driver[32];
|
||||||
QDict *response;
|
QDict *response;
|
||||||
QDict *error;
|
|
||||||
|
|
||||||
snprintf(driver, sizeof(driver), "virtio-blk-%s",
|
snprintf(driver, sizeof(driver), "virtio-blk-%s",
|
||||||
qvirtio_get_dev_type());
|
qvirtio_get_dev_type());
|
||||||
|
@ -83,9 +82,7 @@ static void test_after_failed_device_add(void)
|
||||||
" 'drive': 'drive0'"
|
" 'drive': 'drive0'"
|
||||||
"}}", driver);
|
"}}", driver);
|
||||||
g_assert(response);
|
g_assert(response);
|
||||||
error = qdict_get_qdict(response, "error");
|
qmp_assert_error_class(response, "GenericError");
|
||||||
g_assert_cmpstr(qdict_get_try_str(error, "class"), ==, "GenericError");
|
|
||||||
qobject_unref(response);
|
|
||||||
|
|
||||||
/* Delete the drive */
|
/* Delete the drive */
|
||||||
drive_del();
|
drive_del();
|
||||||
|
|
|
@ -185,22 +185,12 @@ void mkimg(const char *file, const char *fmt, unsigned size_mb)
|
||||||
cli = g_strdup_printf("%s create -f %s %s %uM", qemu_img_abs_path,
|
cli = g_strdup_printf("%s create -f %s %s %uM", qemu_img_abs_path,
|
||||||
fmt, file, size_mb);
|
fmt, file, size_mb);
|
||||||
ret = g_spawn_command_line_sync(cli, &out, &out2, &rc, &err);
|
ret = g_spawn_command_line_sync(cli, &out, &out2, &rc, &err);
|
||||||
if (err) {
|
if (err || !g_spawn_check_exit_status(rc, &err)) {
|
||||||
fprintf(stderr, "%s\n", err->message);
|
fprintf(stderr, "%s\n", err->message);
|
||||||
g_error_free(err);
|
g_error_free(err);
|
||||||
}
|
}
|
||||||
g_assert(ret && !err);
|
g_assert(ret && !err);
|
||||||
|
|
||||||
/* In glib 2.34, we have g_spawn_check_exit_status. in 2.12, we don't.
|
|
||||||
* glib 2.43.91 implementation assumes that any non-zero is an error for
|
|
||||||
* windows, but uses extra precautions for Linux. However,
|
|
||||||
* 0 is only possible if the program exited normally, so that should be
|
|
||||||
* sufficient for our purposes on all platforms, here. */
|
|
||||||
if (rc) {
|
|
||||||
fprintf(stderr, "qemu-img returned status code %d\n", rc);
|
|
||||||
}
|
|
||||||
g_assert(!rc);
|
|
||||||
|
|
||||||
g_free(out);
|
g_free(out);
|
||||||
g_free(out2);
|
g_free(out2);
|
||||||
g_free(cli);
|
g_free(cli);
|
||||||
|
|
|
@ -1194,3 +1194,14 @@ bool qmp_rsp_is_err(QDict *rsp)
|
||||||
qobject_unref(rsp);
|
qobject_unref(rsp);
|
||||||
return !!error;
|
return !!error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qmp_assert_error_class(QDict *rsp, const char *class)
|
||||||
|
{
|
||||||
|
QDict *error = qdict_get_qdict(rsp, "error");
|
||||||
|
|
||||||
|
g_assert_cmpstr(qdict_get_try_str(error, "class"), ==, class);
|
||||||
|
g_assert_nonnull(qdict_get_try_str(error, "desc"));
|
||||||
|
g_assert(!qdict_haskey(rsp, "return"));
|
||||||
|
|
||||||
|
qobject_unref(rsp);
|
||||||
|
}
|
||||||
|
|
|
@ -1004,4 +1004,13 @@ void qtest_qmp_device_del(const char *id);
|
||||||
*/
|
*/
|
||||||
bool qmp_rsp_is_err(QDict *rsp);
|
bool qmp_rsp_is_err(QDict *rsp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qmp_assert_error_class:
|
||||||
|
* @rsp: QMP response to check for error
|
||||||
|
* @class: an error class
|
||||||
|
*
|
||||||
|
* Assert the response has the given error class and discard @rsp.
|
||||||
|
*/
|
||||||
|
void qmp_assert_error_class(QDict *rsp, const char *class);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -137,6 +137,8 @@
|
||||||
'data': {'ud1a': 'UserDefOne', '*ud1b': 'UserDefOne'},
|
'data': {'ud1a': 'UserDefOne', '*ud1b': 'UserDefOne'},
|
||||||
'returns': 'UserDefTwo' }
|
'returns': 'UserDefTwo' }
|
||||||
|
|
||||||
|
{ 'command': 'cmd-success-response', 'data': {}, 'success-response': false }
|
||||||
|
|
||||||
# Returning a non-dictionary requires a name from the whitelist
|
# Returning a non-dictionary requires a name from the whitelist
|
||||||
{ 'command': 'guest-get-time', 'data': {'a': 'int', '*b': 'int' },
|
{ 'command': 'guest-get-time', 'data': {'a': 'int', '*b': 'int' },
|
||||||
'returns': 'int' }
|
'returns': 'int' }
|
||||||
|
|
|
@ -156,6 +156,8 @@ object q_obj_user_def_cmd2-arg
|
||||||
member ud1b: UserDefOne optional=True
|
member ud1b: UserDefOne optional=True
|
||||||
command user_def_cmd2 q_obj_user_def_cmd2-arg -> UserDefTwo
|
command user_def_cmd2 q_obj_user_def_cmd2-arg -> UserDefTwo
|
||||||
gen=True success_response=True boxed=False oob=False preconfig=False
|
gen=True success_response=True boxed=False oob=False preconfig=False
|
||||||
|
command cmd-success-response None -> None
|
||||||
|
gen=True success_response=False boxed=False oob=False preconfig=False
|
||||||
object q_obj_guest-get-time-arg
|
object q_obj_guest-get-time-arg
|
||||||
member a: int optional=False
|
member a: int optional=False
|
||||||
member b: int optional=True
|
member b: int optional=True
|
||||||
|
|
|
@ -197,6 +197,19 @@ static void add_query_tests(QmpSchema *schema)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_object_add_without_props(void)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
QDict *resp;
|
||||||
|
|
||||||
|
qts = qtest_init(common_args);
|
||||||
|
resp = qtest_qmp(qts, "{'execute': 'object-add', 'arguments':"
|
||||||
|
" {'qom-type': 'memory-backend-ram', 'id': 'ram1' } }");
|
||||||
|
g_assert_nonnull(resp);
|
||||||
|
qmp_assert_error_class(resp, "GenericError");
|
||||||
|
qtest_quit(qts);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
QmpSchema schema;
|
QmpSchema schema;
|
||||||
|
@ -206,6 +219,11 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
qmp_schema_init(&schema);
|
qmp_schema_init(&schema);
|
||||||
add_query_tests(&schema);
|
add_query_tests(&schema);
|
||||||
|
|
||||||
|
qtest_add_func("qmp/object-add-without-props",
|
||||||
|
test_object_add_without_props);
|
||||||
|
/* TODO: add coverage of generic object-add failure modes */
|
||||||
|
|
||||||
ret = g_test_run();
|
ret = g_test_run();
|
||||||
|
|
||||||
qmp_schema_cleanup(&schema);
|
qmp_schema_cleanup(&schema);
|
||||||
|
|
|
@ -21,15 +21,6 @@
|
||||||
|
|
||||||
const char common_args[] = "-nodefaults -machine none";
|
const char common_args[] = "-nodefaults -machine none";
|
||||||
|
|
||||||
static const char *get_error_class(QDict *resp)
|
|
||||||
{
|
|
||||||
QDict *error = qdict_get_qdict(resp, "error");
|
|
||||||
const char *desc = qdict_get_try_str(error, "desc");
|
|
||||||
|
|
||||||
g_assert(desc);
|
|
||||||
return error ? qdict_get_try_str(error, "class") : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void test_version(QObject *version)
|
static void test_version(QObject *version)
|
||||||
{
|
{
|
||||||
Visitor *v;
|
Visitor *v;
|
||||||
|
@ -42,15 +33,12 @@ static void test_version(QObject *version)
|
||||||
visit_free(v);
|
visit_free(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool recovered(QTestState *qts)
|
static void assert_recovered(QTestState *qts)
|
||||||
{
|
{
|
||||||
QDict *resp;
|
QDict *resp;
|
||||||
bool ret;
|
|
||||||
|
|
||||||
resp = qtest_qmp(qts, "{ 'execute': 'no-such-cmd' }");
|
resp = qtest_qmp(qts, "{ 'execute': 'no-such-cmd' }");
|
||||||
ret = !strcmp(get_error_class(resp), "CommandNotFound");
|
qmp_assert_error_class(resp, "CommandNotFound");
|
||||||
qobject_unref(resp);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_malformed(QTestState *qts)
|
static void test_malformed(QTestState *qts)
|
||||||
|
@ -60,73 +48,61 @@ static void test_malformed(QTestState *qts)
|
||||||
/* syntax error */
|
/* syntax error */
|
||||||
qtest_qmp_send_raw(qts, "{]\n");
|
qtest_qmp_send_raw(qts, "{]\n");
|
||||||
resp = qtest_qmp_receive(qts);
|
resp = qtest_qmp_receive(qts);
|
||||||
g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
|
qmp_assert_error_class(resp, "GenericError");
|
||||||
qobject_unref(resp);
|
assert_recovered(qts);
|
||||||
g_assert(recovered(qts));
|
|
||||||
|
|
||||||
/* lexical error: impossible byte outside string */
|
/* lexical error: impossible byte outside string */
|
||||||
qtest_qmp_send_raw(qts, "{\xFF");
|
qtest_qmp_send_raw(qts, "{\xFF");
|
||||||
resp = qtest_qmp_receive(qts);
|
resp = qtest_qmp_receive(qts);
|
||||||
g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
|
qmp_assert_error_class(resp, "GenericError");
|
||||||
qobject_unref(resp);
|
assert_recovered(qts);
|
||||||
g_assert(recovered(qts));
|
|
||||||
|
|
||||||
/* lexical error: funny control character outside string */
|
/* lexical error: funny control character outside string */
|
||||||
qtest_qmp_send_raw(qts, "{\x01");
|
qtest_qmp_send_raw(qts, "{\x01");
|
||||||
resp = qtest_qmp_receive(qts);
|
resp = qtest_qmp_receive(qts);
|
||||||
g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
|
qmp_assert_error_class(resp, "GenericError");
|
||||||
qobject_unref(resp);
|
assert_recovered(qts);
|
||||||
g_assert(recovered(qts));
|
|
||||||
|
|
||||||
/* lexical error: impossible byte in string */
|
/* lexical error: impossible byte in string */
|
||||||
qtest_qmp_send_raw(qts, "{'bad \xFF");
|
qtest_qmp_send_raw(qts, "{'bad \xFF");
|
||||||
resp = qtest_qmp_receive(qts);
|
resp = qtest_qmp_receive(qts);
|
||||||
g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
|
qmp_assert_error_class(resp, "GenericError");
|
||||||
qobject_unref(resp);
|
assert_recovered(qts);
|
||||||
g_assert(recovered(qts));
|
|
||||||
|
|
||||||
/* lexical error: control character in string */
|
/* lexical error: control character in string */
|
||||||
qtest_qmp_send_raw(qts, "{'execute': 'nonexistent', 'id':'\n");
|
qtest_qmp_send_raw(qts, "{'execute': 'nonexistent', 'id':'\n");
|
||||||
resp = qtest_qmp_receive(qts);
|
resp = qtest_qmp_receive(qts);
|
||||||
g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
|
qmp_assert_error_class(resp, "GenericError");
|
||||||
qobject_unref(resp);
|
assert_recovered(qts);
|
||||||
g_assert(recovered(qts));
|
|
||||||
|
|
||||||
/* lexical error: interpolation */
|
/* lexical error: interpolation */
|
||||||
qtest_qmp_send_raw(qts, "%%p\n");
|
qtest_qmp_send_raw(qts, "%%p\n");
|
||||||
/* two errors, one for "%", one for "p" */
|
/* two errors, one for "%", one for "p" */
|
||||||
resp = qtest_qmp_receive(qts);
|
resp = qtest_qmp_receive(qts);
|
||||||
g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
|
qmp_assert_error_class(resp, "GenericError");
|
||||||
qobject_unref(resp);
|
|
||||||
resp = qtest_qmp_receive(qts);
|
resp = qtest_qmp_receive(qts);
|
||||||
g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
|
qmp_assert_error_class(resp, "GenericError");
|
||||||
qobject_unref(resp);
|
assert_recovered(qts);
|
||||||
g_assert(recovered(qts));
|
|
||||||
|
|
||||||
/* Not even a dictionary */
|
/* Not even a dictionary */
|
||||||
resp = qtest_qmp(qts, "null");
|
resp = qtest_qmp(qts, "null");
|
||||||
g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
|
qmp_assert_error_class(resp, "GenericError");
|
||||||
qobject_unref(resp);
|
|
||||||
|
|
||||||
/* No "execute" key */
|
/* No "execute" key */
|
||||||
resp = qtest_qmp(qts, "{}");
|
resp = qtest_qmp(qts, "{}");
|
||||||
g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
|
qmp_assert_error_class(resp, "GenericError");
|
||||||
qobject_unref(resp);
|
|
||||||
|
|
||||||
/* "execute" isn't a string */
|
/* "execute" isn't a string */
|
||||||
resp = qtest_qmp(qts, "{ 'execute': true }");
|
resp = qtest_qmp(qts, "{ 'execute': true }");
|
||||||
g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
|
qmp_assert_error_class(resp, "GenericError");
|
||||||
qobject_unref(resp);
|
|
||||||
|
|
||||||
/* "arguments" isn't a dictionary */
|
/* "arguments" isn't a dictionary */
|
||||||
resp = qtest_qmp(qts, "{ 'execute': 'no-such-cmd', 'arguments': [] }");
|
resp = qtest_qmp(qts, "{ 'execute': 'no-such-cmd', 'arguments': [] }");
|
||||||
g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
|
qmp_assert_error_class(resp, "GenericError");
|
||||||
qobject_unref(resp);
|
|
||||||
|
|
||||||
/* extra key */
|
/* extra key */
|
||||||
resp = qtest_qmp(qts, "{ 'execute': 'no-such-cmd', 'extra': true }");
|
resp = qtest_qmp(qts, "{ 'execute': 'no-such-cmd', 'extra': true }");
|
||||||
g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
|
qmp_assert_error_class(resp, "GenericError");
|
||||||
qobject_unref(resp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_qmp_protocol(void)
|
static void test_qmp_protocol(void)
|
||||||
|
@ -148,8 +124,7 @@ static void test_qmp_protocol(void)
|
||||||
|
|
||||||
/* Test valid command before handshake */
|
/* Test valid command before handshake */
|
||||||
resp = qtest_qmp(qts, "{ 'execute': 'query-version' }");
|
resp = qtest_qmp(qts, "{ 'execute': 'query-version' }");
|
||||||
g_assert_cmpstr(get_error_class(resp), ==, "CommandNotFound");
|
qmp_assert_error_class(resp, "CommandNotFound");
|
||||||
qobject_unref(resp);
|
|
||||||
|
|
||||||
/* Test malformed commands before handshake */
|
/* Test malformed commands before handshake */
|
||||||
test_malformed(qts);
|
test_malformed(qts);
|
||||||
|
@ -162,8 +137,7 @@ static void test_qmp_protocol(void)
|
||||||
|
|
||||||
/* Test repeated handshake */
|
/* Test repeated handshake */
|
||||||
resp = qtest_qmp(qts, "{ 'execute': 'qmp_capabilities' }");
|
resp = qtest_qmp(qts, "{ 'execute': 'qmp_capabilities' }");
|
||||||
g_assert_cmpstr(get_error_class(resp), ==, "CommandNotFound");
|
qmp_assert_error_class(resp, "CommandNotFound");
|
||||||
qobject_unref(resp);
|
|
||||||
|
|
||||||
/* Test valid command */
|
/* Test valid command */
|
||||||
resp = qtest_qmp(qts, "{ 'execute': 'query-version' }");
|
resp = qtest_qmp(qts, "{ 'execute': 'query-version' }");
|
||||||
|
@ -182,9 +156,8 @@ static void test_qmp_protocol(void)
|
||||||
|
|
||||||
/* Test command failure with 'id' */
|
/* Test command failure with 'id' */
|
||||||
resp = qtest_qmp(qts, "{ 'execute': 'human-monitor-command', 'id': 2 }");
|
resp = qtest_qmp(qts, "{ 'execute': 'human-monitor-command', 'id': 2 }");
|
||||||
g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
|
|
||||||
g_assert_cmpint(qdict_get_int(resp, "id"), ==, 2);
|
g_assert_cmpint(qdict_get_int(resp, "id"), ==, 2);
|
||||||
qobject_unref(resp);
|
qmp_assert_error_class(resp, "GenericError");
|
||||||
|
|
||||||
qtest_quit(qts);
|
qtest_quit(qts);
|
||||||
}
|
}
|
||||||
|
@ -348,6 +321,19 @@ static void test_qmp_preconfig(void)
|
||||||
qtest_quit(qs);
|
qtest_quit(qs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_qom_set_without_value(void)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
QDict *resp;
|
||||||
|
|
||||||
|
qts = qtest_init(common_args);
|
||||||
|
resp = qtest_qmp(qts, "{'execute': 'qom-set', 'arguments':"
|
||||||
|
" { 'path': '/machine', 'property': 'rtc-time' } }");
|
||||||
|
g_assert_nonnull(resp);
|
||||||
|
qmp_assert_error_class(resp, "GenericError");
|
||||||
|
qtest_quit(qts);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
g_test_init(&argc, &argv, NULL);
|
g_test_init(&argc, &argv, NULL);
|
||||||
|
@ -355,6 +341,7 @@ int main(int argc, char *argv[])
|
||||||
qtest_add_func("qmp/protocol", test_qmp_protocol);
|
qtest_add_func("qmp/protocol", test_qmp_protocol);
|
||||||
qtest_add_func("qmp/oob", test_qmp_oob);
|
qtest_add_func("qmp/oob", test_qmp_oob);
|
||||||
qtest_add_func("qmp/preconfig", test_qmp_preconfig);
|
qtest_add_func("qmp/preconfig", test_qmp_preconfig);
|
||||||
|
qtest_add_func("qmp/qom-set-without-value", test_qom_set_without_value);
|
||||||
|
|
||||||
return g_test_run();
|
return g_test_run();
|
||||||
}
|
}
|
||||||
|
|
|
@ -244,17 +244,12 @@ static void test_qga_invalid_id(gconstpointer fix)
|
||||||
static void test_qga_invalid_oob(gconstpointer fix)
|
static void test_qga_invalid_oob(gconstpointer fix)
|
||||||
{
|
{
|
||||||
const TestFixture *fixture = fix;
|
const TestFixture *fixture = fix;
|
||||||
QDict *ret, *error;
|
QDict *ret;
|
||||||
const char *class;
|
|
||||||
|
|
||||||
ret = qmp_fd(fixture->fd, "{'exec-oob': 'guest-ping'}");
|
ret = qmp_fd(fixture->fd, "{'exec-oob': 'guest-ping'}");
|
||||||
g_assert_nonnull(ret);
|
g_assert_nonnull(ret);
|
||||||
|
|
||||||
error = qdict_get_qdict(ret, "error");
|
qmp_assert_error_class(ret, "GenericError");
|
||||||
class = qdict_get_try_str(error, "class");
|
|
||||||
g_assert_cmpstr(class, ==, "GenericError");
|
|
||||||
|
|
||||||
qobject_unref(ret);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_qga_invalid_args(gconstpointer fix)
|
static void test_qga_invalid_args(gconstpointer fix)
|
||||||
|
|
|
@ -32,6 +32,10 @@ void qmp_test_flags_command(Error **errp)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qmp_cmd_success_response(Error **errp)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
Empty2 *qmp_user_def_cmd0(Error **errp)
|
Empty2 *qmp_user_def_cmd0(Error **errp)
|
||||||
{
|
{
|
||||||
return g_new0(Empty2, 1);
|
return g_new0(Empty2, 1);
|
||||||
|
@ -153,6 +157,17 @@ static void test_dispatch_cmd_failure(void)
|
||||||
qobject_unref(req);
|
qobject_unref(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_dispatch_cmd_success_response(void)
|
||||||
|
{
|
||||||
|
QDict *req = qdict_new();
|
||||||
|
QDict *resp;
|
||||||
|
|
||||||
|
qdict_put_str(req, "execute", "cmd-success-response");
|
||||||
|
resp = qmp_dispatch(&qmp_commands, QOBJECT(req), false);
|
||||||
|
g_assert_null(resp);
|
||||||
|
qobject_unref(req);
|
||||||
|
}
|
||||||
|
|
||||||
static QObject *test_qmp_dispatch(QDict *req)
|
static QObject *test_qmp_dispatch(QDict *req)
|
||||||
{
|
{
|
||||||
QDict *resp;
|
QDict *resp;
|
||||||
|
@ -289,6 +304,8 @@ int main(int argc, char **argv)
|
||||||
g_test_add_func("/qmp/dispatch_cmd", test_dispatch_cmd);
|
g_test_add_func("/qmp/dispatch_cmd", test_dispatch_cmd);
|
||||||
g_test_add_func("/qmp/dispatch_cmd_failure", test_dispatch_cmd_failure);
|
g_test_add_func("/qmp/dispatch_cmd_failure", test_dispatch_cmd_failure);
|
||||||
g_test_add_func("/qmp/dispatch_cmd_io", test_dispatch_cmd_io);
|
g_test_add_func("/qmp/dispatch_cmd_io", test_dispatch_cmd_io);
|
||||||
|
g_test_add_func("/qmp/dispatch_cmd_success_response",
|
||||||
|
test_dispatch_cmd_success_response);
|
||||||
g_test_add_func("/qmp/dealloc_types", test_dealloc_types);
|
g_test_add_func("/qmp/dealloc_types", test_dealloc_types);
|
||||||
g_test_add_func("/qmp/dealloc_partial", test_dealloc_partial);
|
g_test_add_func("/qmp/dealloc_partial", test_dealloc_partial);
|
||||||
|
|
||||||
|
|
132
vl.c
132
vl.c
|
@ -823,44 +823,33 @@ int qemu_timedate_diff(struct tm *tm)
|
||||||
return seconds - qemu_time();
|
return seconds - qemu_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void configure_rtc_date_offset(const char *startdate, int legacy)
|
static void configure_rtc_date_offset(const char *startdate)
|
||||||
{
|
{
|
||||||
time_t rtc_start_date;
|
time_t rtc_start_date;
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
|
|
||||||
if (!strcmp(startdate, "now") && legacy) {
|
if (sscanf(startdate, "%d-%d-%dT%d:%d:%d", &tm.tm_year, &tm.tm_mon,
|
||||||
rtc_date_offset = -1;
|
&tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) == 6) {
|
||||||
|
/* OK */
|
||||||
|
} else if (sscanf(startdate, "%d-%d-%d",
|
||||||
|
&tm.tm_year, &tm.tm_mon, &tm.tm_mday) == 3) {
|
||||||
|
tm.tm_hour = 0;
|
||||||
|
tm.tm_min = 0;
|
||||||
|
tm.tm_sec = 0;
|
||||||
} else {
|
} else {
|
||||||
if (sscanf(startdate, "%d-%d-%dT%d:%d:%d",
|
goto date_fail;
|
||||||
&tm.tm_year,
|
|
||||||
&tm.tm_mon,
|
|
||||||
&tm.tm_mday,
|
|
||||||
&tm.tm_hour,
|
|
||||||
&tm.tm_min,
|
|
||||||
&tm.tm_sec) == 6) {
|
|
||||||
/* OK */
|
|
||||||
} else if (sscanf(startdate, "%d-%d-%d",
|
|
||||||
&tm.tm_year,
|
|
||||||
&tm.tm_mon,
|
|
||||||
&tm.tm_mday) == 3) {
|
|
||||||
tm.tm_hour = 0;
|
|
||||||
tm.tm_min = 0;
|
|
||||||
tm.tm_sec = 0;
|
|
||||||
} else {
|
|
||||||
goto date_fail;
|
|
||||||
}
|
|
||||||
tm.tm_year -= 1900;
|
|
||||||
tm.tm_mon--;
|
|
||||||
rtc_start_date = mktimegm(&tm);
|
|
||||||
if (rtc_start_date == -1) {
|
|
||||||
date_fail:
|
|
||||||
error_report("invalid date format");
|
|
||||||
error_printf("valid formats: "
|
|
||||||
"'2006-06-17T16:01:21' or '2006-06-17'\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
rtc_date_offset = qemu_time() - rtc_start_date;
|
|
||||||
}
|
}
|
||||||
|
tm.tm_year -= 1900;
|
||||||
|
tm.tm_mon--;
|
||||||
|
rtc_start_date = mktimegm(&tm);
|
||||||
|
if (rtc_start_date == -1) {
|
||||||
|
date_fail:
|
||||||
|
error_report("invalid date format");
|
||||||
|
error_printf("valid formats: "
|
||||||
|
"'2006-06-17T16:01:21' or '2006-06-17'\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
rtc_date_offset = qemu_time() - rtc_start_date;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void configure_rtc(QemuOpts *opts)
|
static void configure_rtc(QemuOpts *opts)
|
||||||
|
@ -878,7 +867,7 @@ static void configure_rtc(QemuOpts *opts)
|
||||||
"-rtc base=localtime");
|
"-rtc base=localtime");
|
||||||
replay_add_blocker(blocker);
|
replay_add_blocker(blocker);
|
||||||
} else {
|
} else {
|
||||||
configure_rtc_date_offset(value, 0);
|
configure_rtc_date_offset(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
value = qemu_opt_get(opts, "clock");
|
value = qemu_opt_get(opts, "clock");
|
||||||
|
@ -2125,36 +2114,6 @@ static void parse_display(const char *p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int balloon_parse(const char *arg)
|
|
||||||
{
|
|
||||||
QemuOpts *opts;
|
|
||||||
|
|
||||||
warn_report("This option is deprecated. "
|
|
||||||
"Use '--device virtio-balloon' to enable the balloon device.");
|
|
||||||
|
|
||||||
if (strcmp(arg, "none") == 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strncmp(arg, "virtio", 6)) {
|
|
||||||
if (arg[6] == ',') {
|
|
||||||
/* have params -> parse them */
|
|
||||||
opts = qemu_opts_parse_noisily(qemu_find_opts("device"), arg + 7,
|
|
||||||
false);
|
|
||||||
if (!opts)
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
/* create empty opts */
|
|
||||||
opts = qemu_opts_create(qemu_find_opts("device"), NULL, 0,
|
|
||||||
&error_abort);
|
|
||||||
}
|
|
||||||
qemu_opt_set(opts, "driver", "virtio-balloon", &error_abort);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *qemu_find_file(int type, const char *name)
|
char *qemu_find_file(int type, const char *name)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -3027,7 +2986,6 @@ int main(int argc, char **argv, char **envp)
|
||||||
|
|
||||||
popt = lookup_opt(argc, argv, &optarg, &optind);
|
popt = lookup_opt(argc, argv, &optarg, &optind);
|
||||||
switch (popt->index) {
|
switch (popt->index) {
|
||||||
case QEMU_OPTION_nodefconfig:
|
|
||||||
case QEMU_OPTION_nouserconfig:
|
case QEMU_OPTION_nouserconfig:
|
||||||
userconfig = false;
|
userconfig = false;
|
||||||
break;
|
break;
|
||||||
|
@ -3207,24 +3165,6 @@ int main(int argc, char **argv, char **envp)
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_SLIRP
|
|
||||||
case QEMU_OPTION_tftp:
|
|
||||||
error_report("The -tftp option is deprecated. "
|
|
||||||
"Please use '-netdev user,tftp=...' instead.");
|
|
||||||
legacy_tftp_prefix = optarg;
|
|
||||||
break;
|
|
||||||
case QEMU_OPTION_bootp:
|
|
||||||
error_report("The -bootp option is deprecated. "
|
|
||||||
"Please use '-netdev user,bootfile=...' instead.");
|
|
||||||
legacy_bootp_filename = optarg;
|
|
||||||
break;
|
|
||||||
case QEMU_OPTION_redir:
|
|
||||||
error_report("The -redir option is deprecated. "
|
|
||||||
"Please use '-netdev user,hostfwd=...' instead.");
|
|
||||||
if (net_slirp_redir(optarg) < 0)
|
|
||||||
exit(1);
|
|
||||||
break;
|
|
||||||
#endif
|
#endif
|
||||||
case QEMU_OPTION_bt:
|
case QEMU_OPTION_bt:
|
||||||
add_device_config(DEV_BT, optarg);
|
add_device_config(DEV_BT, optarg);
|
||||||
|
@ -3298,11 +3238,6 @@ int main(int argc, char **argv, char **envp)
|
||||||
case QEMU_OPTION_k:
|
case QEMU_OPTION_k:
|
||||||
keyboard_layout = optarg;
|
keyboard_layout = optarg;
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_localtime:
|
|
||||||
rtc_utc = 0;
|
|
||||||
warn_report("This option is deprecated, "
|
|
||||||
"use '-rtc base=localtime' instead.");
|
|
||||||
break;
|
|
||||||
case QEMU_OPTION_vga:
|
case QEMU_OPTION_vga:
|
||||||
vga_model = optarg;
|
vga_model = optarg;
|
||||||
default_vga = 0;
|
default_vga = 0;
|
||||||
|
@ -3555,18 +3490,6 @@ int main(int argc, char **argv, char **envp)
|
||||||
case QEMU_OPTION_win2k_hack:
|
case QEMU_OPTION_win2k_hack:
|
||||||
win2k_install_hack = 1;
|
win2k_install_hack = 1;
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_rtc_td_hack: {
|
|
||||||
static GlobalProperty slew_lost_ticks = {
|
|
||||||
.driver = "mc146818rtc",
|
|
||||||
.property = "lost_tick_policy",
|
|
||||||
.value = "slew",
|
|
||||||
};
|
|
||||||
|
|
||||||
qdev_prop_register_global(&slew_lost_ticks);
|
|
||||||
warn_report("This option is deprecated, "
|
|
||||||
"use '-rtc driftfix=slew' instead.");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case QEMU_OPTION_acpitable:
|
case QEMU_OPTION_acpitable:
|
||||||
opts = qemu_opts_parse_noisily(qemu_find_opts("acpi"),
|
opts = qemu_opts_parse_noisily(qemu_find_opts("acpi"),
|
||||||
optarg, true);
|
optarg, true);
|
||||||
|
@ -3658,12 +3581,6 @@ int main(int argc, char **argv, char **envp)
|
||||||
case QEMU_OPTION_no_hpet:
|
case QEMU_OPTION_no_hpet:
|
||||||
no_hpet = 1;
|
no_hpet = 1;
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_balloon:
|
|
||||||
if (balloon_parse(optarg) < 0) {
|
|
||||||
error_report("unknown -balloon argument %s", optarg);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case QEMU_OPTION_no_reboot:
|
case QEMU_OPTION_no_reboot:
|
||||||
no_reboot = 1;
|
no_reboot = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -3758,10 +3675,6 @@ int main(int argc, char **argv, char **envp)
|
||||||
*/
|
*/
|
||||||
warn_report("This option is ignored and will be removed soon");
|
warn_report("This option is ignored and will be removed soon");
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_startdate:
|
|
||||||
warn_report("This option is deprecated, use '-rtc base=' instead.");
|
|
||||||
configure_rtc_date_offset(optarg, 1);
|
|
||||||
break;
|
|
||||||
case QEMU_OPTION_rtc:
|
case QEMU_OPTION_rtc:
|
||||||
opts = qemu_opts_parse_noisily(qemu_find_opts("rtc"), optarg,
|
opts = qemu_opts_parse_noisily(qemu_find_opts("rtc"), optarg,
|
||||||
false);
|
false);
|
||||||
|
@ -3961,7 +3874,6 @@ int main(int argc, char **argv, char **envp)
|
||||||
case QEMU_OPTION_enable_sync_profile:
|
case QEMU_OPTION_enable_sync_profile:
|
||||||
qsp_enable();
|
qsp_enable();
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_nodefconfig:
|
|
||||||
case QEMU_OPTION_nouserconfig:
|
case QEMU_OPTION_nouserconfig:
|
||||||
/* Nothing to be parsed here. Especially, do not error out below. */
|
/* Nothing to be parsed here. Especially, do not error out below. */
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue