devinfo.c revision 3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * devinfo.c : main file for libdevinfo-based device enumeration
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Licensed under the Academic Free License version 2.1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem **************************************************************************/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
00687e57f8c568d4f8fb446b6530a2942842292fartem#ifdef HAVE_CONFIG_H
00687e57f8c568d4f8fb446b6530a2942842292fartem# include <config.h>
00687e57f8c568d4f8fb446b6530a2942842292fartem#endif
00687e57f8c568d4f8fb446b6530a2942842292fartem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <string.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <libdevinfo.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../osspec.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../logger.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../hald.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../hald_dbus.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../device_info.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../util.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../hald_runner.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "osspec_solaris.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "hotplug.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "devinfo.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "devinfo_pci.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "devinfo_storage.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "devinfo_ieee1394.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "devinfo_usb.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "devinfo_misc.h"
7b840e52d558c34b70cbcde044d8d79852d169d2phitran#include "devinfo_acpi.h"
a9da3307db733eb1739ba859952610bba3d894abnp#include "devinfo_cpu.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid devinfo_add_subtree(HalDevice *parent, di_node_t node, gboolean is_root);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalDevice *devinfo_add_node(HalDevice *parent, di_node_t node);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_add(HalDevice *parent, gchar *path)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem di_node_t root;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp (path, "/") == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((root = di_init(path, DINFOCACHE)) == DI_NODE_NIL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("di_init() failed %d", errno));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((root = di_init(path, DINFOCPYALL)) == DI_NODE_NIL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("di_init() failed %d", errno));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_subtree(parent, root, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem di_fini (root);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_add_subtree(HalDevice *parent, di_node_t node, gboolean is_root)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *d;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem di_node_t root_node, child_node;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("add_subtree: %s", di_node_name (node)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem root_node = node;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem do {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem d = devinfo_add_node (parent, node);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((d != NULL) &&
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (child_node = di_child_node (node)) != DI_NODE_NIL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_subtree (d, child_node, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem node = di_sibling_node (node);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } while ((node != DI_NODE_NIL) &&
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (!is_root || di_parent_node (node) == root_node));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_set_default_properties (HalDevice *d, HalDevice *parent, di_node_t node, char *devfs_path)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *driver_name, *s;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *s1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char udi[HAL_PATH_MAX];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (parent != NULL) {
00687e57f8c568d4f8fb446b6530a2942842292fartem hal_device_property_set_string (d, "info.parent", hal_device_get_udi (parent));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.parent", "/org/freedesktop/Hal/devices/local");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_compute_udi (hald_get_gdl (), udi, sizeof (udi),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "/org/freedesktop/Hal/devices%s_%d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devfs_path,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem di_instance (node));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_set_udi (d, udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.udi", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (di_prop_lookup_strings (DDI_DEV_T_ANY, node, "model", &s) > 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.product", s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.product", di_node_name (node));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "solaris.devfs_path", devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((driver_name = di_driver_name (node)) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.solaris.driver",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem driver_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* inherit parent's claim attributes */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_device_property_get_bool (parent, "info.claimed")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s1 = hal_device_property_get_string (parent, "info.claimed.service");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (s1 != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "info.claimed", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.claimed.service", s1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/* device handlers, ordered specific to generic */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic DevinfoDevHandler *devinfo_handlers[] = {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &devinfo_computer_handler,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &devinfo_cpu_handler,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &devinfo_ide_handler,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &devinfo_scsi_handler,
00687e57f8c568d4f8fb446b6530a2942842292fartem &devinfo_pcata_handler,
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore &devinfo_blkdev_handler,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &devinfo_floppy_handler,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &devinfo_usb_handler,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &devinfo_ieee1394_handler,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &devinfo_lofi_handler,
7b840e52d558c34b70cbcde044d8d79852d169d2phitran &devinfo_acpi_handler,
d2ec54f7875f7e05edd56195adbeb593c947763fphitran &devinfo_power_button_handler,
d2ec54f7875f7e05edd56195adbeb593c947763fphitran &devinfo_keyboard_handler,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems &devinfo_mouse_handler,
17c1f1d29d41a12dc893091f0bf870753774dd1aLin Guo - Sun Microsystems &devinfo_pci_handler,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &devinfo_default_handler,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL
18c2aff776a775d34a4c9893a4c72e0434d68e36artem};
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalDevice *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_add_node(HalDevice *parent, di_node_t node)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *d = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *devfs_path;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *device_type = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DevinfoDevHandler *handler;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devfs_path = di_devfs_path (node);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) di_prop_lookup_strings (DDI_DEV_T_ANY, node, "device_type",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &device_type);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; (d == NULL) && (devinfo_handlers[i] != NULL); i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem handler = devinfo_handlers[i];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem d = handler->add (parent, node, devfs_path, device_type);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem di_devfs_path_free(devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("add_node: %s", d ? hal_device_get_udi (d) : "none"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_hotplug_enqueue(HalDevice *d, gchar *devfs_path, DevinfoDevHandler *handler, int action, int front)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HotplugEvent *hotplug_event;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hotplug_event = g_new0 (HotplugEvent, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hotplug_event->action = action;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hotplug_event->type = HOTPLUG_EVENT_DEVFS;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hotplug_event->d = d;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strlcpy (hotplug_event->un.devfs.devfs_path, devfs_path,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sizeof (hotplug_event->un.devfs.devfs_path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hotplug_event->un.devfs.handler = handler;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hotplug_event_enqueue (hotplug_event, front);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_add_enqueue(HalDevice *d, gchar *devfs_path, DevinfoDevHandler *handler)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_hotplug_enqueue (d, devfs_path, handler, HOTPLUG_ACTION_ADD, 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_add_enqueue_at_front(HalDevice *d, gchar *devfs_path, DevinfoDevHandler *handler)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_hotplug_enqueue (d, devfs_path, handler, HOTPLUG_ACTION_ADD, 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_remove_enqueue(gchar *devfs_path, DevinfoDevHandler *handler)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_hotplug_enqueue (NULL, devfs_path, handler, HOTPLUG_ACTION_REMOVE, 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_callouts_add_done (HalDevice *d, gpointer userdata1, gpointer userdata2)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem void *end_token = (void *) userdata1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Move from temporary to global device store */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_store_remove (hald_get_tdl (), d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_store_add (hald_get_gdl (), d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hotplug_event_end (end_token);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_callouts_probing_done (HalDevice *d, guint32 exit_type, gint return_code, char **error, gpointer userdata1, gpointer userdata2)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem void *end_token = (void *) userdata1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Discard device if probing reports failure */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (exit_type != HALD_RUN_SUCCESS || (return_code != 0)) {
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("Probing for %s failed %d", hal_device_get_udi (d), return_code));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_store_remove (hald_get_tdl (), d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_object_unref (d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hotplug_event_end (end_token);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Merge properties from .fdi files */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem di_search_and_merge (d, DEVICE_INFO_TYPE_INFORMATION);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem di_search_and_merge (d, DEVICE_INFO_TYPE_POLICY);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_callout_device_add (d, devinfo_callouts_add_done, end_token, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_callouts_preprobing_done (HalDevice *d, gpointer userdata1, gpointer userdata2)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem void *end_token = (void *) userdata1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DevinfoDevHandler *handler = (DevinfoDevHandler *) userdata2;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem void (*probing_done) (HalDevice *, guint32, gint, char **, gpointer, gpointer);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const gchar *prober;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int prober_timeout;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_device_property_get_bool (d, "info.ignore")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("Preprobing merged info.ignore==TRUE"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Leave device with info.ignore==TRUE so we won't pick up children */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_remove (d, "info.category");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_remove (d, "info.capabilities");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_store_remove (hald_get_tdl (), d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_store_add (hald_get_gdl (), d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hotplug_event_end (end_token);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (handler != NULL && handler->get_prober != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prober = handler->get_prober (d, &prober_timeout);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prober = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (handler->probing_done != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem probing_done = handler->probing_done;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem probing_done = devinfo_callouts_probing_done;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prober != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* probe the device */
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO(("Probing udi=%s", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hald_runner_run (d,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prober, NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prober_timeout,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem probing_done,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (gpointer) end_token, (gpointer) handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem probing_done (d, 0, 0, NULL, userdata1, userdata2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/* This is the beginning of hotplug even handling */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhotplug_event_begin_add_devinfo (HalDevice *d, HalDevice *parent, DevinfoDevHandler *handler, void *end_token)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems HotplugEvent *hotplug_event = (HotplugEvent *)end_token;
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO(("Preprobing udi=%s", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems if (parent == NULL && (strcmp(hotplug_event->un.devfs.devfs_path, "/") != 0)) {
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems HAL_ERROR (("Parent is NULL, devfs_path=%s", hotplug_event->un.devfs.devfs_path));
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems goto skip;
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems }
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (parent != NULL && hal_device_property_get_bool (parent, "info.ignore")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("Ignoring device since parent has info.ignore==TRUE"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems goto skip;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (hal_device_store_find (hald_get_tdl (), hal_device_get_udi (d)) == NULL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* add to TDL so preprobing callouts and prober can access it */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_store_add (hald_get_tdl (), d);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Process preprobe fdi files */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem di_search_and_merge (d, DEVICE_INFO_TYPE_PREPROBE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Run preprobe callouts */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_callout_device_preprobe (d, devinfo_callouts_preprobing_done, end_token, handler);
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems return;
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystemsskip:
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems if (hal_device_store_find (hald_get_tdl (), hal_device_get_udi (d)))
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems hal_device_store_remove (hald_get_tdl (), d);
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems g_object_unref (d);
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems hotplug_event_end (end_token);
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_remove (gchar *devfs_path)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_remove_enqueue ((gchar *)devfs_path, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/* generate hotplug event for each device in this branch */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_remove_branch (gchar *devfs_path, HalDevice *d)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *children;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *child;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *child_devfs_path;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (d == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem d = hal_device_store_match_key_value_string (hald_get_gdl (),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "solaris.devfs_path", devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (d == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("remove_branch: %s %s\n", devfs_path, hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* first remove children */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem children = hal_device_store_match_multiple_key_value_string (hald_get_gdl(),
00687e57f8c568d4f8fb446b6530a2942842292fartem "info.parent", hal_device_get_udi (d));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = children; i != NULL; i = g_slist_next (i)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem child = HAL_DEVICE (i->data);
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("remove_branch: child %s\n", hal_device_get_udi (child)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_remove_branch ((gchar *)hal_device_property_get_string (child, "solaris.devfs_path"), child);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_slist_free (children);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("remove_branch: done with children"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* then remove self */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("remove_branch: queueing %s", devfs_path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_remove_enqueue (devfs_path, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_callouts_remove_done (HalDevice *d, gpointer userdata1, gpointer userdata2)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem void *end_token = (void *) userdata1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("Remove callouts completed udi=%s", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!hal_device_store_remove (hald_get_gdl (), d)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_WARNING (("Error removing device"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_object_unref (d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hotplug_event_end (end_token);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhotplug_event_begin_remove_devinfo (HalDevice *d, gchar *devfs_path, void *end_token)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_device_has_capability (d, "volume")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_volume_hotplug_begin_remove (d, devfs_path, end_token);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_callout_device_remove (d, devinfo_callouts_remove_done, end_token, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_device_rescan (HalDevice *d)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_device_has_capability (d, "block")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (devinfo_storage_device_rescan (d));
076d97abc78bcba2f2216859fe2c6913cc7aff32Phi Tran } else if (hal_device_has_capability (d, "button")) {
076d97abc78bcba2f2216859fe2c6913cc7aff32Phi Tran return (devinfo_lid_rescan (d));
7b840e52d558c34b70cbcde044d8d79852d169d2phitran } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
42a7bded1b1244af097afdc88654381a3d3879f9jacobsstatic int
42a7bded1b1244af097afdc88654381a3d3879f9jacobswalk_devlinks(di_devlink_t devlink, void *arg)
42a7bded1b1244af097afdc88654381a3d3879f9jacobs{
42a7bded1b1244af097afdc88654381a3d3879f9jacobs char **path= (char **)arg;
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
42a7bded1b1244af097afdc88654381a3d3879f9jacobs *path = strdup(di_devlink_path(devlink));
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
42a7bded1b1244af097afdc88654381a3d3879f9jacobs return (DI_WALK_TERMINATE);
42a7bded1b1244af097afdc88654381a3d3879f9jacobs}
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
42a7bded1b1244af097afdc88654381a3d3879f9jacobschar *
42a7bded1b1244af097afdc88654381a3d3879f9jacobsget_devlink(di_devlink_handle_t devlink_hdl, char *re, char *path)
42a7bded1b1244af097afdc88654381a3d3879f9jacobs{
42a7bded1b1244af097afdc88654381a3d3879f9jacobs char *devlink_path = NULL;
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
42a7bded1b1244af097afdc88654381a3d3879f9jacobs (void) di_devlink_walk(devlink_hdl, re, path,
42a7bded1b1244af097afdc88654381a3d3879f9jacobs DI_PRIMARY_LINK, &devlink_path, walk_devlinks);
42a7bded1b1244af097afdc88654381a3d3879f9jacobs
42a7bded1b1244af097afdc88654381a3d3879f9jacobs return (devlink_path);
42a7bded1b1244af097afdc88654381a3d3879f9jacobs}