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:
Peter Maydell 2018-09-24 12:28:36 +01:00
commit 09d8277eb0
19 changed files with 158 additions and 395 deletions

View File

@ -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 \

View File

@ -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:

View File

@ -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);

View File

@ -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

View File

@ -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) {

View File

@ -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) {

View File

@ -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

View File

@ -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",

View File

@ -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();

View File

@ -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);

View File

@ -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);
}

View File

@ -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

View File

@ -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' }

View File

@ -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

View File

@ -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);

View File

@ -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();
} }

View File

@ -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)

View File

@ -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
View File

@ -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;