[PATCH 14/30] conf: Add support for cookies for HTTP based disks
Ján Tomko
jtomko at redhat.com
Thu Mar 12 17:11:59 UTC 2020
On a Monday in 2020, Peter Krempa wrote:
>Add possibility to specify one or more cookies for http based disks.
>This patch adds the config parser, storage and validation of the
>cookies.
Cookies are delicious delicacies.
>
>Signed-off-by: Peter Krempa <pkrempa at redhat.com>
>---
> docs/formatdomain.html.in | 10 ++
> docs/schemas/domaincommon.rng | 24 ++++
> src/conf/domain_conf.c | 82 +++++++++++++
> src/libvirt_private.syms | 1 +
> src/util/virstoragefile.c | 115 ++++++++++++++++++
> src/util/virstoragefile.h | 15 +++
> .../disk-network-http.xml | 8 ++
> 7 files changed, 255 insertions(+)
>
>diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>index dd3a3a1439..dc7a47dd21 100644
>--- a/src/conf/domain_conf.c
>+++ b/src/conf/domain_conf.c
>@@ -9340,6 +9340,62 @@ virDomainDiskSourcePoolDefParse(xmlNodePtr node,
> }
>
>
>+static virStorageNetCookieDefPtr
You have Net in the type name
>+virDomainStorageCookieParse(xmlNodePtr node,
no Net in this function name
>+ xmlXPathContextPtr ctxt)
>+{
>+ VIR_XPATH_NODE_AUTORESTORE(ctxt);
>+ g_autoptr(virStorageNetCookieDef) cookie = NULL;
>+
>+ ctxt->node = node;
>+
>+ cookie = g_new0(virStorageNetCookieDef, 1);
>+
>+ if (!(cookie->name = virXPathString("string(./@name)", ctxt))) {
>+ virReportError(VIR_ERR_XML_ERROR, "%s", _("missing cookie name"));
>+ return NULL;
>+ }
>+
>+ if (!(cookie->value = virXPathString("string(.)", ctxt))) {
>+ virReportError(VIR_ERR_XML_ERROR, _("missing value for cookie '%s'"),
>+ cookie->name);
>+ return NULL;
>+ }
>+
>+ return g_steal_pointer(&cookie);
>+}
>+
>+
>+static int
>+virDomainStorageCookiesParse(xmlNodePtr node,
no Net here either
>+ xmlXPathContextPtr ctxt,
>+ virStorageSourcePtr src)
>+{
>+ VIR_XPATH_NODE_AUTORESTORE(ctxt);
>+ g_autofree xmlNodePtr *nodes = NULL;
>+ ssize_t nnodes;
>+ size_t i;
>+
>+ ctxt->node = node;
>+
>+ if ((nnodes = virXPathNodeSet("./cookie", ctxt, &nodes)) < 0)
>+ return -1;
>+
>+ src->cookies = g_new0(virStorageNetCookieDefPtr, nnodes);
>+ src->ncookies = nnodes;
>+
>+ for (i = 0; i < nnodes; i++) {
>+ if (!(src->cookies[i] = virDomainStorageCookieParse(nodes[i], ctxt)))
>+ return -1;
>+ }
>+
>+ if (virStorageSourceNetCookiesValidate(src) < 0)
>+ return -1;
>+
>+ return 0;
>+}
>+
>+
> static int
> virDomainDiskSourceNetworkParse(xmlNodePtr node,
> xmlXPathContextPtr ctxt,
>@@ -24500,6 +24564,22 @@ virDomainSourceDefFormatSeclabel(virBufferPtr buf,
> }
>
>
>+static void
>+virDomainDiskSourceFormatNetworkCookies(virBufferPtr buf,
Network here for a change
>+ virStorageSourcePtr src)
>+{
>+ g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
>+ size_t i;
>+
>+ for (i = 0; i < src->ncookies; i++) {
>+ virBufferEscapeString(&childBuf, "<cookie name='%s'>", src->cookies[i]->name);
>+ virBufferEscapeString(&childBuf, "%s</cookie>\n", src->cookies[i]->value);
>+ }
>+
>+ virXMLFormatElement(buf, "cookies", NULL, &childBuf);
>+}
>+
>+
> static int
> virDomainDiskSourceFormatNetwork(virBufferPtr attrBuf,
> virBufferPtr childBuf,
>@@ -24549,6 +24629,8 @@ virDomainDiskSourceFormatNetwork(virBufferPtr attrBuf,
> virBufferAsprintf(childBuf, "<ssl verify='%s'/>\n",
> virTristateBoolTypeToString(src->sslverify));
>
>+ virDomainDiskSourceFormatNetworkCookies(childBuf, src);
>+
> return 0;
> }
>
>diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
>index 511fb88872..73db753652 100644
>--- a/src/libvirt_private.syms
>+++ b/src/libvirt_private.syms
>@@ -3143,6 +3143,7 @@ virStorageSourceIsEmpty;
> virStorageSourceIsLocalStorage;
> virStorageSourceIsRelative;
> virStorageSourceIsSameLocation;
>+virStorageSourceNetCookiesValidate;
> virStorageSourceNetworkAssignDefaultPorts;
> virStorageSourceNew;
> virStorageSourceNewFromBacking;
>diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
>index ca91fc65ba..fb5fff5c5f 100644
>--- a/src/util/virstoragefile.c
>+++ b/src/util/virstoragefile.c
>@@ -2157,6 +2157,118 @@ virStorageSourceSeclabelsCopy(virStorageSourcePtr to,
> }
>
>
>+void
>+virStorageNetCookieDefFree(virStorageNetCookieDefPtr def)
>+{
>+ if (!def)
>+ return;
>+
>+ g_free(def->name);
>+ g_free(def->value);
>+
>+ g_free(def);
>+}
>+
>+
>+static void
>+virStorageSourceCookiesClear(virStorageSourcePtr src)
no Net here
>+{
>+ size_t i;
>+
>+ if (!src || !src->cookies)
>+ return;
>+
>+ for (i = 0; i < src->ncookies; i++)
>+ virStorageNetCookieDefFree(src->cookies[i]);
>+
>+ g_clear_pointer(&src->cookies, g_free);
>+ src->ncookies = 0;
>+}
>+
>+
>+static void
>+virStorageSourceNetCookiesCopy(virStorageSourcePtr to,
>+ const virStorageSource *from)
>+{
>+ size_t i;
>+
>+ if (from->ncookies == 0)
>+ return;
>+
>+ to->cookies = g_new0(virStorageNetCookieDefPtr, from->ncookies);
>+ to->ncookies = from->ncookies;
>+
>+ for (i = 0; i < from->ncookies; i++) {
>+ to->cookies[i]->name = g_strdup(from->cookies[i]->name);
>+ to->cookies[i]->value = g_strdup(from->cookies[i]->value);
>+ }
>+}
>+
>+
Consider using 'Net' at least for those identifiers that do not have
'Network' in them.
Reviewed-by: Ján Tomko <jtomko at redhat.com>
Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20200312/1f82d20d/attachment-0001.sig>
More information about the libvir-list
mailing list