}
-static int udevSetupSystemDev(void)
+static void
+udevGetDMIData(union _virNodeDevCapData *data)
{
- virNodeDeviceDefPtr def = NULL;
- virNodeDeviceObjPtr dev = NULL;
struct udev *udev = NULL;
struct udev_device *device = NULL;
- union _virNodeDevCapData *data = NULL;
char *tmp = NULL;
- int ret = -1;
-
- if (VIR_ALLOC(def) != 0) {
- virReportOOMError();
- goto out;
- }
-
- def->name = strdup("computer");
- if (def->name == NULL) {
- virReportOOMError();
- goto out;
- }
-
- if (VIR_ALLOC(def->caps) != 0) {
- virReportOOMError();
- goto out;
- }
udev = udev_monitor_get_udev(DRV_STATE_UDEV_MONITOR(driverState));
+
device = udev_device_new_from_syspath(udev, DMI_DEVPATH);
if (device == NULL) {
device = udev_device_new_from_syspath(udev, DMI_DEVPATH_FALLBACK);
}
}
- data = &def->caps->data;
-
if (udevGetStringSysfsAttr(device,
"product_name",
&data->system.product_name) == PROPERTY_ERROR) {
&tmp) == PROPERTY_ERROR) {
goto out;
}
- virUUIDParse(tmp, def->caps->data.system.hardware.uuid);
- VIR_FREE(tmp);
+ virUUIDParse(tmp, data->system.hardware.uuid);
if (udevGetStringSysfsAttr(device,
"bios_vendor",
goto out;
}
- udev_device_unref(device);
+out:
+ VIR_FREE(tmp);
+ if (device != NULL) {
+ udev_device_unref(device);
+ }
+ return;
+}
+
+
+static int udevSetupSystemDev(void)
+{
+ virNodeDeviceDefPtr def = NULL;
+ virNodeDeviceObjPtr dev = NULL;
+ int ret = -1;
+
+ if (VIR_ALLOC(def) != 0) {
+ virReportOOMError();
+ goto out;
+ }
+
+ def->name = strdup("computer");
+ if (def->name == NULL) {
+ virReportOOMError();
+ goto out;
+ }
+
+ if (VIR_ALLOC(def->caps) != 0) {
+ virReportOOMError();
+ goto out;
+ }
+
+ udevGetDMIData(&def->caps->data);
dev = virNodeDeviceAssignDef(&driverState->devs, def);
if (dev == NULL) {
VIR_ERROR("Failed to create device for '%s'", def->name);
- virNodeDeviceDefFree(def);
goto out;
}
ret = 0;
out:
+ if (ret == -1) {
+ virNodeDeviceDefFree(def);
+ }
+
return ret;
}