diff options
-rw-r--r-- | docs/interop/qemu-ga.rst | 5 | ||||
-rw-r--r-- | qga/commands-win32.c | 8 | ||||
-rw-r--r-- | qga/commands.c | 9 | ||||
-rw-r--r-- | qga/installer/qemu-ga.wxs | 2 | ||||
-rw-r--r-- | qga/main.c | 4 | ||||
-rw-r--r-- | qga/vss-win32/install.cpp | 11 |
6 files changed, 32 insertions, 7 deletions
diff --git a/docs/interop/qemu-ga.rst b/docs/interop/qemu-ga.rst index 1313a4ae1c..3063357bb5 100644 --- a/docs/interop/qemu-ga.rst +++ b/docs/interop/qemu-ga.rst @@ -36,13 +36,14 @@ Options .. option:: -m, --method=METHOD Transport method: one of ``unix-listen``, ``virtio-serial``, or - ``isa-serial`` (``virtio-serial`` is the default). + ``isa-serial``, or ``vsock-listen`` (``virtio-serial`` is the default). .. option:: -p, --path=PATH Device/socket path (the default for virtio-serial is ``/dev/virtio-ports/org.qemu.guest_agent.0``, - the default for isa-serial is ``/dev/ttyS0``) + the default for isa-serial is ``/dev/ttyS0``). Socket addresses for + vsock-listen are written as ``<cid>:<port>``. .. option:: -l, --logfile=PATH diff --git a/qga/commands-win32.c b/qga/commands-win32.c index 9c744d6405..b49920e201 100644 --- a/qga/commands-win32.c +++ b/qga/commands-win32.c @@ -343,7 +343,13 @@ GuestFileRead *qmp_guest_file_read(int64_t handle, bool has_count, } fh = gfh->fh; - buf = g_malloc0(count+1); + buf = g_try_malloc0(count + 1); + if (!buf) { + error_setg(errp, + "failed to allocate sufficient memory " + "to complete the requested service"); + return NULL; + } is_ok = ReadFile(fh, buf, count, &read_count, NULL); if (!is_ok) { error_setg_win32(errp, GetLastError(), "failed to read file"); diff --git a/qga/commands.c b/qga/commands.c index f8852beb9c..4471a9f08d 100644 --- a/qga/commands.c +++ b/qga/commands.c @@ -482,10 +482,15 @@ done: * the guest's SEEK_ constants. */ int ga_parse_whence(GuestFileWhence *whence, Error **errp) { - /* Exploit the fact that we picked values to match QGA_SEEK_*. */ + /* + * Exploit the fact that we picked values to match QGA_SEEK_*; + * however, we have to use a temporary variable since the union + * members may have different size. + */ if (whence->type == QTYPE_QSTRING) { + int value = whence->u.name; whence->type = QTYPE_QNUM; - whence->u.value = whence->u.name; + whence->u.value = value; } switch (whence->u.value) { case QGA_SEEK_SET: diff --git a/qga/installer/qemu-ga.wxs b/qga/installer/qemu-ga.wxs index 64bf90bd85..f6781752e6 100644 --- a/qga/installer/qemu-ga.wxs +++ b/qga/installer/qemu-ga.wxs @@ -81,7 +81,7 @@ Arguments="-d --retry-path" > </ServiceInstall> - <ServiceControl Id="StartService" Start="install" Stop="both" Remove="uninstall" Name="QEMU-GA" Wait="no" /> + <ServiceControl Id="StartService" Start="install" Stop="both" Remove="uninstall" Name="QEMU-GA" Wait="yes" /> </Component> <?ifdef var.InstallVss?> <Component Id="qga_vss_dll" Guid="{CB19C453-FABB-4BB1-ABAB-6B74F687BFBB}"> diff --git a/qga/main.c b/qga/main.c index 8ee2736f8e..f0e454f28d 100644 --- a/qga/main.c +++ b/qga/main.c @@ -234,7 +234,9 @@ QEMU_COPYRIGHT "\n" " -p, --path device/socket path (the default for virtio-serial is:\n" " %s,\n" " the default for isa-serial is:\n" -" %s)\n" +" %s).\n" +" Socket addresses for vsock-listen are written as\n" +" <cid>:<port>.\n" " -l, --logfile set logfile path, logs to stderr by default\n" " -f, --pidfile specify pidfile (default is %s)\n" #ifdef CONFIG_FSFREEZE diff --git a/qga/vss-win32/install.cpp b/qga/vss-win32/install.cpp index 6713e58670..a456841360 100644 --- a/qga/vss-win32/install.cpp +++ b/qga/vss-win32/install.cpp @@ -443,6 +443,17 @@ STDAPI DllRegisterServer(void) VSS_PROV_SOFTWARE, const_cast<WCHAR*>(QGA_PROVIDER_VERSION), g_gProviderVersion); + if (hr == (long int) VSS_E_PROVIDER_ALREADY_REGISTERED) { + DllUnregisterServer(); + hr = pVssAdmin->RegisterProvider(g_gProviderId, CLSID_QGAVSSProvider, + const_cast<WCHAR * > + (QGA_PROVIDER_LNAME), + VSS_PROV_SOFTWARE, + const_cast<WCHAR * > + (QGA_PROVIDER_VERSION), + g_gProviderVersion); + } + if (FAILED(hr)) { errmsg_dialog(hr, "RegisterProvider failed"); } |