118c2aff7Sartem /***************************************************************************
218c2aff7Sartem  *
318c2aff7Sartem  * devinfo_misc : misc devices
418c2aff7Sartem  *
5*b453864fSLin Guo - Sun Microsystems  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
618c2aff7Sartem  * Use is subject to license terms.
718c2aff7Sartem  *
818c2aff7Sartem  * Licensed under the Academic Free License version 2.1
918c2aff7Sartem  *
1018c2aff7Sartem  **************************************************************************/
1118c2aff7Sartem 
1200687e57Sartem #ifdef HAVE_CONFIG_H
13a9da3307Snp #include <config.h>
1400687e57Sartem #endif
1500687e57Sartem 
1618c2aff7Sartem #include <stdio.h>
1718c2aff7Sartem #include <string.h>
1818c2aff7Sartem #include <sys/utsname.h>
1918c2aff7Sartem #include <libdevinfo.h>
20d2ec54f7Sphitran #include <sys/uadmin.h>
2118c2aff7Sartem 
2218c2aff7Sartem #include "../osspec.h"
2318c2aff7Sartem #include "../logger.h"
2418c2aff7Sartem #include "../hald.h"
2518c2aff7Sartem #include "../hald_dbus.h"
2618c2aff7Sartem #include "../device_info.h"
2718c2aff7Sartem #include "../util.h"
2818c2aff7Sartem #include "devinfo_misc.h"
2918c2aff7Sartem 
3018c2aff7Sartem static HalDevice *devinfo_computer_add(HalDevice *, di_node_t, char *, char *);
31d2ec54f7Sphitran static HalDevice *devinfo_keyboard_add(HalDevice *, di_node_t, char *, char *);
32*b453864fSLin Guo - Sun Microsystems static HalDevice *devinfo_mouse_add(HalDevice *, di_node_t, char *, char *);
3318c2aff7Sartem static HalDevice *devinfo_default_add(HalDevice *, di_node_t, char *, char *);
34*b453864fSLin Guo - Sun Microsystems const gchar *devinfo_keyboard_get_prober(HalDevice *d, int *timeout);
3518c2aff7Sartem 
3618c2aff7Sartem DevinfoDevHandler devinfo_computer_handler = {
37d2ec54f7Sphitran 	devinfo_computer_add,
3818c2aff7Sartem 	NULL,
3918c2aff7Sartem 	NULL,
4018c2aff7Sartem 	NULL,
4118c2aff7Sartem 	NULL,
42d2ec54f7Sphitran 	NULL
4318c2aff7Sartem };
44a9da3307Snp 
45d2ec54f7Sphitran DevinfoDevHandler devinfo_keyboard_handler = {
46d2ec54f7Sphitran 	devinfo_keyboard_add,
47d2ec54f7Sphitran 	NULL,
48d2ec54f7Sphitran 	NULL,
49d2ec54f7Sphitran 	NULL,
50d2ec54f7Sphitran 	NULL,
51*b453864fSLin Guo - Sun Microsystems 	devinfo_keyboard_get_prober
52*b453864fSLin Guo - Sun Microsystems };
53*b453864fSLin Guo - Sun Microsystems 
54*b453864fSLin Guo - Sun Microsystems DevinfoDevHandler devinfo_mouse_handler = {
55*b453864fSLin Guo - Sun Microsystems 	devinfo_mouse_add,
56*b453864fSLin Guo - Sun Microsystems 	NULL,
57*b453864fSLin Guo - Sun Microsystems 	NULL,
58*b453864fSLin Guo - Sun Microsystems 	NULL,
59*b453864fSLin Guo - Sun Microsystems 	NULL,
60d2ec54f7Sphitran 	NULL
6118c2aff7Sartem };
62a9da3307Snp 
6318c2aff7Sartem DevinfoDevHandler devinfo_default_handler = {
64d2ec54f7Sphitran 	devinfo_default_add,
6518c2aff7Sartem 	NULL,
6618c2aff7Sartem 	NULL,
6718c2aff7Sartem 	NULL,
6818c2aff7Sartem 	NULL,
69d2ec54f7Sphitran 	NULL
7018c2aff7Sartem };
7118c2aff7Sartem 
7218c2aff7Sartem static HalDevice *
devinfo_computer_add(HalDevice * parent,di_node_t node,char * devfs_path,char * device_type)7318c2aff7Sartem devinfo_computer_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
7418c2aff7Sartem {
7518c2aff7Sartem 	HalDevice *d, *local_d;
7618c2aff7Sartem 	struct utsname un;
7718c2aff7Sartem 
7818c2aff7Sartem 	if (strcmp (devfs_path, "/") != 0) {
7918c2aff7Sartem 		return (NULL);
8018c2aff7Sartem 	}
8118c2aff7Sartem 
8218c2aff7Sartem 	d = hal_device_new ();
8318c2aff7Sartem 
84d2ec54f7Sphitran 	hal_device_property_set_string (d, "info.subsystem", "unknown");
85d2ec54f7Sphitran 	hal_device_property_set_string (d, "info.product", "Computer");
86d2ec54f7Sphitran 	hal_device_property_set_string (d, "info.udi", "/org/freedesktop/Hal/devices/computer");
87d2ec54f7Sphitran 	hal_device_set_udi (d, "/org/freedesktop/Hal/devices/computer");
8818c2aff7Sartem 	hal_device_property_set_string (d, "solaris.devfs_path", devfs_path);
8918c2aff7Sartem 
9018c2aff7Sartem 	if (uname (&un) >= 0) {
9118c2aff7Sartem 		hal_device_property_set_string (d, "system.kernel.name", un.sysname);
9218c2aff7Sartem 		hal_device_property_set_string (d, "system.kernel.version", un.release);
9318c2aff7Sartem 		hal_device_property_set_string (d, "system.kernel.machine", un.machine);
9418c2aff7Sartem 	}
9518c2aff7Sartem 
96d2ec54f7Sphitran 	hal_device_property_set_bool(d, "power_management.can_hibernate",
97d2ec54f7Sphitran 	    (uadmin(A_FREEZE, AD_CHECK_SUSPEND_TO_DISK, 0) == 0));
98d2ec54f7Sphitran 	hal_device_property_set_bool(d, "power_management.can_suspend",
99d2ec54f7Sphitran 	    (uadmin(A_FREEZE, AD_CHECK_SUSPEND_TO_RAM, 0) == 0));
100d2ec54f7Sphitran 
101d2ec54f7Sphitran 	hal_device_add_capability(d, "button");
102d2ec54f7Sphitran 
1037b840e52Sphitran 	/*
1047b840e52Sphitran 	 * Let computer be in TDL while synthesizing all other events
1057b840e52Sphitran 	 * because some may write to the object
1067b840e52Sphitran 	 */
107d2ec54f7Sphitran 	hal_device_store_add (hald_get_tdl (), d);
1087b840e52Sphitran 
10918c2aff7Sartem 	devinfo_add_enqueue (d, devfs_path, &devinfo_computer_handler);
11018c2aff7Sartem 
11118c2aff7Sartem 	/* all devinfo devices belong to the 'local' branch */
11218c2aff7Sartem 	local_d = hal_device_new ();
11318c2aff7Sartem 
11400687e57Sartem 	hal_device_property_set_string (local_d, "info.parent", hal_device_get_udi (d));
115d2ec54f7Sphitran 	hal_device_property_set_string (local_d, "info.subsystem", "unknown");
116d2ec54f7Sphitran 	hal_device_property_set_string (local_d, "info.product", "Local devices");
117d2ec54f7Sphitran 	hal_device_property_set_string (local_d, "info.udi", "/org/freedesktop/Hal/devices/local");
118d2ec54f7Sphitran 	hal_device_set_udi (local_d, "/org/freedesktop/Hal/devices/local");
11918c2aff7Sartem 	hal_device_property_set_string (local_d, "solaris.devfs_path", "/local");
12018c2aff7Sartem 
12118c2aff7Sartem 	devinfo_add_enqueue (local_d, "/local", &devinfo_default_handler);
12218c2aff7Sartem 
12318c2aff7Sartem 	return (local_d);
12418c2aff7Sartem }
12518c2aff7Sartem 
126d2ec54f7Sphitran static HalDevice *
devinfo_keyboard_add(HalDevice * parent,di_node_t node,char * devfs_path,char * device_type)127d2ec54f7Sphitran devinfo_keyboard_add(HalDevice *parent, di_node_t node, char *devfs_path,
128d2ec54f7Sphitran     char *device_type)
129d2ec54f7Sphitran {
130d2ec54f7Sphitran 	HalDevice *d;
131*b453864fSLin Guo - Sun Microsystems 	char	udi[HAL_PATH_MAX];
132d2ec54f7Sphitran 
133d2ec54f7Sphitran 	if (strcmp(di_node_name(node), "keyboard") != 0) {
134d2ec54f7Sphitran 		return (NULL);
135d2ec54f7Sphitran 	}
136d2ec54f7Sphitran 
137*b453864fSLin Guo - Sun Microsystems 	d = hal_device_new();
138d2ec54f7Sphitran 
139*b453864fSLin Guo - Sun Microsystems 	devinfo_set_default_properties(d, parent, node, devfs_path);
140*b453864fSLin Guo - Sun Microsystems 
141*b453864fSLin Guo - Sun Microsystems 	hal_device_add_capability(d, "input");
142*b453864fSLin Guo - Sun Microsystems 	hal_device_add_capability(d, "input.keyboard");
143*b453864fSLin Guo - Sun Microsystems 	hal_device_add_capability(d, "input.keys");
144d2ec54f7Sphitran 	hal_device_add_capability(d, "button");
145d2ec54f7Sphitran 
146*b453864fSLin Guo - Sun Microsystems 	hal_device_property_set_string(d, "info.subsystem", "input");
147*b453864fSLin Guo - Sun Microsystems 	hal_device_property_set_string(d, "info.category", "input");
148*b453864fSLin Guo - Sun Microsystems 	hal_device_property_set_string(d, "input.device", "/dev/kbd");
149*b453864fSLin Guo - Sun Microsystems 	hal_device_property_set_string(d, "input.originating_device",
150*b453864fSLin Guo - Sun Microsystems 	    hal_device_get_udi(d));
151*b453864fSLin Guo - Sun Microsystems 
152*b453864fSLin Guo - Sun Microsystems 	hal_util_compute_udi(hald_get_gdl(), udi, sizeof (udi),
153*b453864fSLin Guo - Sun Microsystems 	    "%s_logicaldev_input", hal_device_get_udi(d));
154*b453864fSLin Guo - Sun Microsystems 
155*b453864fSLin Guo - Sun Microsystems 	hal_device_set_udi(d, udi);
156*b453864fSLin Guo - Sun Microsystems 	hal_device_property_set_string(d, "info.udi", udi);
157*b453864fSLin Guo - Sun Microsystems 
158*b453864fSLin Guo - Sun Microsystems 	devinfo_add_enqueue(d, devfs_path, &devinfo_keyboard_handler);
159*b453864fSLin Guo - Sun Microsystems 
160*b453864fSLin Guo - Sun Microsystems 	return (d);
161*b453864fSLin Guo - Sun Microsystems }
162*b453864fSLin Guo - Sun Microsystems 
163*b453864fSLin Guo - Sun Microsystems static HalDevice *
devinfo_mouse_add(HalDevice * parent,di_node_t node,char * devfs_path,char * device_type)164*b453864fSLin Guo - Sun Microsystems devinfo_mouse_add(HalDevice *parent, di_node_t node, char *devfs_path,
165*b453864fSLin Guo - Sun Microsystems     char *device_type)
166*b453864fSLin Guo - Sun Microsystems {
167*b453864fSLin Guo - Sun Microsystems 	HalDevice *d;
168*b453864fSLin Guo - Sun Microsystems 	char	udi[HAL_PATH_MAX];
169*b453864fSLin Guo - Sun Microsystems 
170*b453864fSLin Guo - Sun Microsystems 	if (strcmp(di_node_name(node), "mouse") != 0) {
171*b453864fSLin Guo - Sun Microsystems 		return (NULL);
172*b453864fSLin Guo - Sun Microsystems 	}
173*b453864fSLin Guo - Sun Microsystems 
174*b453864fSLin Guo - Sun Microsystems 	d = hal_device_new();
175*b453864fSLin Guo - Sun Microsystems 
176*b453864fSLin Guo - Sun Microsystems 	devinfo_set_default_properties(d, parent, node, devfs_path);
177*b453864fSLin Guo - Sun Microsystems 
178*b453864fSLin Guo - Sun Microsystems 	hal_device_add_capability(d, "input");
179*b453864fSLin Guo - Sun Microsystems 	hal_device_add_capability(d, "input.mouse");
180*b453864fSLin Guo - Sun Microsystems 
181*b453864fSLin Guo - Sun Microsystems 	hal_device_property_set_string(d, "info.subsystem", "input");
182*b453864fSLin Guo - Sun Microsystems 	hal_device_property_set_string(d, "info.category", "input");
183*b453864fSLin Guo - Sun Microsystems 	hal_device_property_set_string(d, "input.device", "/dev/mouse");
184*b453864fSLin Guo - Sun Microsystems 	hal_device_property_set_string(d, "input.originating_device",
185*b453864fSLin Guo - Sun Microsystems 	    hal_device_get_udi(d));
186*b453864fSLin Guo - Sun Microsystems 
187*b453864fSLin Guo - Sun Microsystems 	hal_util_compute_udi(hald_get_gdl(), udi, sizeof (udi),
188*b453864fSLin Guo - Sun Microsystems 	    "%s_logicaldev_input", hal_device_get_udi(d));
189*b453864fSLin Guo - Sun Microsystems 
190*b453864fSLin Guo - Sun Microsystems 	hal_device_set_udi(d, udi);
191*b453864fSLin Guo - Sun Microsystems 	hal_device_property_set_string(d, "info.udi", udi);
192*b453864fSLin Guo - Sun Microsystems 
193*b453864fSLin Guo - Sun Microsystems 	devinfo_add_enqueue(d, devfs_path, &devinfo_mouse_handler);
194d2ec54f7Sphitran 
195d2ec54f7Sphitran 	return (d);
196d2ec54f7Sphitran }
197d2ec54f7Sphitran 
19818c2aff7Sartem static HalDevice *
devinfo_default_add(HalDevice * parent,di_node_t node,char * devfs_path,char * device_type)19918c2aff7Sartem devinfo_default_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
20018c2aff7Sartem {
20118c2aff7Sartem 	char *driver_name;
20218c2aff7Sartem 	const char *parent_path;
20318c2aff7Sartem 	HalDevice *d;
20418c2aff7Sartem 
20518c2aff7Sartem 	/* ignore all children of the 'pseudo' node except lofi */
20618c2aff7Sartem 	if (parent != NULL) {
20718c2aff7Sartem 		parent_path = hal_device_property_get_string(parent, "solaris.devfs_path");
20818c2aff7Sartem 		if ((parent_path != NULL) &&
20918c2aff7Sartem 		    (strcmp (parent_path, "/pseudo") == 0)) {
21018c2aff7Sartem 			driver_name = di_driver_name (node);
21118c2aff7Sartem 			if ((driver_name != NULL) &&
21218c2aff7Sartem 			    (strcmp (driver_name, "lofi") != 0)) {
21318c2aff7Sartem 				return (NULL);
21418c2aff7Sartem 			}
21518c2aff7Sartem 		}
21618c2aff7Sartem 	}
21718c2aff7Sartem 
21818c2aff7Sartem 	d = hal_device_new ();
21918c2aff7Sartem 
22018c2aff7Sartem 	devinfo_set_default_properties (d, parent, node, devfs_path);
22118c2aff7Sartem 
22218c2aff7Sartem 	devinfo_add_enqueue (d, devfs_path, &devinfo_default_handler);
22318c2aff7Sartem 
22418c2aff7Sartem 	return (d);
22518c2aff7Sartem }
226