1*2912Sartem /***************************************************************************
2*2912Sartem  *
3*2912Sartem  * devinfo_misc : misc devices
4*2912Sartem  *
5*2912Sartem  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
6*2912Sartem  * Use is subject to license terms.
7*2912Sartem  *
8*2912Sartem  * Licensed under the Academic Free License version 2.1
9*2912Sartem  *
10*2912Sartem  **************************************************************************/
11*2912Sartem 
12*2912Sartem #pragma	ident	"%Z%%M%	%I%	%E% SMI"
13*2912Sartem 
14*2912Sartem #include <stdio.h>
15*2912Sartem #include <string.h>
16*2912Sartem #include <sys/utsname.h>
17*2912Sartem #include <libdevinfo.h>
18*2912Sartem 
19*2912Sartem #include "../osspec.h"
20*2912Sartem #include "../logger.h"
21*2912Sartem #include "../hald.h"
22*2912Sartem #include "../hald_dbus.h"
23*2912Sartem #include "../device_info.h"
24*2912Sartem #include "../util.h"
25*2912Sartem #include "devinfo_misc.h"
26*2912Sartem 
27*2912Sartem static HalDevice *devinfo_computer_add(HalDevice *, di_node_t, char *, char *);
28*2912Sartem static HalDevice *devinfo_cpu_add(HalDevice *, di_node_t, char *,char *);
29*2912Sartem static HalDevice *devinfo_default_add(HalDevice *, di_node_t, char *, char *);
30*2912Sartem 
31*2912Sartem DevinfoDevHandler devinfo_computer_handler = {
32*2912Sartem         devinfo_computer_add,
33*2912Sartem 	NULL,
34*2912Sartem 	NULL,
35*2912Sartem 	NULL,
36*2912Sartem 	NULL,
37*2912Sartem         NULL
38*2912Sartem };
39*2912Sartem DevinfoDevHandler devinfo_cpu_handler = {
40*2912Sartem         devinfo_cpu_add,
41*2912Sartem 	NULL,
42*2912Sartem 	NULL,
43*2912Sartem 	NULL,
44*2912Sartem 	NULL,
45*2912Sartem         NULL
46*2912Sartem };
47*2912Sartem DevinfoDevHandler devinfo_default_handler = {
48*2912Sartem         devinfo_default_add,
49*2912Sartem 	NULL,
50*2912Sartem 	NULL,
51*2912Sartem 	NULL,
52*2912Sartem 	NULL,
53*2912Sartem         NULL
54*2912Sartem };
55*2912Sartem 
56*2912Sartem static HalDevice *
57*2912Sartem devinfo_computer_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
58*2912Sartem {
59*2912Sartem 	HalDevice *d, *local_d;
60*2912Sartem 	struct utsname un;
61*2912Sartem 
62*2912Sartem 	if (strcmp (devfs_path, "/") != 0) {
63*2912Sartem 		return (NULL);
64*2912Sartem 	}
65*2912Sartem 
66*2912Sartem 	d = hal_device_new ();
67*2912Sartem 
68*2912Sartem         hal_device_property_set_string (d, "info.bus", "unknown");
69*2912Sartem         hal_device_property_set_string (d, "info.product", "Computer");
70*2912Sartem         hal_device_property_set_string (d, "info.udi", "/org/freedesktop/Hal/devices/computer");
71*2912Sartem         hal_device_set_udi (d, "/org/freedesktop/Hal/devices/computer");
72*2912Sartem 	hal_device_property_set_string (d, "solaris.devfs_path", devfs_path);
73*2912Sartem 
74*2912Sartem 	if (uname (&un) >= 0) {
75*2912Sartem 		hal_device_property_set_string (d, "system.kernel.name", un.sysname);
76*2912Sartem 		hal_device_property_set_string (d, "system.kernel.version", un.release);
77*2912Sartem 		hal_device_property_set_string (d, "system.kernel.machine", un.machine);
78*2912Sartem 	}
79*2912Sartem 
80*2912Sartem 	devinfo_add_enqueue (d, devfs_path, &devinfo_computer_handler);
81*2912Sartem 
82*2912Sartem 	/* all devinfo devices belong to the 'local' branch */
83*2912Sartem 	local_d = hal_device_new ();
84*2912Sartem 
85*2912Sartem 	hal_device_property_set_string (local_d, "info.parent", d->udi);
86*2912Sartem         hal_device_property_set_string (local_d, "info.bus", "unknown");
87*2912Sartem         hal_device_property_set_string (local_d, "info.product", "Local devices");
88*2912Sartem         hal_device_property_set_string (local_d, "info.udi", "/org/freedesktop/Hal/devices/local");
89*2912Sartem         hal_device_set_udi (local_d, "/org/freedesktop/Hal/devices/local");
90*2912Sartem 	hal_device_property_set_string (local_d, "solaris.devfs_path", "/local");
91*2912Sartem 
92*2912Sartem 	devinfo_add_enqueue (local_d, "/local", &devinfo_default_handler);
93*2912Sartem 
94*2912Sartem 	return (local_d);
95*2912Sartem }
96*2912Sartem 
97*2912Sartem static HalDevice *
98*2912Sartem devinfo_cpu_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
99*2912Sartem {
100*2912Sartem 	HalDevice *d;
101*2912Sartem 
102*2912Sartem 	if ((device_type == NULL) || (strcmp(device_type, "cpu") != 0)) {
103*2912Sartem 		return (NULL);
104*2912Sartem 	}
105*2912Sartem 
106*2912Sartem 	d = hal_device_new ();
107*2912Sartem 
108*2912Sartem 	devinfo_set_default_properties (d, parent, node, devfs_path);
109*2912Sartem 	hal_device_add_capability (d, "processor");
110*2912Sartem 
111*2912Sartem 	devinfo_add_enqueue (d, devfs_path, &devinfo_cpu_handler);
112*2912Sartem 
113*2912Sartem 	return (d);
114*2912Sartem }
115*2912Sartem 
116*2912Sartem static HalDevice *
117*2912Sartem devinfo_default_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
118*2912Sartem {
119*2912Sartem 	char *driver_name;
120*2912Sartem 	const char *parent_path;
121*2912Sartem 	HalDevice *d;
122*2912Sartem 
123*2912Sartem 	/* ignore all children of the 'pseudo' node except lofi */
124*2912Sartem 	if (parent != NULL) {
125*2912Sartem 		parent_path = hal_device_property_get_string(parent, "solaris.devfs_path");
126*2912Sartem 		if ((parent_path != NULL) &&
127*2912Sartem 		    (strcmp (parent_path, "/pseudo") == 0)) {
128*2912Sartem 			driver_name = di_driver_name (node);
129*2912Sartem 			if ((driver_name != NULL) &&
130*2912Sartem 			    (strcmp (driver_name, "lofi") != 0)) {
131*2912Sartem 				return (NULL);
132*2912Sartem 			}
133*2912Sartem 		}
134*2912Sartem 	}
135*2912Sartem 
136*2912Sartem 	d = hal_device_new ();
137*2912Sartem 
138*2912Sartem 	devinfo_set_default_properties (d, parent, node, devfs_path);
139*2912Sartem 
140*2912Sartem 	devinfo_add_enqueue (d, devfs_path, &devinfo_default_handler);
141*2912Sartem 
142*2912Sartem 	return (d);
143*2912Sartem }
144