diff --git a/docs/drvnodedev.html.in b/docs/drvnodedev.html.in
index ab87b6bbd2..0823c1888d 100644
--- a/docs/drvnodedev.html.in
+++ b/docs/drvnodedev.html.in
@@ -23,8 +23,7 @@
(more info about NPIV)).
Devices on the host system are arranged in a tree-like hierarchy, with
the root node being called computer
. The node device driver
- supports two backends to manage the devices, HAL and udev, with the former
- being deprecated in favour of the latter.
+ supports udev backend (HAL backend was removed in 6.8.0
).
diff --git a/libvirt.spec.in b/libvirt.spec.in
index 62b401bd08..d9bfed0bef 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -1166,7 +1166,6 @@ export SOURCE_DATE_EPOCH=$(stat --printf='%Y' %{_specdir}/%{name}.spec)
%{?arg_selinux_mount} \
-Dapparmor=disabled \
-Dsecdriver_apparmor=disabled \
- -Dhal=disabled \
-Dudev=enabled \
-Dyajl=enabled \
%{?arg_sanlock} \
diff --git a/meson.build b/meson.build
index 195d7cd784..3d15b4ee34 100644
--- a/meson.build
+++ b/meson.build
@@ -1077,12 +1077,6 @@ glusterfs_dep = dependency('glusterfs-api', version: '>=' + glusterfs_version, r
gnutls_version = '3.2.0'
gnutls_dep = dependency('gnutls', version: '>=' + gnutls_version)
-hal_version = '0.5.0'
-hal_dep = dependency('hal', version: '>=' + hal_version, required: get_option('hal'))
-if hal_dep.found()
- conf.set('WITH_HAL', 1)
-endif
-
# Check for BSD kvm (kernel memory interface)
if host_machine.system() == 'freebsd'
kvm_dep = cc.find_library('kvm')
@@ -1728,7 +1722,7 @@ if not get_option('driver_network').disabled() and conf.has('WITH_LIBVIRTD') and
conf.set('WITH_NETWORK', 1)
endif
-if hal_dep.found() or udev_dep.found()
+if udev_dep.found()
conf.set('WITH_NODE_DEVICES', 1)
endif
@@ -2433,7 +2427,6 @@ libs_summary = {
'glib_dep': glib_dep.found(),
'glusterfs': glusterfs_dep.found(),
'gnutls': gnutls_dep.found(),
- 'hal': hal_dep.found(),
'libiscsi': libiscsi_dep.found(),
'libnl': libnl_dep.found(),
'libpcap': libpcap_dep.found(),
diff --git a/meson_options.txt b/meson_options.txt
index 7838630c1e..c8886e1430 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -23,7 +23,6 @@ option('firewalld', type: 'feature', value: 'auto', description: 'firewalld supp
option('firewalld_zone', type: 'feature', value: 'auto', description: 'whether to install firewalld libvirt zone')
option('fuse', type: 'feature', value: 'auto', description: 'fuse support')
option('glusterfs', type: 'feature', value: 'auto', description: 'glusterfs support')
-option('hal', type: 'feature', value: 'auto', description: 'hal support')
option('libiscsi', type: 'feature', value: 'auto', description: 'libiscsi support')
option('libpcap', type: 'feature', value: 'auto', description: 'libpcap support')
option('libssh', type: 'feature', value: 'auto', description: 'libssh support')
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 471af30b89..4ab8832b37 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -130,7 +130,6 @@
@SRCDIR@src/network/bridge_driver_linux.c
@SRCDIR@src/network/leaseshelper.c
@SRCDIR@src/node_device/node_device_driver.c
-@SRCDIR@src/node_device/node_device_hal.c
@SRCDIR@src/node_device/node_device_udev.c
@SRCDIR@src/nwfilter/nwfilter_dhcpsnoop.c
@SRCDIR@src/nwfilter/nwfilter_driver.c
diff --git a/scripts/hvsupport.py b/scripts/hvsupport.py
index 14c41da348..e2aab8feff 100755
--- a/scripts/hvsupport.py
+++ b/scripts/hvsupport.py
@@ -60,7 +60,6 @@ for root, dirs, files in os.walk(os.path.join(srcdir, "src")):
file.endswith("common.c") or
file.endswith("tmpl.c") or
file.endswith("monitor.c") or
- file.endswith("hal.c") or
file.endswith("udev.c")):
srcs.append(os.path.join(root, file))
diff --git a/src/node_device/meson.build b/src/node_device/meson.build
index 5953c6b8ed..c4e4c3906b 100644
--- a/src/node_device/meson.build
+++ b/src/node_device/meson.build
@@ -4,10 +4,6 @@ node_device_driver_sources = [
stateful_driver_source_files += files(node_device_driver_sources)
-if conf.has('WITH_HAL')
- node_device_driver_sources += 'node_device_hal.c'
-endif
-
if conf.has('WITH_UDEV')
node_device_driver_sources += 'node_device_udev.c'
endif
@@ -22,7 +18,6 @@ if conf.has('WITH_NODE_DEVICES')
],
dependencies: [
access_dep,
- hal_dep,
libnl_dep,
pciaccess_dep,
src_dep,
diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
index 375c1fff32..f4b140bef4 100644
--- a/src/node_device/node_device_driver.c
+++ b/src/node_device/node_device_driver.c
@@ -36,7 +36,6 @@
#include "node_device_conf.h"
#include "node_device_event.h"
#include "node_device_driver.h"
-#include "node_device_hal.h"
#include "node_device_util.h"
#include "virvhba.h"
#include "viraccessapicheck.h"
@@ -98,14 +97,13 @@ int nodeConnectIsAlive(virConnectPtr conn G_GNUC_UNUSED)
return 1;
}
-#if defined (__linux__) && ( defined (WITH_HAL) || defined(WITH_UDEV))
+#if defined (__linux__) && defined(WITH_UDEV)
/* NB: It was previously believed that changes in driver name were
* relayed to libvirt as "change" events by udev, and the udev event
* notification is setup to recognize such events and effectively
* recreate the device entry in the cache. However, neither the kernel
* nor udev sends such an event, so it is necessary to manually update
- * the driver name for a device each time its entry is used, both for
- * udev *and* HAL backends.
+ * the driver name for a device each time its entry is used.
*/
static int
nodeDeviceUpdateDriverName(virNodeDeviceDefPtr def)
@@ -935,9 +933,5 @@ nodedevRegister(void)
{
#ifdef WITH_UDEV
return udevNodeRegister();
-#else
-# ifdef WITH_HAL
- return halNodeRegister();
-# endif
#endif
}
diff --git a/src/node_device/node_device_driver.h b/src/node_device/node_device_driver.h
index be5d397828..2113d2b0a5 100644
--- a/src/node_device/node_device_driver.h
+++ b/src/node_device/node_device_driver.h
@@ -28,11 +28,6 @@
#define LINUX_NEW_DEVICE_WAIT_TIME 60
-#ifdef WITH_HAL
-int
-halNodeRegister(void);
-#endif
-
#ifdef WITH_UDEV
int
udevNodeRegister(void);
diff --git a/src/node_device/node_device_hal.c b/src/node_device/node_device_hal.c
deleted file mode 100644
index 53a49ba2aa..0000000000
--- a/src/node_device/node_device_hal.c
+++ /dev/null
@@ -1,843 +0,0 @@
-/*
- * node_device_hal.c: node device enumeration - HAL-based implementation
- *
- * Copyright (C) 2011-2015 Red Hat, Inc.
- * Copyright (C) 2008 Virtual Iron Software, Inc.
- * Copyright (C) 2008 David F. Lively
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see
- * .
- */
-
-#include
-
-#include
-
-#include "node_device_conf.h"
-#include "node_device_driver.h"
-#include "node_device_hal.h"
-#include "virerror.h"
-#include "driver.h"
-#include "datatypes.h"
-#include "viralloc.h"
-#include "viruuid.h"
-#include "virfile.h"
-#include "virpci.h"
-#include "virpidfile.h"
-#include "virlog.h"
-#include "virdbus.h"
-#include "virstring.h"
-#include "virutil.h"
-
-#include "configmake.h"
-
-#define VIR_FROM_THIS VIR_FROM_NODEDEV
-
-VIR_LOG_INIT("node_device.node_device_hal");
-
-/*
- * Host device enumeration (HAL implementation)
- */
-
-#define DRV_STATE_HAL_CTX(ds) ((LibHalContext *)((ds)->privateData))
-
-
-static const char *
-hal_name(const char *udi)
-{
- const char *name = strrchr(udi, '/');
- if (name)
- return name + 1;
- return udi;
-}
-
-
-static int
-get_str_prop(LibHalContext *ctxt, const char *udi,
- const char *prop, char **val_p)
-{
- char *val = libhal_device_get_property_string(ctxt, udi, prop, NULL);
-
- if (val) {
- if (*val) {
- *val_p = val;
- return 0;
- } else {
- /* Treat empty strings as NULL values */
- VIR_FREE(val);
- }
- }
-
- return -1;
-}
-
-static int
-get_int_prop(LibHalContext *ctxt, const char *udi,
- const char *prop, int *val_p)
-{
- DBusError err;
- int val;
- int rv;
-
- dbus_error_init(&err);
- val = libhal_device_get_property_int(ctxt, udi, prop, &err);
- rv = dbus_error_is_set(&err);
- dbus_error_free(&err);
- if (rv == 0)
- *val_p = val;
-
- return rv;
-}
-
-static int
-get_bool_prop(LibHalContext *ctxt, const char *udi,
- const char *prop, int *val_p)
-{
- DBusError err;
- int val;
- int rv;
-
- dbus_error_init(&err);
- val = libhal_device_get_property_bool(ctxt, udi, prop, &err);
- rv = dbus_error_is_set(&err);
- dbus_error_free(&err);
- if (rv == 0)
- *val_p = val;
-
- return rv;
-}
-
-static int
-get_uint64_prop(LibHalContext *ctxt, const char *udi,
- const char *prop, unsigned long long *val_p)
-{
- DBusError err;
- unsigned long long val;
- int rv;
-
- dbus_error_init(&err);
- val = libhal_device_get_property_uint64(ctxt, udi, prop, &err);
- rv = dbus_error_is_set(&err);
- dbus_error_free(&err);
- if (rv == 0)
- *val_p = val;
-
- return rv;
-}
-
-static int
-gather_pci_cap(LibHalContext *ctx, const char *udi,
- virNodeDevCapDataPtr d)
-{
- char *sysfs_path;
-
- if (get_str_prop(ctx, udi, "pci.linux.sysfs_path", &sysfs_path) == 0) {
- char *p = strrchr(sysfs_path, '/');
- if (p) {
- ignore_value(virStrToLong_ui(p+1, &p, 16, &d->pci_dev.domain));
- ignore_value(virStrToLong_ui(p+1, &p, 16, &d->pci_dev.bus));
- ignore_value(virStrToLong_ui(p+1, &p, 16, &d->pci_dev.slot));
- ignore_value(virStrToLong_ui(p+1, &p, 16, &d->pci_dev.function));
- }
-
- if (virNodeDeviceGetPCIDynamicCaps(sysfs_path, &d->pci_dev) < 0) {
- VIR_FREE(sysfs_path);
- return -1;
- }
- VIR_FREE(sysfs_path);
- }
-
- (void)get_int_prop(ctx, udi, "pci.vendor_id", (int *)&d->pci_dev.vendor);
- if (get_str_prop(ctx, udi, "pci.vendor", &d->pci_dev.vendor_name) != 0)
- (void)get_str_prop(ctx, udi, "info.vendor", &d->pci_dev.vendor_name);
- (void)get_int_prop(ctx, udi, "pci.product_id", (int *)&d->pci_dev.product);
- if (get_str_prop(ctx, udi, "pci.product", &d->pci_dev.product_name) != 0)
- (void)get_str_prop(ctx, udi, "info.product", &d->pci_dev.product_name);
-
- return 0;
-}
-
-
-static int
-gather_usb_cap(LibHalContext *ctx, const char *udi,
- virNodeDevCapDataPtr d)
-{
- (void)get_int_prop(ctx, udi, "usb.interface.number",
- (int *)&d->usb_if.number);
- (void)get_int_prop(ctx, udi, "usb.interface.class",
- (int *)&d->usb_if.klass);
- (void)get_int_prop(ctx, udi, "usb.interface.subclass",
- (int *)&d->usb_if.subclass);
- (void)get_int_prop(ctx, udi, "usb.interface.protocol",
- (int *)&d->usb_if.protocol);
- (void)get_str_prop(ctx, udi, "usb.interface.description",
- &d->usb_if.description);
- return 0;
-}
-
-
-static int
-gather_usb_device_cap(LibHalContext *ctx, const char *udi,
- virNodeDevCapDataPtr d)
-{
- (void)get_int_prop(ctx, udi, "usb_device.bus_number",
- (int *)&d->usb_dev.bus);
- (void)get_int_prop(ctx, udi, "usb_device.linux.device_number",
- (int *)&d->usb_dev.device);
- (void)get_int_prop(ctx, udi, "usb_device.vendor_id",
- (int *)&d->usb_dev.vendor);
- if (get_str_prop(ctx, udi, "usb_device.vendor",
- &d->usb_dev.vendor_name) != 0)
- (void)get_str_prop(ctx, udi, "info.vendor", &d->usb_dev.vendor_name);
- (void)get_int_prop(ctx, udi, "usb_device.product_id",
- (int *)&d->usb_dev.product);
- if (get_str_prop(ctx, udi, "usb_device.product",
- &d->usb_dev.product_name) != 0)
- (void)get_str_prop(ctx, udi, "info.product", &d->usb_dev.product_name);
- return 0;
-}
-
-
-static int
-gather_net_cap(LibHalContext *ctx, const char *udi,
- virNodeDevCapDataPtr d)
-{
- unsigned long long dummy;
- (void)get_str_prop(ctx, udi, "net.interface", &d->net.ifname);
- (void)get_str_prop(ctx, udi, "net.address", &d->net.address);
- if (get_uint64_prop(ctx, udi, "net.80203.mac_address",
- &dummy) == 0)
- d->net.subtype = VIR_NODE_DEV_CAP_NET_80203;
- else if (get_uint64_prop(ctx, udi, "net.80211.mac_address",
- &dummy) == 0)
- d->net.subtype = VIR_NODE_DEV_CAP_NET_80211;
- else
- d->net.subtype = VIR_NODE_DEV_CAP_NET_LAST;
-
- return 0;
-}
-
-
-static int
-gather_scsi_host_cap(LibHalContext *ctx, const char *udi,
- virNodeDevCapDataPtr d)
-{
- (void)get_int_prop(ctx, udi, "scsi_host.host", (int *)&d->scsi_host.host);
-
- return virNodeDeviceGetSCSIHostCaps(&d->scsi_host);
-}
-
-
-static int
-gather_scsi_cap(LibHalContext *ctx, const char *udi,
- virNodeDevCapDataPtr d)
-{
- (void)get_int_prop(ctx, udi, "scsi.host", (int *)&d->scsi.host);
- (void)get_int_prop(ctx, udi, "scsi.bus", (int *)&d->scsi.bus);
- (void)get_int_prop(ctx, udi, "scsi.target", (int *)&d->scsi.target);
- (void)get_int_prop(ctx, udi, "scsi.lun", (int *)&d->scsi.lun);
- (void)get_str_prop(ctx, udi, "scsi.type", &d->scsi.type);
- return 0;
-}
-
-
-static int
-gather_storage_cap(LibHalContext *ctx, const char *udi,
- virNodeDevCapDataPtr d)
-{
- int val;
- (void)get_str_prop(ctx, udi, "block.device", &d->storage.block);
- (void)get_str_prop(ctx, udi, "storage.bus", &d->storage.bus);
- (void)get_str_prop(ctx, udi, "storage.drive_type", &d->storage.drive_type);
- (void)get_str_prop(ctx, udi, "storage.model", &d->storage.model);
- (void)get_str_prop(ctx, udi, "storage.vendor", &d->storage.vendor);
- (void)get_str_prop(ctx, udi, "storage.serial", &d->storage.serial);
- if (get_bool_prop(ctx, udi, "storage.removable", &val) == 0 && val) {
- d->storage.flags |= VIR_NODE_DEV_CAP_STORAGE_REMOVABLE;
- if (get_bool_prop(ctx, udi, "storage.removable.media_available",
- &val) == 0 && val) {
- d->storage.flags |=
- VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE;
- (void)get_uint64_prop(ctx, udi, "storage.removable.media_size",
- &d->storage.removable_media_size);
- }
- } else {
- (void)get_uint64_prop(ctx, udi, "storage.size", &d->storage.size);
- }
- if (get_bool_prop(ctx, udi, "storage.hotpluggable", &val) == 0 && val)
- d->storage.flags |= VIR_NODE_DEV_CAP_STORAGE_HOTPLUGGABLE;
- return 0;
-}
-
-static int
-gather_scsi_generic_cap(LibHalContext *ctx, const char *udi,
- virNodeDevCapDataPtr d)
-{
- (void)get_str_prop(ctx, udi, "scsi_generic.device", &d->sg.path);
- return 0;
-}
-
-
-static int
-gather_system_cap(LibHalContext *ctx, const char *udi,
- virNodeDevCapDataPtr d)
-{
- char *uuidstr;
-
- (void)get_str_prop(ctx, udi, "system.product", &d->system.product_name);
- (void)get_str_prop(ctx, udi, "system.hardware.vendor",
- &d->system.hardware.vendor_name);
- (void)get_str_prop(ctx, udi, "system.hardware.version",
- &d->system.hardware.version);
- (void)get_str_prop(ctx, udi, "system.hardware.serial",
- &d->system.hardware.serial);
- if (get_str_prop(ctx, udi, "system.hardware.uuid", &uuidstr) == 0) {
- ignore_value(virUUIDParse(uuidstr, d->system.hardware.uuid));
- VIR_FREE(uuidstr);
- }
- (void)get_str_prop(ctx, udi, "system.firmware.vendor",
- &d->system.firmware.vendor_name);
- (void)get_str_prop(ctx, udi, "system.firmware.version",
- &d->system.firmware.version);
- (void)get_str_prop(ctx, udi, "system.firmware.release_date",
- &d->system.firmware.release_date);
- return 0;
-}
-
-
-struct _caps_tbl_entry {
- const char *cap_name;
- virNodeDevCapType type;
- int (*gather_fn)(LibHalContext *ctx,
- const char *udi,
- virNodeDevCapDataPtr data);
-};
-
-typedef struct _caps_tbl_entry caps_tbl_entry;
-
-static caps_tbl_entry caps_tbl[] = {
- { "system", VIR_NODE_DEV_CAP_SYSTEM, gather_system_cap },
- { "pci", VIR_NODE_DEV_CAP_PCI_DEV, gather_pci_cap },
- { "usb", VIR_NODE_DEV_CAP_USB_INTERFACE, gather_usb_cap },
- { "usb_device", VIR_NODE_DEV_CAP_USB_DEV, gather_usb_device_cap },
- { "net", VIR_NODE_DEV_CAP_NET, gather_net_cap },
- { "scsi_host", VIR_NODE_DEV_CAP_SCSI_HOST, gather_scsi_host_cap },
- { "scsi", VIR_NODE_DEV_CAP_SCSI, gather_scsi_cap },
- { "storage", VIR_NODE_DEV_CAP_STORAGE, gather_storage_cap },
- { "scsi_generic", VIR_NODE_DEV_CAP_SCSI_GENERIC, gather_scsi_generic_cap },
-};
-
-
-/* qsort/bsearch string comparator */
-static int
-cmpstringp(const void *p1, const void *p2)
-{
- /* from man 3 qsort */
- return strcmp(* (char * const *) p1, * (char * const *) p2);
-}
-
-
-static int
-gather_capability(LibHalContext *ctx, const char *udi,
- const char *cap_name,
- virNodeDevCapsDefPtr *caps_p)
-{
- caps_tbl_entry *entry;
-
- entry = bsearch(&cap_name, caps_tbl, G_N_ELEMENTS(caps_tbl),
- sizeof(caps_tbl[0]), cmpstringp);
-
- if (entry) {
- virNodeDevCapsDefPtr caps;
- if (VIR_ALLOC(caps) < 0)
- return ENOMEM;
- caps->data.type = entry->type;
- if (entry->gather_fn) {
- int rv = (*entry->gather_fn)(ctx, udi, &caps->data);
- if (rv != 0) {
- virNodeDevCapsDefFree(caps);
- return rv;
- }
- }
- caps->next = *caps_p;
- *caps_p = caps;
- }
-
- return 0;
-}
-
-
-static int
-gather_capabilities(LibHalContext *ctx, const char *udi,
- virNodeDevCapsDefPtr *caps_p)
-{
- char *bus_name = NULL;
- virNodeDevCapsDefPtr caps = NULL;
- char **hal_cap_names = NULL;
- int rv;
- size_t i;
-
- if (STREQ(udi, "/org/freedesktop/Hal/devices/computer")) {
- rv = gather_capability(ctx, udi, "system", &caps);
- if (rv != 0)
- goto failure;
- }
-
- if (get_str_prop(ctx, udi, "info.subsystem", &bus_name) == 0 ||
- get_str_prop(ctx, udi, "linux.subsystem", &bus_name) == 0) {
- rv = gather_capability(ctx, udi, bus_name, &caps);
- if (rv != 0)
- goto failure;
- }
-
- hal_cap_names = libhal_device_get_property_strlist(ctx, udi,
- "info.capabilities",
- NULL);
- if (hal_cap_names) {
- for (i = 0; hal_cap_names[i]; i++) {
- if (! (bus_name && STREQ(hal_cap_names[i], bus_name))) {
- rv = gather_capability(ctx, udi, hal_cap_names[i], &caps);
- if (rv != 0)
- goto failure;
- }
- }
- for (i = 0; hal_cap_names[i]; i++)
- VIR_FREE(hal_cap_names[i]);
- VIR_FREE(hal_cap_names);
- }
- VIR_FREE(bus_name);
-
- *caps_p = caps;
- return 0;
-
- failure:
- VIR_FREE(bus_name);
- if (hal_cap_names) {
- for (i = 0; hal_cap_names[i]; i++)
- VIR_FREE(hal_cap_names[i]);
- VIR_FREE(hal_cap_names);
- }
- while (caps) {
- virNodeDevCapsDefPtr next = caps->next;
- virNodeDevCapsDefFree(caps);
- caps = next;
- }
- return rv;
-}
-
-static void
-dev_create(const char *udi)
-{
- LibHalContext *ctx;
- char *parent_key = NULL;
- virNodeDeviceObjPtr obj = NULL;
- virNodeDeviceDefPtr def = NULL;
- virNodeDeviceDefPtr objdef;
- const char *name = hal_name(udi);
- int rv;
- char *devicePath = NULL;
-
- nodeDeviceLock();
- ctx = DRV_STATE_HAL_CTX(driver);
-
- if (VIR_ALLOC(def) < 0)
- goto failure;
-
- def->name = g_strdup(name);
-
- if (get_str_prop(ctx, udi, "info.parent", &parent_key) == 0) {
- def->parent = g_strdup(hal_name(parent_key));
- VIR_FREE(parent_key);
- }
-
- rv = gather_capabilities(ctx, udi, &def->caps);
- if (rv != 0) goto failure;
-
- if (def->caps == NULL)
- goto cleanup;
-
- /* Some devices don't have a path in sysfs, so ignore failure */
- (void)get_str_prop(ctx, udi, "linux.sysfs_path", &devicePath);
-
- if (!(obj = virNodeDeviceObjListAssignDef(driver->devs, def))) {
- VIR_FREE(devicePath);
- goto failure;
- }
- objdef = virNodeDeviceObjGetDef(obj);
-
- objdef->sysfs_path = devicePath;
-
- virNodeDeviceObjEndAPI(&obj);
-
- nodeDeviceUnlock();
- return;
-
- failure:
- VIR_DEBUG("FAILED TO ADD dev %s", name);
- cleanup:
- virNodeDeviceDefFree(def);
- nodeDeviceUnlock();
-}
-
-static void
-dev_refresh(const char *udi)
-{
- const char *name = hal_name(udi);
- virNodeDeviceObjPtr obj;
-
- if ((obj = virNodeDeviceObjListFindByName(driver->devs, name))) {
- /* Simply "rediscover" device -- incrementally handling changes
- * to sub-capabilities (like net.80203) is nasty ... so avoid it.
- */
- virNodeDeviceObjListRemove(driver->devs, obj);
- virObjectUnref(obj);
- dev_create(udi);
- } else {
- VIR_DEBUG("no device named %s", name);
- }
-}
-
-static void
-device_added(LibHalContext *ctx G_GNUC_UNUSED,
- const char *udi)
-{
- VIR_DEBUG("%s", hal_name(udi));
- dev_create(udi);
-}
-
-
-static void
-device_removed(LibHalContext *ctx G_GNUC_UNUSED,
- const char *udi)
-{
- const char *name = hal_name(udi);
- virNodeDeviceObjPtr obj;
-
- obj = virNodeDeviceObjListFindByName(driver->devs, name);
- VIR_DEBUG("%s", name);
- if (obj)
- virNodeDeviceObjListRemove(driver->devs, obj);
- else
- VIR_DEBUG("no device named %s", name);
- virObjectUnref(obj);
-}
-
-
-static void
-device_cap_added(LibHalContext *ctx,
- const char *udi, const char *cap)
-{
- const char *name = hal_name(udi);
- virNodeDeviceObjPtr obj;
- virNodeDeviceDefPtr def;
-
- VIR_DEBUG("%s %s", cap, name);
- if ((obj = virNodeDeviceObjListFindByName(driver->devs, name))) {
- def = virNodeDeviceObjGetDef(obj);
- (void)gather_capability(ctx, udi, cap, &def->caps);
- virNodeDeviceObjEndAPI(&obj);
- } else {
- VIR_DEBUG("no device named %s", name);
- }
-}
-
-
-static void
-device_cap_lost(LibHalContext *ctx G_GNUC_UNUSED,
- const char *udi,
- const char *cap)
-{
- const char *name = hal_name(udi);
- VIR_DEBUG("%s %s", cap, name);
-
- dev_refresh(udi);
-}
-
-
-static void
-device_prop_modified(LibHalContext *ctx G_GNUC_UNUSED,
- const char *udi,
- const char *key,
- dbus_bool_t is_removed G_GNUC_UNUSED,
- dbus_bool_t is_added G_GNUC_UNUSED)
-{
- const char *name = hal_name(udi);
- VIR_DEBUG("%s %s", name, key);
-
- dev_refresh(udi);
-}
-
-
-static int
-nodeStateInitialize(bool privileged G_GNUC_UNUSED,
- const char *root,
- virStateInhibitCallback callback G_GNUC_UNUSED,
- void *opaque G_GNUC_UNUSED)
-{
- LibHalContext *hal_ctx = NULL;
- char **udi = NULL;
- int num_devs;
- size_t i;
- int ret = VIR_DRV_STATE_INIT_ERROR;
- DBusConnection *sysbus;
- DBusError err;
-
- if (root != NULL) {
- virReportError(VIR_ERR_INVALID_ARG, "%s",
- _("Driver does not support embedded mode"));
- return -1;
- }
-
- /* Ensure caps_tbl is sorted by capability name */
- qsort(caps_tbl, G_N_ELEMENTS(caps_tbl), sizeof(caps_tbl[0]),
- cmpstringp);
-
- if (VIR_ALLOC(driver) < 0)
- return VIR_DRV_STATE_INIT_ERROR;
-
- driver->lockFD = -1;
- if (virMutexInit(&driver->lock) < 0) {
- VIR_FREE(driver);
- return VIR_DRV_STATE_INIT_ERROR;
- }
-
- if (virCondInit(&driver->initCond) < 0) {
- virReportSystemError(errno, "%s",
- _("Unable to initialize condition variable"));
- virMutexDestroy(&driver->lock);
- VIR_FREE(driver);
- return VIR_DRV_STATE_INIT_ERROR;
- }
-
- nodeDeviceLock();
-
- if (privileged) {
- driver->stateDir = g_strdup_printf("%s/libvirt/nodedev", RUNSTATEDIR);
- } else {
- g_autofree char *rundir = NULL;
-
- rundir = virGetUserRuntimeDirectory();
- driver->stateDir = g_strdup_printf("%s/nodedev/run", rundir);
- }
-
- if (virFileMakePathWithMode(driver->stateDir, S_IRWXU) < 0) {
- virReportSystemError(errno, _("cannot create state directory '%s'"),
- driver->stateDir);
- goto failure;
- }
-
- if ((driver->lockFD =
- virPidFileAcquire(driver->stateDir, "driver", false, getpid())) < 0)
- goto failure;
-
- if (!(driver->devs = virNodeDeviceObjListNew()))
- goto failure;
-
- dbus_error_init(&err);
- if (!(sysbus = virDBusGetSystemBus())) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("DBus not available, disabling HAL driver: %s"),
- virGetLastErrorMessage());
- ret = VIR_DRV_STATE_INIT_SKIPPED;
- goto failure;
- }
-
- hal_ctx = libhal_ctx_new();
- if (hal_ctx == NULL) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("libhal_ctx_new returned NULL"));
- goto failure;
- }
-
- if (!libhal_ctx_set_dbus_connection(hal_ctx, sysbus)) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("libhal_ctx_set_dbus_connection failed"));
- goto failure;
- }
- if (!libhal_ctx_init(hal_ctx, &err)) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("libhal_ctx_init failed, haldaemon is probably "
- "not running"));
- /* We don't want to show a fatal error here,
- otherwise entire libvirtd shuts down when
- hald isn't running */
- ret = VIR_DRV_STATE_INIT_SKIPPED;
- goto failure;
- }
-
- /* Populate with known devices */
- driver->privateData = hal_ctx;
-
- /* We need to unlock state now, since setting these callbacks cause
- * a dbus RPC call, and while this call is waiting for the reply,
- * a signal may already arrive, triggering the callback and thus
- * requiring the lock !
- */
- nodeDeviceUnlock();
-
- /* Register HAL event callbacks */
- if (!libhal_ctx_set_device_added(hal_ctx, device_added) ||
- !libhal_ctx_set_device_removed(hal_ctx, device_removed) ||
- !libhal_ctx_set_device_new_capability(hal_ctx, device_cap_added) ||
- !libhal_ctx_set_device_lost_capability(hal_ctx, device_cap_lost) ||
- !libhal_ctx_set_device_property_modified(hal_ctx, device_prop_modified) ||
- !libhal_device_property_watch_all(hal_ctx, &err)) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("setting up HAL callbacks failed"));
- goto failure;
- }
-
- udi = libhal_get_all_devices(hal_ctx, &num_devs, &err);
- if (udi == NULL) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("libhal_get_all_devices failed"));
- goto failure;
- }
- for (i = 0; i < num_devs; i++) {
- dev_create(udi[i]);
- VIR_FREE(udi[i]);
- }
- VIR_FREE(udi);
-
- nodeDeviceLock();
- driver->initialized = true;
- nodeDeviceUnlock();
- virCondBroadcast(&driver->initCond);
-
- return VIR_DRV_STATE_INIT_COMPLETE;
-
- failure:
- if (dbus_error_is_set(&err)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("%s: %s"), err.name, err.message);
- dbus_error_free(&err);
- }
- virNodeDeviceObjListFree(driver->devs);
- if (hal_ctx)
- (void)libhal_ctx_free(hal_ctx);
- nodeDeviceUnlock();
- VIR_FREE(driver);
-
- return ret;
-}
-
-
-static int
-nodeStateCleanup(void)
-{
- if (driver) {
- nodeDeviceLock();
- LibHalContext *hal_ctx = DRV_STATE_HAL_CTX(driver);
- virNodeDeviceObjListFree(driver->devs);
- (void)libhal_ctx_shutdown(hal_ctx, NULL);
- (void)libhal_ctx_free(hal_ctx);
- if (driver->lockFD != -1)
- virPidFileRelease(driver->stateDir, "driver", driver->lockFD);
-
- VIR_FREE(driver->stateDir);
- nodeDeviceUnlock();
- virCondDestroy(&driver->initCond);
- virMutexDestroy(&driver->lock);
- VIR_FREE(driver);
- return 0;
- }
- return -1;
-}
-
-
-static int
-nodeStateReload(void)
-{
- DBusError err;
- char **udi = NULL;
- int num_devs;
- size_t i;
- LibHalContext *hal_ctx;
-
- VIR_INFO("Reloading HAL device state");
- nodeDeviceLock();
- VIR_INFO("Removing existing objects");
- virNodeDeviceObjListFree(driver->devs);
- nodeDeviceUnlock();
-
- hal_ctx = DRV_STATE_HAL_CTX(driver);
- VIR_INFO("Creating new objects");
- dbus_error_init(&err);
- udi = libhal_get_all_devices(hal_ctx, &num_devs, &err);
- if (udi == NULL) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("libhal_get_all_devices failed"));
- return -1;
- }
- for (i = 0; i < num_devs; i++) {
- dev_create(udi[i]);
- VIR_FREE(udi[i]);
- }
- VIR_FREE(udi);
- VIR_INFO("HAL device reload complete");
-
- return 0;
-}
-
-
-static virNodeDeviceDriver halNodeDeviceDriver = {
- .name = "HAL",
- .nodeNumOfDevices = nodeNumOfDevices, /* 0.5.0 */
- .nodeListDevices = nodeListDevices, /* 0.5.0 */
- .connectListAllNodeDevices = nodeConnectListAllNodeDevices, /* 0.10.2 */
- .nodeDeviceLookupByName = nodeDeviceLookupByName, /* 0.5.0 */
- .nodeDeviceLookupSCSIHostByWWN = nodeDeviceLookupSCSIHostByWWN, /* 1.0.2 */
- .nodeDeviceGetXMLDesc = nodeDeviceGetXMLDesc, /* 0.5.0 */
- .nodeDeviceGetParent = nodeDeviceGetParent, /* 0.5.0 */
- .nodeDeviceNumOfCaps = nodeDeviceNumOfCaps, /* 0.5.0 */
- .nodeDeviceListCaps = nodeDeviceListCaps, /* 0.5.0 */
- .nodeDeviceCreateXML = nodeDeviceCreateXML, /* 0.6.5 */
- .nodeDeviceDestroy = nodeDeviceDestroy, /* 0.6.5 */
-};
-
-
-static virHypervisorDriver halHypervisorDriver = {
- .name = "nodedev",
- .connectOpen = nodeConnectOpen, /* 4.1.0 */
- .connectClose = nodeConnectClose, /* 4.1.0 */
- .connectIsEncrypted = nodeConnectIsEncrypted, /* 4.1.0 */
- .connectIsSecure = nodeConnectIsSecure, /* 4.1.0 */
- .connectIsAlive = nodeConnectIsAlive, /* 4.1.0 */
-};
-
-
-static virConnectDriver halConnectDriver = {
- .localOnly = true,
- .uriSchemes = (const char *[]){ "nodedev", NULL },
- .hypervisorDriver = &halHypervisorDriver,
- .nodeDeviceDriver = &halNodeDeviceDriver,
-};
-
-
-static virStateDriver halStateDriver = {
- .name = "HAL",
- .stateInitialize = nodeStateInitialize, /* 0.5.0 */
- .stateCleanup = nodeStateCleanup, /* 0.5.0 */
- .stateReload = nodeStateReload, /* 0.5.0 */
-};
-
-int
-halNodeRegister(void)
-{
- if (virRegisterConnectDriver(&halConnectDriver, false) < 0)
- return -1;
- if (virSetSharedNodeDeviceDriver(&halNodeDeviceDriver) < 0)
- return -1;
- return virRegisterStateDriver(&halStateDriver);
-}
diff --git a/src/node_device/node_device_hal.h b/src/node_device/node_device_hal.h
deleted file mode 100644
index 5e9c25ae34..0000000000
--- a/src/node_device/node_device_hal.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * node_device_hal.h: node device enumeration - HAL-based implementation
- *
- * Copyright (C) 2009 Red Hat, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see
- * .
- *
- */
-
-#pragma once