Rather unnecessarily this function returned the parsed qemu version. This complicates further refactoring, so I have changed the function not to return this, and instead there is a separate function you have to call to get the version struct (‘guestfs_int_qemu_version’). Apart from a tiny amount of extra copying this is simply refactoring of the interface between the direct-mode backend and the qemu query functions. --- lib/guestfs-internal.h | 3 ++- lib/launch-direct.c | 3 ++- lib/qemu.c | 29 +++++++++++++++++++---------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/lib/guestfs-internal.h b/lib/guestfs-internal.h index 7269fbeba..2ca258cb3 100644 --- a/lib/guestfs-internal.h +++ b/lib/guestfs-internal.h @@ -979,7 +979,8 @@ void guestfs_int_init_unix_backend (void) __attribute__((constructor)); /* qemu.c */ struct qemu_data; -extern struct qemu_data *guestfs_int_test_qemu (guestfs_h *g, struct version *qemu_version); +extern struct qemu_data *guestfs_int_test_qemu (guestfs_h *g); +extern struct version guestfs_int_qemu_version (guestfs_h *g, struct qemu_data *); extern int guestfs_int_qemu_supports (guestfs_h *g, const struct qemu_data *, const char *option); extern int guestfs_int_qemu_supports_device (guestfs_h *g, const struct qemu_data *, const char *device_name); extern char *guestfs_int_drive_source_qemu_param (guestfs_h *g, const struct drive_source *src); diff --git a/lib/launch-direct.c b/lib/launch-direct.c index 3b848165c..685e42468 100644 --- a/lib/launch-direct.c +++ b/lib/launch-direct.c @@ -402,9 +402,10 @@ launch_direct (guestfs_h *g, void *datav, const char *arg) /* Get qemu help text and version. */ if (data->qemu_data == NULL) { - data->qemu_data = guestfs_int_test_qemu (g, &data->qemu_version); + data->qemu_data = guestfs_int_test_qemu (g); if (data->qemu_data == NULL) goto cleanup0; + data->qemu_version = guestfs_int_qemu_version (g, data->qemu_data); } /* Using virtio-serial, we need to create a local Unix domain socket diff --git a/lib/qemu.c b/lib/qemu.c index 41098a20b..b4f4c84f6 100644 --- a/lib/qemu.c +++ b/lib/qemu.c @@ -46,9 +46,12 @@ struct qemu_data { char *qemu_help; /* Output of qemu -help. */ char *qemu_devices; /* Output of qemu -device ? */ + + /* The following fields are derived from the fields above. */ + struct version qemu_version; /* Parsed qemu version number. */ }; -static int test_qemu (guestfs_h *g, struct qemu_data *data, struct version *qemu_version); +static int test_qemu (guestfs_h *g, struct qemu_data *data); static void parse_qemu_version (guestfs_h *g, const char *, struct version *qemu_version); static void read_all (guestfs_h *g, void *retv, const char *buf, size_t len); @@ -64,14 +67,11 @@ static void read_all (guestfs_h *g, void *retv, const char *buf, size_t len); * the version of qemu what options this qemu supports, and * C<qemu -device ?> so we know what devices are available. * - * The version number of qemu (from the C<-help> output) is saved in - * C<&qemu_version>. - * * This caches the results in the cachedir so that as long as the qemu * binary does not change, calling this is effectively free. */ struct qemu_data * -guestfs_int_test_qemu (guestfs_h *g, struct version *qemu_version) +guestfs_int_test_qemu (guestfs_h *g) { struct qemu_data *data; struct stat statbuf; @@ -128,7 +128,7 @@ guestfs_int_test_qemu (guestfs_h *g, struct version *qemu_version) return NULL; } - parse_qemu_version (g, data->qemu_help, qemu_version); + parse_qemu_version (g, data->qemu_help, &data->qemu_version); if (guestfs_int_read_whole_file (g, qemu_devices_filename, &data->qemu_devices, NULL) == -1) { @@ -142,11 +142,13 @@ guestfs_int_test_qemu (guestfs_h *g, struct version *qemu_version) do_test: data = safe_calloc (g, 1, sizeof *data); - if (test_qemu (g, data, qemu_version) == -1) { + if (test_qemu (g, data) == -1) { guestfs_int_free_qemu_data (data); return NULL; } + parse_qemu_version (g, data->qemu_help, &data->qemu_version); + /* Now memoize the qemu output in the cache directory. */ debug (g, "saving test results"); @@ -203,7 +205,7 @@ guestfs_int_test_qemu (guestfs_h *g, struct version *qemu_version) } static int -test_qemu (guestfs_h *g, struct qemu_data *data, struct version *qemu_version) +test_qemu (guestfs_h *g, struct qemu_data *data) { CLEANUP_CMD_CLOSE struct command *cmd1 = guestfs_int_new_command (g); CLEANUP_CMD_CLOSE struct command *cmd2 = guestfs_int_new_command (g); @@ -219,8 +221,6 @@ test_qemu (guestfs_h *g, struct qemu_data *data, struct version *qemu_version) if (r == -1 || !WIFEXITED (r) || WEXITSTATUS (r) != 0) goto error; - parse_qemu_version (g, data->qemu_help, qemu_version); - guestfs_int_cmd_add_arg (cmd2, g->hv); guestfs_int_cmd_add_arg (cmd2, "-display"); guestfs_int_cmd_add_arg (cmd2, "none"); @@ -278,6 +278,15 @@ read_all (guestfs_h *g, void *retv, const char *buf, size_t len) } /** + * Return the parsed version of qemu. + */ +struct version +guestfs_int_qemu_version (guestfs_h *g, struct qemu_data *data) +{ + return data->qemu_version; +} + +/** * Test if option is supported by qemu command line (just by grepping * the help text). */ -- 2.13.2