Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.2:Ports
libvirt
f820d5bf6-USB-port-path-as-an-array-of-integers...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File f820d5bf6-USB-port-path-as-an-array-of-integers.patch of Package libvirt
From f820d5bf6fafa2932ee6b21c34fee4c464500ef3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com> Date: Wed, 12 Aug 2015 16:52:13 +0200 Subject: [PATCH] Store USB port path as an array of integers In preparation to tracking which USB addresses are occupied. Introduce two helper functions for printing the port path as a string and appending it to a virBuffer. --- src/conf/device_conf.h | 2 +- src/conf/domain_addr.c | 33 +++++++++++++++++++++++++++++++++ src/conf/domain_addr.h | 12 ++++++++++++ src/conf/domain_conf.c | 20 ++++++++++---------- src/libvirt_private.syms | 3 +++ src/qemu/qemu_command.c | 5 ++++- 6 files changed, 63 insertions(+), 12 deletions(-) Index: libvirt-2.0.0/src/conf/device_conf.h =================================================================== --- libvirt-2.0.0.orig/src/conf/device_conf.h +++ libvirt-2.0.0/src/conf/device_conf.h @@ -84,7 +84,7 @@ typedef struct _virDomainDeviceCcidAddre typedef struct _virDomainDeviceUSBAddress { unsigned int bus; - char *port; + unsigned int port[VIR_DOMAIN_DEVICE_USB_MAX_PORT_DEPTH]; } virDomainDeviceUSBAddress, *virDomainDeviceUSBAddressPtr; typedef struct _virDomainDeviceSpaprVioAddress { Index: libvirt-2.0.0/src/conf/domain_addr.c =================================================================== --- libvirt-2.0.0.orig/src/conf/domain_addr.c +++ libvirt-2.0.0/src/conf/domain_addr.c @@ -1251,3 +1251,36 @@ virDomainVirtioSerialAddrRelease(virDoma VIR_FREE(str); return ret; } + + +bool +virDomainUSBAddressPortIsValid(unsigned int *port) +{ + return port[0] != 0; +} + + +void +virDomainUSBAddressPortFormatBuf(virBufferPtr buf, + unsigned int *port) +{ + size_t i; + + for (i = 0; i < VIR_DOMAIN_DEVICE_USB_MAX_PORT_DEPTH; i++) { + if (port[i] == 0) + break; + virBufferAsprintf(buf, "%u.", port[i]); + } + virBufferTrim(buf, ".", -1); +} + + +char * +virDomainUSBAddressPortFormat(unsigned int *port) +{ + virBuffer buf = VIR_BUFFER_INITIALIZER; + virDomainUSBAddressPortFormatBuf(&buf, port); + if (virBufferCheckError(&buf) < 0) + return NULL; + return virBufferContentAndReset(&buf); +} Index: libvirt-2.0.0/src/conf/domain_addr.h =================================================================== --- libvirt-2.0.0.orig/src/conf/domain_addr.h +++ libvirt-2.0.0/src/conf/domain_addr.h @@ -237,4 +237,16 @@ virDomainVirtioSerialAddrRelease(virDoma virDomainDeviceInfoPtr info) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); +bool +virDomainUSBAddressPortIsValid(unsigned int *port) + ATTRIBUTE_NONNULL(1); + +void +virDomainUSBAddressPortFormatBuf(virBufferPtr buf, + unsigned int *port) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); +char * +virDomainUSBAddressPortFormat(unsigned int *port) + ATTRIBUTE_NONNULL(1); + #endif /* __DOMAIN_ADDR_H__ */ Index: libvirt-2.0.0/src/conf/domain_conf.c =================================================================== --- libvirt-2.0.0.orig/src/conf/domain_conf.c +++ libvirt-2.0.0/src/conf/domain_conf.c @@ -32,6 +32,7 @@ #include "internal.h" #include "virerror.h" #include "datatypes.h" +#include "domain_addr.h" #include "domain_conf.h" #include "snapshot_conf.h" #include "viralloc.h" @@ -3313,8 +3314,6 @@ virDomainDeviceInfoCopy(virDomainDeviceI void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info) { VIR_FREE(info->alias); - if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB) - VIR_FREE(info->addr.usb.port); memset(&info->addr, 0, sizeof(info->addr)); info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE; VIR_FREE(info->romfile); @@ -4859,9 +4858,12 @@ virDomainDeviceInfoFormat(virBufferPtr b break; case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB: - virBufferAsprintf(buf, " bus='%d' port='%s'", - info->addr.usb.bus, - info->addr.usb.port); + virBufferAsprintf(buf, " bus='%d'", info->addr.usb.bus); + if (virDomainUSBAddressPortIsValid(info->addr.usb.port)) { + virBufferAddLit(buf, " port='"); + virDomainUSBAddressPortFormatBuf(buf, info->addr.usb.port); + virBufferAddLit(buf, "'"); + } break; case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO: @@ -5093,14 +5095,14 @@ virDomainDeviceCcidAddressParseXML(xmlNo } static int -virDomainDeviceUSBAddressParsePort(char *port) +virDomainDeviceUSBAddressParsePort(virDomainDeviceUSBAddressPtr addr, + char *port) { - unsigned int p; char *tmp = port; size_t i; for (i = 0; i < VIR_DOMAIN_DEVICE_USB_MAX_PORT_DEPTH; i++) { - if (virStrToLong_uip(tmp, &tmp, 10, &p) < 0) + if (virStrToLong_uip(tmp, &tmp, 10, &addr->port[i]) < 0) break; if (*tmp == '\0') @@ -5127,12 +5129,9 @@ virDomainDeviceUSBAddressParseXML(xmlNod port = virXMLPropString(node, "port"); bus = virXMLPropString(node, "bus"); - if (port && virDomainDeviceUSBAddressParsePort(port) < 0) + if (port && virDomainDeviceUSBAddressParsePort(addr, port) < 0) goto cleanup; - addr->port = port; - port = NULL; - if (bus && virStrToLong_uip(bus, NULL, 10, &addr->bus) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", Index: libvirt-2.0.0/src/libvirt_private.syms =================================================================== --- libvirt-2.0.0.orig/src/libvirt_private.syms +++ libvirt-2.0.0/src/libvirt_private.syms @@ -107,6 +107,9 @@ virDomainPCIAddressSetGrow; virDomainPCIAddressSlotInUse; virDomainPCIAddressValidate; virDomainPCIControllerModelToConnectType; +virDomainUSBAddressPortFormat; +virDomainUSBAddressPortFormatBuf; +virDomainUSBAddressPortIsValid; virDomainVirtioSerialAddrAssign; virDomainVirtioSerialAddrAutoAssign; virDomainVirtioSerialAddrIsComplete; Index: libvirt-2.0.0/src/qemu/qemu_command.c =================================================================== --- libvirt-2.0.0.orig/src/qemu/qemu_command.c +++ libvirt-2.0.0/src/qemu/qemu_command.c @@ -375,7 +375,11 @@ qemuBuildDeviceAddressStr(virBufferPtr b VIR_DOMAIN_CONTROLLER_TYPE_USB, info->addr.usb.bus))) goto cleanup; - virBufferAsprintf(buf, ",bus=%s.0,port=%s", contAlias, info->addr.usb.port); + virBufferAsprintf(buf, ",bus=%s.0", contAlias); + if (virDomainUSBAddressPortIsValid(info->addr.usb.port)) { + virBufferAddLit(buf, ",port="); + virDomainUSBAddressPortFormatBuf(buf, info->addr.usb.port); + } } else if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO) { if (info->addr.spaprvio.has_reg) virBufferAsprintf(buf, ",reg=0x%llx", info->addr.spaprvio.reg);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor