#define PCI_SYSFS "/sys/bus/pci/"
#define PCI_ID_LEN 10 /* "XXXX XXXX" */
-#define PCI_ADDR_LEN 13 /* "XXXX:XX:XX.X" */
VIR_ENUM_IMPL(virPCIELinkSpeed,
VIR_PCIE_LINK_SPEED_LAST,
struct _virPCIDevice {
virPCIDeviceAddress address;
- char name[PCI_ADDR_LEN]; /* domain:bus:slot.function */
+ char *name; /* domain:bus:slot.function */
char id[PCI_ID_LEN]; /* product vendor */
char *path;
dev->address.slot = slot;
dev->address.function = function;
- if (snprintf(dev->name, sizeof(dev->name), "%.4x:%.2x:%.2x.%.1x",
- domain, bus, slot, function) >= sizeof(dev->name)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("dev->name buffer overflow: %.4x:%.2x:%.2x.%.1x"),
- domain, bus, slot, function);
+ if (virAsprintf(&dev->name,
+ "%.4x:%.2x:%.2x.%.1x",
+ domain, bus, slot, function) < 0)
return NULL;
- }
+
if (virAsprintf(&dev->path, PCI_SYSFS "devices/%s/config",
dev->name) < 0)
return NULL;
*copy = *dev;
copy->path = NULL;
copy->used_by_drvname = copy->used_by_domname = NULL;
- if (VIR_STRDUP(copy->path, dev->path) < 0 ||
+ if (VIR_STRDUP(copy->name, dev->name) < 0 ||
+ VIR_STRDUP(copy->path, dev->path) < 0 ||
VIR_STRDUP(copy->used_by_drvname, dev->used_by_drvname) < 0 ||
VIR_STRDUP(copy->used_by_domname, dev->used_by_domname) < 0) {
goto error;
if (!dev)
return;
VIR_DEBUG("%s %s: freeing", dev->id, dev->name);
+ VIR_FREE(dev->name);
VIR_FREE(dev->path);
VIR_FREE(dev->used_by_drvname);
VIR_FREE(dev->used_by_domname);