18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * devinfo_misc : misc devices
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Use is subject to license terms.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Licensed under the Academic Free License version 2.1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem **************************************************************************/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
00687e57f8c568d4f8fb446b6530a2942842292fartem#ifdef HAVE_CONFIG_H
a9da3307db733eb1739ba859952610bba3d894abnp#include <config.h>
00687e57f8c568d4f8fb446b6530a2942842292fartem#endif
00687e57f8c568d4f8fb446b6530a2942842292fartem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <string.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/utsname.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <libdevinfo.h>
d2ec54f7875f7e05edd56195adbeb593c947763fphitran#include <sys/uadmin.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 "devinfo_misc.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic HalDevice *devinfo_computer_add(HalDevice *, di_node_t, char *, char *);
d2ec54f7875f7e05edd56195adbeb593c947763fphitranstatic HalDevice *devinfo_keyboard_add(HalDevice *, di_node_t, char *, char *);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsstatic HalDevice *devinfo_mouse_add(HalDevice *, di_node_t, char *, char *);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic HalDevice *devinfo_default_add(HalDevice *, di_node_t, char *, char *);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsconst gchar *devinfo_keyboard_get_prober(HalDevice *d, int *timeout);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemDevinfoDevHandler devinfo_computer_handler = {
d2ec54f7875f7e05edd56195adbeb593c947763fphitran devinfo_computer_add,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
d2ec54f7875f7e05edd56195adbeb593c947763fphitran NULL
18c2aff776a775d34a4c9893a4c72e0434d68e36artem};
a9da3307db733eb1739ba859952610bba3d894abnp
d2ec54f7875f7e05edd56195adbeb593c947763fphitranDevinfoDevHandler devinfo_keyboard_handler = {
d2ec54f7875f7e05edd56195adbeb593c947763fphitran devinfo_keyboard_add,
d2ec54f7875f7e05edd56195adbeb593c947763fphitran NULL,
d2ec54f7875f7e05edd56195adbeb593c947763fphitran NULL,
d2ec54f7875f7e05edd56195adbeb593c947763fphitran NULL,
d2ec54f7875f7e05edd56195adbeb593c947763fphitran NULL,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems devinfo_keyboard_get_prober
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems};
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun MicrosystemsDevinfoDevHandler devinfo_mouse_handler = {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems devinfo_mouse_add,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems NULL,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems NULL,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems NULL,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems NULL,
d2ec54f7875f7e05edd56195adbeb593c947763fphitran NULL
18c2aff776a775d34a4c9893a4c72e0434d68e36artem};
a9da3307db733eb1739ba859952610bba3d894abnp
18c2aff776a775d34a4c9893a4c72e0434d68e36artemDevinfoDevHandler devinfo_default_handler = {
d2ec54f7875f7e05edd56195adbeb593c947763fphitran devinfo_default_add,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NULL,
d2ec54f7875f7e05edd56195adbeb593c947763fphitran NULL
18c2aff776a775d34a4c9893a4c72e0434d68e36artem};
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic HalDevice *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_computer_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *d, *local_d;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem struct utsname un;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp (devfs_path, "/") != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem d = hal_device_new ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
d2ec54f7875f7e05edd56195adbeb593c947763fphitran hal_device_property_set_string (d, "info.subsystem", "unknown");
d2ec54f7875f7e05edd56195adbeb593c947763fphitran hal_device_property_set_string (d, "info.product", "Computer");
d2ec54f7875f7e05edd56195adbeb593c947763fphitran hal_device_property_set_string (d, "info.udi", "/org/freedesktop/Hal/devices/computer");
d2ec54f7875f7e05edd56195adbeb593c947763fphitran hal_device_set_udi (d, "/org/freedesktop/Hal/devices/computer");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "solaris.devfs_path", devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (uname (&un) >= 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "system.kernel.name", un.sysname);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "system.kernel.version", un.release);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "system.kernel.machine", un.machine);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
d2ec54f7875f7e05edd56195adbeb593c947763fphitran hal_device_property_set_bool(d, "power_management.can_hibernate",
d2ec54f7875f7e05edd56195adbeb593c947763fphitran (uadmin(A_FREEZE, AD_CHECK_SUSPEND_TO_DISK, 0) == 0));
d2ec54f7875f7e05edd56195adbeb593c947763fphitran hal_device_property_set_bool(d, "power_management.can_suspend",
d2ec54f7875f7e05edd56195adbeb593c947763fphitran (uadmin(A_FREEZE, AD_CHECK_SUSPEND_TO_RAM, 0) == 0));
d2ec54f7875f7e05edd56195adbeb593c947763fphitran
d2ec54f7875f7e05edd56195adbeb593c947763fphitran hal_device_add_capability(d, "button");
d2ec54f7875f7e05edd56195adbeb593c947763fphitran
7b840e52d558c34b70cbcde044d8d79852d169d2phitran /*
7b840e52d558c34b70cbcde044d8d79852d169d2phitran * Let computer be in TDL while synthesizing all other events
7b840e52d558c34b70cbcde044d8d79852d169d2phitran * because some may write to the object
7b840e52d558c34b70cbcde044d8d79852d169d2phitran */
d2ec54f7875f7e05edd56195adbeb593c947763fphitran hal_device_store_add (hald_get_tdl (), d);
7b840e52d558c34b70cbcde044d8d79852d169d2phitran
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_enqueue (d, devfs_path, &devinfo_computer_handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* all devinfo devices belong to the 'local' branch */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem local_d = hal_device_new ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
00687e57f8c568d4f8fb446b6530a2942842292fartem hal_device_property_set_string (local_d, "info.parent", hal_device_get_udi (d));
d2ec54f7875f7e05edd56195adbeb593c947763fphitran hal_device_property_set_string (local_d, "info.subsystem", "unknown");
d2ec54f7875f7e05edd56195adbeb593c947763fphitran hal_device_property_set_string (local_d, "info.product", "Local devices");
d2ec54f7875f7e05edd56195adbeb593c947763fphitran hal_device_property_set_string (local_d, "info.udi", "/org/freedesktop/Hal/devices/local");
d2ec54f7875f7e05edd56195adbeb593c947763fphitran hal_device_set_udi (local_d, "/org/freedesktop/Hal/devices/local");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (local_d, "solaris.devfs_path", "/local");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_enqueue (local_d, "/local", &devinfo_default_handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (local_d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
d2ec54f7875f7e05edd56195adbeb593c947763fphitranstatic HalDevice *
d2ec54f7875f7e05edd56195adbeb593c947763fphitrandevinfo_keyboard_add(HalDevice *parent, di_node_t node, char *devfs_path,
d2ec54f7875f7e05edd56195adbeb593c947763fphitran char *device_type)
d2ec54f7875f7e05edd56195adbeb593c947763fphitran{
d2ec54f7875f7e05edd56195adbeb593c947763fphitran HalDevice *d;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char udi[HAL_PATH_MAX];
d2ec54f7875f7e05edd56195adbeb593c947763fphitran
d2ec54f7875f7e05edd56195adbeb593c947763fphitran if (strcmp(di_node_name(node), "keyboard") != 0) {
d2ec54f7875f7e05edd56195adbeb593c947763fphitran return (NULL);
d2ec54f7875f7e05edd56195adbeb593c947763fphitran }
d2ec54f7875f7e05edd56195adbeb593c947763fphitran
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems d = hal_device_new();
d2ec54f7875f7e05edd56195adbeb593c947763fphitran
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems devinfo_set_default_properties(d, parent, node, devfs_path);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_add_capability(d, "input");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_add_capability(d, "input.keyboard");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_add_capability(d, "input.keys");
d2ec54f7875f7e05edd56195adbeb593c947763fphitran hal_device_add_capability(d, "button");
d2ec54f7875f7e05edd56195adbeb593c947763fphitran
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_property_set_string(d, "info.subsystem", "input");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_property_set_string(d, "info.category", "input");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_property_set_string(d, "input.device", "/dev/kbd");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_property_set_string(d, "input.originating_device",
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_get_udi(d));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_util_compute_udi(hald_get_gdl(), udi, sizeof (udi),
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems "%s_logicaldev_input", hal_device_get_udi(d));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_set_udi(d, udi);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_property_set_string(d, "info.udi", udi);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems devinfo_add_enqueue(d, devfs_path, &devinfo_keyboard_handler);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return (d);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems}
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsstatic HalDevice *
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystemsdevinfo_mouse_add(HalDevice *parent, di_node_t node, char *devfs_path,
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char *device_type)
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems{
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems HalDevice *d;
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems char udi[HAL_PATH_MAX];
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems if (strcmp(di_node_name(node), "mouse") != 0) {
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems return (NULL);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems }
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems d = hal_device_new();
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems devinfo_set_default_properties(d, parent, node, devfs_path);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_add_capability(d, "input");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_add_capability(d, "input.mouse");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_property_set_string(d, "info.subsystem", "input");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_property_set_string(d, "info.category", "input");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_property_set_string(d, "input.device", "/dev/mouse");
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_property_set_string(d, "input.originating_device",
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_get_udi(d));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_util_compute_udi(hald_get_gdl(), udi, sizeof (udi),
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems "%s_logicaldev_input", hal_device_get_udi(d));
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_set_udi(d, udi);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems hal_device_property_set_string(d, "info.udi", udi);
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems
b453864f3587ccc3324d7a3b0438a1e542dcfde7Lin Guo - Sun Microsystems devinfo_add_enqueue(d, devfs_path, &devinfo_mouse_handler);
d2ec54f7875f7e05edd56195adbeb593c947763fphitran
d2ec54f7875f7e05edd56195adbeb593c947763fphitran return (d);
d2ec54f7875f7e05edd56195adbeb593c947763fphitran}
d2ec54f7875f7e05edd56195adbeb593c947763fphitran
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic HalDevice *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_default_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *driver_name;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *parent_path;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *d;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* ignore all children of the 'pseudo' node except lofi */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (parent != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem parent_path = hal_device_property_get_string(parent, "solaris.devfs_path");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((parent_path != NULL) &&
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (strcmp (parent_path, "/pseudo") == 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem driver_name = di_driver_name (node);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((driver_name != NULL) &&
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (strcmp (driver_name, "lofi") != 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem d = hal_device_new ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_set_default_properties (d, parent, node, devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_enqueue (d, devfs_path, &devinfo_default_handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}