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