1N/A/***************************************************************************
1N/A *
1N/A * devinfo_misc : misc devices
1N/A *
1N/A * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
1N/A * Use is subject to license terms.
1N/A *
1N/A * Licensed under the Academic Free License version 2.1
1N/A *
1N/A **************************************************************************/
1N/A
1N/A#ifdef HAVE_CONFIG_H
1N/A#include <config.h>
1N/A#endif
1N/A
1N/A#include <stdio.h>
1N/A#include <string.h>
1N/A#include <sys/utsname.h>
1N/A#include <libdevinfo.h>
1N/A#include <sys/uadmin.h>
1N/A
1N/A#include "../osspec.h"
1N/A#include "../logger.h"
1N/A#include "../hald.h"
1N/A#include "../hald_dbus.h"
1N/A#include "../device_info.h"
1N/A#include "../util.h"
1N/A#include "devinfo_misc.h"
1N/A
1N/Astatic HalDevice *devinfo_computer_add(HalDevice *, di_node_t, char *, char *);
1N/Astatic HalDevice *devinfo_keyboard_add(HalDevice *, di_node_t, char *, char *);
1N/Astatic HalDevice *devinfo_mouse_add(HalDevice *, di_node_t, char *, char *);
1N/Astatic HalDevice *devinfo_default_add(HalDevice *, di_node_t, char *, char *);
1N/Aconst gchar *devinfo_keyboard_get_prober(HalDevice *d, int *timeout);
1N/A
1N/ADevinfoDevHandler devinfo_computer_handler = {
1N/A devinfo_computer_add,
1N/A NULL,
1N/A NULL,
1N/A NULL,
1N/A NULL,
1N/A NULL
1N/A};
1N/A
1N/ADevinfoDevHandler devinfo_keyboard_handler = {
1N/A devinfo_keyboard_add,
1N/A NULL,
1N/A NULL,
1N/A NULL,
1N/A NULL,
1N/A devinfo_keyboard_get_prober
1N/A};
1N/A
1N/ADevinfoDevHandler devinfo_mouse_handler = {
1N/A devinfo_mouse_add,
1N/A NULL,
1N/A NULL,
1N/A NULL,
1N/A NULL,
1N/A NULL
1N/A};
1N/A
1N/ADevinfoDevHandler devinfo_default_handler = {
1N/A devinfo_default_add,
1N/A NULL,
1N/A NULL,
1N/A NULL,
1N/A NULL,
1N/A NULL
1N/A};
1N/A
1N/Astatic HalDevice *
1N/Adevinfo_computer_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
1N/A{
1N/A HalDevice *d, *local_d;
1N/A struct utsname un;
1N/A
1N/A if (strcmp (devfs_path, "/") != 0) {
1N/A return (NULL);
1N/A }
1N/A
1N/A d = hal_device_new ();
1N/A
1N/A hal_device_property_set_string (d, "info.subsystem", "unknown");
1N/A hal_device_property_set_string (d, "info.product", "Computer");
1N/A hal_device_property_set_string (d, "info.udi", "/org/freedesktop/Hal/devices/computer");
1N/A hal_device_set_udi (d, "/org/freedesktop/Hal/devices/computer");
1N/A hal_device_property_set_string (d, "solaris.devfs_path", devfs_path);
1N/A
1N/A if (uname (&un) >= 0) {
1N/A hal_device_property_set_string (d, "system.kernel.name", un.sysname);
1N/A hal_device_property_set_string (d, "system.kernel.version", un.release);
1N/A hal_device_property_set_string (d, "system.kernel.machine", un.machine);
1N/A }
1N/A
1N/A hal_device_property_set_bool(d, "power_management.can_hibernate",
1N/A (uadmin(A_FREEZE, AD_CHECK_SUSPEND_TO_DISK, 0) == 0));
1N/A hal_device_property_set_bool(d, "power_management.can_suspend",
1N/A (uadmin(A_FREEZE, AD_CHECK_SUSPEND_TO_RAM, 0) == 0));
1N/A
1N/A hal_device_add_capability(d, "button");
1N/A
1N/A /*
1N/A * Let computer be in TDL while synthesizing all other events
1N/A * because some may write to the object
1N/A */
1N/A hal_device_store_add (hald_get_tdl (), d);
1N/A
1N/A devinfo_add_enqueue (d, devfs_path, &devinfo_computer_handler);
1N/A
1N/A /* all devinfo devices belong to the 'local' branch */
1N/A local_d = hal_device_new ();
1N/A
1N/A hal_device_property_set_string (local_d, "info.parent", hal_device_get_udi (d));
1N/A hal_device_property_set_string (local_d, "info.subsystem", "unknown");
1N/A hal_device_property_set_string (local_d, "info.product", "Local devices");
1N/A hal_device_property_set_string (local_d, "info.udi", "/org/freedesktop/Hal/devices/local");
1N/A hal_device_set_udi (local_d, "/org/freedesktop/Hal/devices/local");
1N/A hal_device_property_set_string (local_d, "solaris.devfs_path", "/local");
1N/A
1N/A devinfo_add_enqueue (local_d, "/local", &devinfo_default_handler);
1N/A
1N/A return (local_d);
1N/A}
1N/A
1N/Astatic HalDevice *
1N/Adevinfo_keyboard_add(HalDevice *parent, di_node_t node, char *devfs_path,
1N/A char *device_type)
1N/A{
1N/A HalDevice *d;
1N/A char udi[HAL_PATH_MAX];
1N/A
1N/A if (strcmp(di_node_name(node), "keyboard") != 0) {
1N/A return (NULL);
1N/A }
1N/A
1N/A d = hal_device_new();
1N/A
1N/A devinfo_set_default_properties(d, parent, node, devfs_path);
1N/A
1N/A hal_device_add_capability(d, "input");
1N/A hal_device_add_capability(d, "input.keyboard");
1N/A hal_device_add_capability(d, "input.keys");
1N/A hal_device_add_capability(d, "button");
1N/A
1N/A hal_device_property_set_string(d, "info.subsystem", "input");
1N/A hal_device_property_set_string(d, "info.category", "input");
1N/A hal_device_property_set_string(d, "input.device", "/dev/kbd");
1N/A hal_device_property_set_string(d, "input.originating_device",
1N/A hal_device_get_udi(d));
1N/A
1N/A hal_util_compute_udi(hald_get_gdl(), udi, sizeof (udi),
1N/A "%s_logicaldev_input", hal_device_get_udi(d));
1N/A
1N/A hal_device_set_udi(d, udi);
1N/A hal_device_property_set_string(d, "info.udi", udi);
1N/A
1N/A devinfo_add_enqueue(d, devfs_path, &devinfo_keyboard_handler);
1N/A
1N/A return (d);
1N/A}
1N/A
1N/Astatic HalDevice *
1N/Adevinfo_mouse_add(HalDevice *parent, di_node_t node, char *devfs_path,
1N/A char *device_type)
1N/A{
1N/A HalDevice *d;
1N/A char udi[HAL_PATH_MAX];
1N/A
1N/A if (strcmp(di_node_name(node), "mouse") != 0) {
1N/A return (NULL);
1N/A }
1N/A
1N/A d = hal_device_new();
1N/A
1N/A devinfo_set_default_properties(d, parent, node, devfs_path);
1N/A
1N/A hal_device_add_capability(d, "input");
1N/A hal_device_add_capability(d, "input.mouse");
1N/A
1N/A hal_device_property_set_string(d, "info.subsystem", "input");
1N/A hal_device_property_set_string(d, "info.category", "input");
1N/A hal_device_property_set_string(d, "input.device", "/dev/mouse");
1N/A hal_device_property_set_string(d, "input.originating_device",
1N/A hal_device_get_udi(d));
1N/A
1N/A hal_util_compute_udi(hald_get_gdl(), udi, sizeof (udi),
1N/A "%s_logicaldev_input", hal_device_get_udi(d));
1N/A
1N/A hal_device_set_udi(d, udi);
1N/A hal_device_property_set_string(d, "info.udi", udi);
1N/A
1N/A devinfo_add_enqueue(d, devfs_path, &devinfo_mouse_handler);
1N/A
1N/A return (d);
1N/A}
1N/A
1N/Astatic HalDevice *
1N/Adevinfo_default_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
1N/A{
1N/A char *driver_name;
1N/A const char *parent_path;
1N/A HalDevice *d;
1N/A
1N/A /* ignore all children of the 'pseudo' node except lofi */
1N/A if (parent != NULL) {
1N/A parent_path = hal_device_property_get_string(parent, "solaris.devfs_path");
1N/A if ((parent_path != NULL) &&
1N/A (strcmp (parent_path, "/pseudo") == 0)) {
1N/A driver_name = di_driver_name (node);
1N/A if ((driver_name != NULL) &&
1N/A (strcmp (driver_name, "lofi") != 0)) {
1N/A return (NULL);
1N/A }
1N/A }
1N/A }
1N/A
1N/A d = hal_device_new ();
1N/A
1N/A devinfo_set_default_properties (d, parent, node, devfs_path);
1N/A
1N/A devinfo_add_enqueue (d, devfs_path, &devinfo_default_handler);
1N/A
1N/A return (d);
1N/A}