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