From nobody Fri May 16 12:56:56 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 149859084593650.72915870587212; Tue, 27 Jun 2017 12:14:05 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6CF097CE12; Tue, 27 Jun 2017 19:14:02 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 33BA591486; Tue, 27 Jun 2017 19:14:02 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 6A98F41F78; Tue, 27 Jun 2017 19:14:01 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v5RJDetf010549 for ; Tue, 27 Jun 2017 15:13:40 -0400 Received: by smtp.corp.redhat.com (Postfix) id E194717C7F; Tue, 27 Jun 2017 19:13:40 +0000 (UTC) Received: from mx1.redhat.com (ext-mx09.extmail.prod.ext.phx2.redhat.com [10.5.110.38]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DA4EC17C65 for ; Tue, 27 Jun 2017 19:13:39 +0000 (UTC) Received: from mail-qt0-f181.google.com (mail-qt0-f181.google.com [209.85.216.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9DE3BFEF0C for ; Tue, 27 Jun 2017 19:13:37 +0000 (UTC) Received: by mail-qt0-f181.google.com with SMTP id f92so32660979qtb.2 for ; Tue, 27 Jun 2017 12:13:37 -0700 (PDT) Received: from silas.datto.lan ([47.19.105.250]) by smtp.gmail.com with ESMTPSA id g6sm34445qkb.33.2017.06.27.12.13.34 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 27 Jun 2017 12:13:35 -0700 (PDT) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 6CF097CE12 Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=datto.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 6CF097CE12 Authentication-Results: mx1.redhat.com; dkim=fail reason="signature verification failed" (2048-bit key) header.d=datto-com.20150623.gappssmtp.com header.i=@datto-com.20150623.gappssmtp.com header.b="nLCSsBwS" DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 9DE3BFEF0C Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=datto.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=sramanujam@datto.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 9DE3BFEF0C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=datto-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=qjpAJ1O8SQcI5NfYU0sfgcxDj8ORNuPlqmNbmJTO/8M=; b=nLCSsBwSCMCLtZ6l2AcVN2Mfwr7fbdFpvVWtugMpRsNtc+rCq8PBJwhQaoJ8jAWZmz GMYErpKluJRQ8999jD7Wov2IWSKlzc1fRe9PBs2ooTvOR5IJMeyVWVojsYoIODVtvsBt GjOGKASALcbelT0R1Fmlefa9VcLkyzFxcma1W0cZpG9RpvM6kp1EL5b0IvsBZlje9PNG a2fB/w4WHAyjAL0ycyAbYyMvk2iSpid3fzcJtjUT51V8C1jINp7VhZSGMZS+IG0rosDD Lic6J+etVMhbJle3sSybj0F5bB2zm9MEf3qZDf7LUZTszFzc0O+ZiB9oZUdOIx/9TjDY fX9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=qjpAJ1O8SQcI5NfYU0sfgcxDj8ORNuPlqmNbmJTO/8M=; b=CDOCEAB/ieWlxTrac5VkK0VkOgZXEY50p5OZ2YSRk7IcwIV8gMWM2/bwZU/INBxmnE y5CWNRN4t+9IaBjEZK/5lxNQeagfSlYFtvePCpgibFRrBEHcRrDUnhqGYLMpGgEYw1WF 5lbXnA2xnylwKg2a4c5uja9Sg9PcCnTv4gtzWXpwNntEDgid0eZn7pwP2tdxlOvxFLat ZeQoriT7S9GyNwMGoTGMfqOpLSakwBCqX+/clOZgnDP5hQlH+BA+cfPctiPNR9nW3lhy e7kVGUZO3MtqxSiR9Uw0J01vdjM2+MrNNo2/lh5BLJicdhNRIb8hV5Zq0+6UUc8ARz+7 BulQ== X-Gm-Message-State: AKS2vOzonh9y2AS3XZOUQImPAE6eSonK30tJQAa7NEvUe3J9EHrU5uQ2 i3VfINAQD28u1we/2r4= X-Received: by 10.200.38.142 with SMTP id 14mr8576056qto.237.1498590816282; Tue, 27 Jun 2017 12:13:36 -0700 (PDT) From: Sri Ramanujam To: libvir-list@redhat.com Date: Tue, 27 Jun 2017 15:13:23 -0400 Message-Id: <20170627191328.31072-2-sramanujam@datto.com> In-Reply-To: <20170627191328.31072-1-sramanujam@datto.com> References: <20170627191328.31072-1-sramanujam@datto.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 27 Jun 2017 19:13:37 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 27 Jun 2017 19:13:37 +0000 (UTC) for IP:'209.85.216.181' DOMAIN:'mail-qt0-f181.google.com' HELO:'mail-qt0-f181.google.com' FROM:'sramanujam@datto.com' RCPT:'' X-RedHat-Spam-Score: 1.279 * (BAYES_50, DCC_CHECK, DCC_REPUT_00_12, DKIM_SIGNED, DKIM_VALID, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, RCVD_IN_SORBS_SPAM, SPF_PASS) 209.85.216.181 mail-qt0-f181.google.com 209.85.216.181 mail-qt0-f181.google.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.38 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v7 1/6] hyperv: Functions to work with invocation parameters. X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 27 Jun 2017 19:14:03 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" This commit introduces functionality for creating and working with invoke parameters. This commit does not include any code for serializing and actually performing the method invocations; it merely defines the functions and API for using invocation parameters in driver code. HYPERV_DEFAULT_PARAM_COUNT was chosen because almost no method invocations have more than 4 parameters. Functions added: * hypervInitInvokeParamsList * hypervFreeInvokeParams * hypervAddSimpleParam * hypervAddEprParam * hypervCreateEmbeddedParam * hypervSetEmbeddedProperty * hypervAddEmbeddedParam * hypervFreeEmbeddedParam --- src/hyperv/hyperv_wmi.c | 262 ++++++++++++++++++++++++++++++++++++++++++++= ++++ src/hyperv/hyperv_wmi.h | 79 ++++++++++++++- 2 files changed, 340 insertions(+), 1 deletion(-) diff --git a/src/hyperv/hyperv_wmi.c b/src/hyperv/hyperv_wmi.c index a3c7dc0..2732db3 100644 --- a/src/hyperv/hyperv_wmi.c +++ b/src/hyperv/hyperv_wmi.c @@ -2,6 +2,7 @@ * hyperv_wmi.c: general WMI over WSMAN related functions and structures f= or * managing Microsoft Hyper-V hosts * + * Copyright (C) 2017 Datto Inc * Copyright (C) 2014 Red Hat, Inc. * Copyright (C) 2011 Matthias Bolte * Copyright (C) 2009 Michael Sievers @@ -142,6 +143,267 @@ hypervVerifyResponse(WsManClient *client, WsXmlDocH r= esponse, } =20 =20 +/* + * Methods to work with method invocation parameters + */ + +/* + * hypervCreateInvokeParamsList: + * @priv: hypervPrivate object associated with the connection. + * @method: The name of the method you are calling + * @selector: The selector for the object you are invoking the method on + * @obj: The WmiInfo of the object class you are invoking the method on. + * + * Create a new InvokeParamsList object for the method call. + * + * Returns a pointer to the newly instantiated object on success, which sh= ould + * be freed by hypervInvokeMethod. Otherwise returns NULL. + */ +hypervInvokeParamsListPtr +hypervCreateInvokeParamsList(hypervPrivate *priv, const char *method, + const char *selector, hypervWmiClassInfoListPtr obj) +{ + hypervInvokeParamsListPtr params =3D NULL; + hypervWmiClassInfoPtr info =3D NULL; + + if (hypervGetWmiClassInfo(priv, obj, &info) < 0) + goto cleanup; + + if (VIR_ALLOC(params) < 0) + goto cleanup; + + if (VIR_ALLOC_N(params->params, + HYPERV_DEFAULT_PARAM_COUNT) < 0) { + VIR_FREE(params); + goto cleanup; + } + + params->method =3D method; + params->ns =3D info->rootUri; + params->resourceUri =3D info->resourceUri; + params->selector =3D selector; + params->nbParams =3D 0; + params->nbAvailParams =3D HYPERV_DEFAULT_PARAM_COUNT; + + cleanup: + return params; +} + +/* + * hypervFreeInvokeParams: + * @params: Params object to be freed + * + */ +void +hypervFreeInvokeParams(hypervInvokeParamsListPtr params) +{ + hypervParamPtr p =3D NULL; + size_t i =3D 0; + + if (params =3D=3D NULL) + return; + + for (i =3D 0; i < params->nbParams; i++) { + p =3D &(params->params[i]); + + switch (p->type) { + case HYPERV_SIMPLE_PARAM: + break; + case HYPERV_EPR_PARAM: + virBufferFreeAndReset(p->epr.query); + break; + case HYPERV_EMBEDDED_PARAM: + hypervFreeEmbeddedParam(p->embedded.table); + break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Invalid parameter type passed to free")); + } + } + + VIR_DISPOSE_N(params->params, params->nbAvailParams); + VIR_FREE(params); +} + +static inline int +hypervCheckParams(hypervInvokeParamsListPtr params) +{ + if (params->nbParams + 1 > params->nbAvailParams) { + if (VIR_EXPAND_N(params->params, params->nbAvailParams, 5) < 0) + return -1; + } + + return 0; +} + +/* + * hypervAddSimpleParam: + * @params: Params object to add to + * @name: Name of the parameter + * @value: Value of the parameter + * + * Add a param of type HYPERV_SIMPLE_PARAM, which is essentially a seriali= zed + * key/value pair. + * + * Returns -1 on failure, 0 on success. + */ +int +hypervAddSimpleParam(hypervInvokeParamsListPtr params, const char *name, + const char *value) +{ + int result =3D -1; + hypervParamPtr p =3D NULL; + + if (hypervCheckParams(params) < 0) + goto cleanup; + + p =3D ¶ms->params[params->nbParams]; + p->type =3D HYPERV_SIMPLE_PARAM; + + p->simple.name =3D name; + p->simple.value =3D value; + + params->nbParams++; + + result =3D 0; + + cleanup: + return result; +} + +/* + * hypervAddEprParam: + * @params: Params object to add to + * @name: Parameter name + * @priv: hypervPrivate object associated with the connection + * @query: WQL filter + * @eprInfo: WmiInfo of the object being filtered + * + * Adds an EPR param to the params list. Returns -1 on failure, 0 on succe= ss. + */ +int +hypervAddEprParam(hypervInvokeParamsListPtr params, const char *name, + hypervPrivate *priv, virBufferPtr query, + hypervWmiClassInfoListPtr eprInfo) +{ + hypervParamPtr p =3D NULL; + hypervWmiClassInfoPtr classInfo =3D NULL; + + if (hypervGetWmiClassInfo(priv, eprInfo, &classInfo) < 0 || + hypervCheckParams(params) < 0) + return -1; + + p =3D ¶ms->params[params->nbParams]; + p->type =3D HYPERV_EPR_PARAM; + p->epr.name =3D name; + p->epr.query =3D query; + p->epr.info =3D classInfo; + params->nbParams++; + + return 0; +} + +/* + * hypervCreateEmbeddedParam: + * @priv: hypervPrivate object associated with the connection + * @info: WmiInfo of the object type to serialize + * + * Instantiates a virHashTable pre-filled with all the properties pre-added + * a key/value pairs set to NULL. The user then sets only those properties= that + * they wish to serialize, and passes the table via hypervAddEmbeddedParam. + * + * Returns a pointer to the virHashTable on success, otherwise NULL. + */ +virHashTablePtr +hypervCreateEmbeddedParam(hypervPrivate *priv, hypervWmiClassInfoListPtr i= nfo) +{ + size_t i; + int count =3D 0; + virHashTablePtr table =3D NULL; + XmlSerializerInfo *typeinfo =3D NULL; + XmlSerializerInfo *item =3D NULL; + hypervWmiClassInfoPtr classInfo =3D NULL; + + /* Get the typeinfo out of the class info list */ + if (hypervGetWmiClassInfo(priv, info, &classInfo) < 0) + goto error; + + typeinfo =3D classInfo->serializerInfo; + + /* loop through the items to find out how many fields there are */ + for (i =3D 0; typeinfo[i].name !=3D NULL; i++) {} + count =3D i; + + table =3D virHashCreate(count, NULL); + if (table =3D=3D NULL) + goto error; + + for (i =3D 0; typeinfo[i].name !=3D NULL; i++) { + item =3D &typeinfo[i]; + + if (virHashAddEntry(table, item->name, NULL) < 0) + goto error; + } + + return table; + + error: + virHashFree(table); + return NULL; +} + +int +hypervSetEmbeddedProperty(virHashTablePtr table, const char *name, char *v= alue) +{ + return virHashUpdateEntry(table, name, value); +} + +/* + * hypervAddEmbeddedParam: + * @params: Params list to add to + * @priv: hypervPrivate object associated with the connection + * @name: Name of the parameter + * @table: table of properties to add + * @info: WmiInfo of the object to serialize + * + * Add a virHashTable containing object properties as an embedded param to + * an invocation list. Returns -1 on failure, 0 on success. + */ +int +hypervAddEmbeddedParam(hypervInvokeParamsListPtr params, hypervPrivate *pr= iv, + const char *name, virHashTablePtr table, hypervWmiClassInfoListPtr= info) +{ + hypervParamPtr p =3D NULL; + hypervWmiClassInfoPtr classInfo =3D NULL; + + if (hypervCheckParams(params) < 0) + return -1; + + /* Get the typeinfo out of the class info list */ + if (hypervGetWmiClassInfo(priv, info, &classInfo) < 0) + return -1; + + p =3D ¶ms->params[params->nbParams]; + p->type =3D HYPERV_EMBEDDED_PARAM; + p->embedded.name =3D name; + p->embedded.table =3D table; + p->embedded.info =3D classInfo; + params->nbParams++; + + return 0; +} + +/* + * hypervFreeEmbeddedParam: + * @param: Pointer to embedded param to free + * + * Free the embedded param hash table. + */ +void +hypervFreeEmbeddedParam(virHashTablePtr p) +{ + virHashFree(p); +} =20 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *= * * * Object diff --git a/src/hyperv/hyperv_wmi.h b/src/hyperv/hyperv_wmi.h index edb8efa..54ce5b1 100644 --- a/src/hyperv/hyperv_wmi.h +++ b/src/hyperv/hyperv_wmi.h @@ -28,11 +28,13 @@ # include "hyperv_private.h" # include "hyperv_wmi_classes.h" # include "openwsman.h" - +# include "virhash.h" =20 =20 # define HYPERV_WQL_QUERY_INITIALIZER { NULL, NULL } =20 +# define HYPERV_DEFAULT_PARAM_COUNT 5 + int hypervVerifyResponse(WsManClient *client, WsXmlDocH response, const char *detail); =20 @@ -74,7 +76,82 @@ int hypervEnumAndPull(hypervPrivate *priv, hypervWqlQuer= yPtr wqlQuery, void hypervFreeObject(hypervPrivate *priv, hypervObject *object); =20 =20 +/* + * Invoke + */ + +typedef enum { + HYPERV_SIMPLE_PARAM, + HYPERV_EPR_PARAM, + HYPERV_EMBEDDED_PARAM +} hypervStorageType; + +struct _hypervSimpleParam { + const char *name; + const char *value; +}; +typedef struct _hypervSimpleParam hypervSimpleParam; + +struct _hypervEprParam { + const char *name; + virBufferPtr query; + hypervWmiClassInfoPtr info; // info of the object this param represents +}; +typedef struct _hypervEprParam hypervEprParam; + +struct _hypervEmbeddedParam { + const char *name; + virHashTablePtr table; + hypervWmiClassInfoPtr info; // info of the object this param represents +}; +typedef struct _hypervEmbeddedParam hypervEmbeddedParam; + +struct _hypervParam { + hypervStorageType type; + union { + hypervSimpleParam simple; + hypervEprParam epr; + hypervEmbeddedParam embedded; + }; +}; +typedef struct _hypervParam hypervParam; +typedef hypervParam *hypervParamPtr; + +struct _hypervInvokeParamsList { + const char *method; + const char *ns; + const char *resourceUri; + const char *selector; + hypervParamPtr params; + size_t nbParams; + size_t nbAvailParams; +}; +typedef struct _hypervInvokeParamsList hypervInvokeParamsList; +typedef hypervInvokeParamsList *hypervInvokeParamsListPtr; + + +hypervInvokeParamsListPtr hypervCreateInvokeParamsList(hypervPrivate *priv, + const char *method, const char *selector, hypervWmiClassInfoListPt= r obj); + +void hypervFreeInvokeParams(hypervInvokeParamsListPtr params); + +int hypervAddSimpleParam(hypervInvokeParamsListPtr params, const char *nam= e, + const char *value); + +int hypervAddEprParam(hypervInvokeParamsListPtr params, const char *name, + hypervPrivate *priv, virBufferPtr query, + hypervWmiClassInfoListPtr eprInfo); + +virHashTablePtr hypervCreateEmbeddedParam(hypervPrivate *priv, + hypervWmiClassInfoListPtr info); + +int hypervSetEmbeddedProperty(virHashTablePtr table, const char *name, + char *value); + +int hypervAddEmbeddedParam(hypervInvokeParamsListPtr params, hypervPrivate= *priv, + const char *name, virHashTablePtr table, hypervWmiClassInfoListPtr= info); =20 +void hypervFreeEmbeddedParam(virHashTablePtr p); /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *= * * * CIM/Msvm_ReturnCode */ --=20 2.9.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list