1/***************************************************************************
2 *
3 * devinfo_misc : misc devices
4 *
5 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
6 * Use is subject to license terms.
7 *
8 * Licensed under the Academic Free License version 2.1
9 *
10 **************************************************************************/
11
12#ifdef HAVE_CONFIG_H
13#include <config.h>
14#endif
15
16#include <stdio.h>
17#include <string.h>
18#include <sys/utsname.h>
19#include <libdevinfo.h>
20#include <sys/uadmin.h>
21
22#include "../osspec.h"
23#include "../logger.h"
24#include "../hald.h"
25#include "../hald_dbus.h"
26#include "../device_info.h"
27#include "../util.h"
28#include "devinfo_misc.h"
29
30static HalDevice *devinfo_computer_add(HalDevice *, di_node_t, char *, char *);
31static HalDevice *devinfo_keyboard_add(HalDevice *, di_node_t, char *, char *);
32static HalDevice *devinfo_mouse_add(HalDevice *, di_node_t, char *, char *);
33static HalDevice *devinfo_default_add(HalDevice *, di_node_t, char *, char *);
34const gchar *devinfo_keyboard_get_prober(HalDevice *d, int *timeout);
35
36DevinfoDevHandler devinfo_computer_handler = {
37	devinfo_computer_add,
38	NULL,
39	NULL,
40	NULL,
41	NULL,
42	NULL
43};
44
45DevinfoDevHandler devinfo_keyboard_handler = {
46	devinfo_keyboard_add,
47	NULL,
48	NULL,
49	NULL,
50	NULL,
51	devinfo_keyboard_get_prober
52};
53
54DevinfoDevHandler devinfo_mouse_handler = {
55	devinfo_mouse_add,
56	NULL,
57	NULL,
58	NULL,
59	NULL,
60	NULL
61};
62
63DevinfoDevHandler devinfo_default_handler = {
64	devinfo_default_add,
65	NULL,
66	NULL,
67	NULL,
68	NULL,
69	NULL
70};
71
72static HalDevice *
73devinfo_computer_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
74{
75	HalDevice *d, *local_d;
76	struct utsname un;
77
78	if (strcmp (devfs_path, "/") != 0) {
79		return (NULL);
80	}
81
82	d = hal_device_new ();
83
84	hal_device_property_set_string (d, "info.subsystem", "unknown");
85	hal_device_property_set_string (d, "info.product", "Computer");
86	hal_device_property_set_string (d, "info.udi", "/org/freedesktop/Hal/devices/computer");
87	hal_device_set_udi (d, "/org/freedesktop/Hal/devices/computer");
88	hal_device_property_set_string (d, "solaris.devfs_path", devfs_path);
89
90	if (uname (&un) >= 0) {
91		hal_device_property_set_string (d, "system.kernel.name", un.sysname);
92		hal_device_property_set_string (d, "system.kernel.version", un.release);
93		hal_device_property_set_string (d, "system.kernel.machine", un.machine);
94	}
95
96	hal_device_property_set_bool(d, "power_management.can_hibernate",
97	    (uadmin(A_FREEZE, AD_CHECK_SUSPEND_TO_DISK, 0) == 0));
98	hal_device_property_set_bool(d, "power_management.can_suspend",
99	    (uadmin(A_FREEZE, AD_CHECK_SUSPEND_TO_RAM, 0) == 0));
100
101	hal_device_add_capability(d, "button");
102
103	/*
104	 * Let computer be in TDL while synthesizing all other events
105	 * because some may write to the object
106	 */
107	hal_device_store_add (hald_get_tdl (), d);
108
109	devinfo_add_enqueue (d, devfs_path, &devinfo_computer_handler);
110
111	/* all devinfo devices belong to the 'local' branch */
112	local_d = hal_device_new ();
113
114	hal_device_property_set_string (local_d, "info.parent", hal_device_get_udi (d));
115	hal_device_property_set_string (local_d, "info.subsystem", "unknown");
116	hal_device_property_set_string (local_d, "info.product", "Local devices");
117	hal_device_property_set_string (local_d, "info.udi", "/org/freedesktop/Hal/devices/local");
118	hal_device_set_udi (local_d, "/org/freedesktop/Hal/devices/local");
119	hal_device_property_set_string (local_d, "solaris.devfs_path", "/local");
120
121	devinfo_add_enqueue (local_d, "/local", &devinfo_default_handler);
122
123	return (local_d);
124}
125
126static HalDevice *
127devinfo_keyboard_add(HalDevice *parent, di_node_t node, char *devfs_path,
128    char *device_type)
129{
130	HalDevice *d;
131	char	udi[HAL_PATH_MAX];
132
133	if (strcmp(di_node_name(node), "keyboard") != 0) {
134		return (NULL);
135	}
136
137	d = hal_device_new();
138
139	devinfo_set_default_properties(d, parent, node, devfs_path);
140
141	hal_device_add_capability(d, "input");
142	hal_device_add_capability(d, "input.keyboard");
143	hal_device_add_capability(d, "input.keys");
144	hal_device_add_capability(d, "button");
145
146	hal_device_property_set_string(d, "info.subsystem", "input");
147	hal_device_property_set_string(d, "info.category", "input");
148	hal_device_property_set_string(d, "input.device", "/dev/kbd");
149	hal_device_property_set_string(d, "input.originating_device",
150	    hal_device_get_udi(d));
151
152	hal_util_compute_udi(hald_get_gdl(), udi, sizeof (udi),
153	    "%s_logicaldev_input", hal_device_get_udi(d));
154
155	hal_device_set_udi(d, udi);
156	hal_device_property_set_string(d, "info.udi", udi);
157
158	devinfo_add_enqueue(d, devfs_path, &devinfo_keyboard_handler);
159
160	return (d);
161}
162
163static HalDevice *
164devinfo_mouse_add(HalDevice *parent, di_node_t node, char *devfs_path,
165    char *device_type)
166{
167	HalDevice *d;
168	char	udi[HAL_PATH_MAX];
169
170	if (strcmp(di_node_name(node), "mouse") != 0) {
171		return (NULL);
172	}
173
174	d = hal_device_new();
175
176	devinfo_set_default_properties(d, parent, node, devfs_path);
177
178	hal_device_add_capability(d, "input");
179	hal_device_add_capability(d, "input.mouse");
180
181	hal_device_property_set_string(d, "info.subsystem", "input");
182	hal_device_property_set_string(d, "info.category", "input");
183	hal_device_property_set_string(d, "input.device", "/dev/mouse");
184	hal_device_property_set_string(d, "input.originating_device",
185	    hal_device_get_udi(d));
186
187	hal_util_compute_udi(hald_get_gdl(), udi, sizeof (udi),
188	    "%s_logicaldev_input", hal_device_get_udi(d));
189
190	hal_device_set_udi(d, udi);
191	hal_device_property_set_string(d, "info.udi", udi);
192
193	devinfo_add_enqueue(d, devfs_path, &devinfo_mouse_handler);
194
195	return (d);
196}
197
198static HalDevice *
199devinfo_default_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
200{
201	char *driver_name;
202	const char *parent_path;
203	HalDevice *d;
204
205	/* ignore all children of the 'pseudo' node except lofi */
206	if (parent != NULL) {
207		parent_path = hal_device_property_get_string(parent, "solaris.devfs_path");
208		if ((parent_path != NULL) &&
209		    (strcmp (parent_path, "/pseudo") == 0)) {
210			driver_name = di_driver_name (node);
211			if ((driver_name != NULL) &&
212			    (strcmp (driver_name, "lofi") != 0)) {
213				return (NULL);
214			}
215		}
216	}
217
218	d = hal_device_new ();
219
220	devinfo_set_default_properties (d, parent, node, devfs_path);
221
222	devinfo_add_enqueue (d, devfs_path, &devinfo_default_handler);
223
224	return (d);
225}
226