diff --git a/daemon/remote.c b/daemon/remote.c index 941e92f7d7b209acbea56c6b38aab12c3bd3b1ba..80783b30fa689fca0eecfdf57c5c3592dc4e34fa 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -459,41 +459,6 @@ remoteDispatchClose(struct qemud_server *server ATTRIBUTE_UNUSED, return 0; } -static int -remoteDispatchGetType(struct qemud_server *server ATTRIBUTE_UNUSED, - struct qemud_client *client ATTRIBUTE_UNUSED, - virConnectPtr conn, - remote_message_header *hdr ATTRIBUTE_UNUSED, - remote_error *rerr, - void *args ATTRIBUTE_UNUSED, remote_get_type_ret *ret) -{ - const char *type; - int rv = -1; - - if (!conn) { - virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open")); - goto cleanup; - } - - if (!(type = virConnectGetType(conn))) - goto cleanup; - - /* We have to strdup because remoteDispatchClientRequest will - * free this string after it's been serialised. - */ - if (!(ret->type = strdup(type))) { - virReportOOMError(); - goto cleanup; - } - - rv = 0; - -cleanup: - if (rv < 0) - remoteDispatchError(rerr); - return rv; -} - static int remoteDispatchDomainGetSchedulerType(struct qemud_server *server ATTRIBUTE_UNUSED, struct qemud_client *client ATTRIBUTE_UNUSED, diff --git a/daemon/remote_generator.pl b/daemon/remote_generator.pl index ec4bd62471d94eea3e37758f6a7fd07fee5afe64..d21f959fc59bab52f41ea51d6c8e309453ae18cf 100755 --- a/daemon/remote_generator.pl +++ b/daemon/remote_generator.pl @@ -429,8 +429,21 @@ elsif ($opt_b) { unshift(@args_list, $conn); } } elsif ($ret_member =~ m/^remote_nonnull_string (\S+);/) { - push(@vars_list, "char *$1"); - push(@ret_list, "ret->$1 = $1;"); + if ($call->{ProcName} eq "GetType") { + # SPECIAL: virConnectGetType returns a constant string that must + # not be freed. Therefore, duplicate the string here. + push(@vars_list, "const char *$1"); + push(@ret_list, "/* We have to strdup because remoteDispatchClientRequest will"); + push(@ret_list, " * free this string after it's been serialised. */"); + push(@ret_list, "if (!(ret->type = strdup(type))) {"); + push(@ret_list, " virReportOOMError();"); + push(@ret_list, " goto cleanup;"); + push(@ret_list, "}"); + } else { + push(@vars_list, "char *$1"); + push(@ret_list, "ret->$1 = $1;"); + } + $single_ret_var = $1; $single_ret_by_ref = 0; $single_ret_check = " == NULL"; diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index c784dba52f572a0eca316d9071fdbd683621e514..f0da95d065450a1e7b8ca13fe8fe40436af36873 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -2054,7 +2054,7 @@ enum remote_procedure { * it handles src/remote. */ REMOTE_PROC_OPEN = 1, /* skipgen skipgen */ REMOTE_PROC_CLOSE = 2, /* skipgen skipgen */ - REMOTE_PROC_GET_TYPE = 3, /* skipgen skipgen */ + REMOTE_PROC_GET_TYPE = 3, /* autogen skipgen */ REMOTE_PROC_GET_VERSION = 4, /* autogen autogen */ REMOTE_PROC_GET_MAX_VCPUS = 5, /* autogen autogen */ REMOTE_PROC_NODE_GET_INFO = 6, /* autogen autogen */