12912Sartem /*************************************************************************** 22912Sartem * 32912Sartem * devinfo_misc : misc devices 42912Sartem * 52912Sartem * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 62912Sartem * Use is subject to license terms. 72912Sartem * 82912Sartem * Licensed under the Academic Free License version 2.1 92912Sartem * 102912Sartem **************************************************************************/ 112912Sartem 12*2916Sartem #pragma ident "%Z%%M% %I% %E% SMI" 132912Sartem 142912Sartem #include <stdio.h> 152912Sartem #include <string.h> 162912Sartem #include <sys/utsname.h> 172912Sartem #include <libdevinfo.h> 182912Sartem 192912Sartem #include "../osspec.h" 202912Sartem #include "../logger.h" 212912Sartem #include "../hald.h" 222912Sartem #include "../hald_dbus.h" 232912Sartem #include "../device_info.h" 242912Sartem #include "../util.h" 252912Sartem #include "devinfo_misc.h" 262912Sartem 272912Sartem static HalDevice *devinfo_computer_add(HalDevice *, di_node_t, char *, char *); 282912Sartem static HalDevice *devinfo_cpu_add(HalDevice *, di_node_t, char *,char *); 292912Sartem static HalDevice *devinfo_default_add(HalDevice *, di_node_t, char *, char *); 302912Sartem 312912Sartem DevinfoDevHandler devinfo_computer_handler = { 322912Sartem devinfo_computer_add, 332912Sartem NULL, 342912Sartem NULL, 352912Sartem NULL, 362912Sartem NULL, 372912Sartem NULL 382912Sartem }; 392912Sartem DevinfoDevHandler devinfo_cpu_handler = { 402912Sartem devinfo_cpu_add, 412912Sartem NULL, 422912Sartem NULL, 432912Sartem NULL, 442912Sartem NULL, 452912Sartem NULL 462912Sartem }; 472912Sartem DevinfoDevHandler devinfo_default_handler = { 482912Sartem devinfo_default_add, 492912Sartem NULL, 502912Sartem NULL, 512912Sartem NULL, 522912Sartem NULL, 532912Sartem NULL 542912Sartem }; 552912Sartem 562912Sartem static HalDevice * 572912Sartem devinfo_computer_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type) 582912Sartem { 592912Sartem HalDevice *d, *local_d; 602912Sartem struct utsname un; 612912Sartem 622912Sartem if (strcmp (devfs_path, "/") != 0) { 632912Sartem return (NULL); 642912Sartem } 652912Sartem 662912Sartem d = hal_device_new (); 672912Sartem 682912Sartem hal_device_property_set_string (d, "info.bus", "unknown"); 692912Sartem hal_device_property_set_string (d, "info.product", "Computer"); 702912Sartem hal_device_property_set_string (d, "info.udi", "/org/freedesktop/Hal/devices/computer"); 712912Sartem hal_device_set_udi (d, "/org/freedesktop/Hal/devices/computer"); 722912Sartem hal_device_property_set_string (d, "solaris.devfs_path", devfs_path); 732912Sartem 742912Sartem if (uname (&un) >= 0) { 752912Sartem hal_device_property_set_string (d, "system.kernel.name", un.sysname); 762912Sartem hal_device_property_set_string (d, "system.kernel.version", un.release); 772912Sartem hal_device_property_set_string (d, "system.kernel.machine", un.machine); 782912Sartem } 792912Sartem 802912Sartem devinfo_add_enqueue (d, devfs_path, &devinfo_computer_handler); 812912Sartem 822912Sartem /* all devinfo devices belong to the 'local' branch */ 832912Sartem local_d = hal_device_new (); 842912Sartem 852912Sartem hal_device_property_set_string (local_d, "info.parent", d->udi); 862912Sartem hal_device_property_set_string (local_d, "info.bus", "unknown"); 872912Sartem hal_device_property_set_string (local_d, "info.product", "Local devices"); 882912Sartem hal_device_property_set_string (local_d, "info.udi", "/org/freedesktop/Hal/devices/local"); 892912Sartem hal_device_set_udi (local_d, "/org/freedesktop/Hal/devices/local"); 902912Sartem hal_device_property_set_string (local_d, "solaris.devfs_path", "/local"); 912912Sartem 922912Sartem devinfo_add_enqueue (local_d, "/local", &devinfo_default_handler); 932912Sartem 942912Sartem return (local_d); 952912Sartem } 962912Sartem 972912Sartem static HalDevice * 982912Sartem devinfo_cpu_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type) 992912Sartem { 1002912Sartem HalDevice *d; 1012912Sartem 1022912Sartem if ((device_type == NULL) || (strcmp(device_type, "cpu") != 0)) { 1032912Sartem return (NULL); 1042912Sartem } 1052912Sartem 1062912Sartem d = hal_device_new (); 1072912Sartem 1082912Sartem devinfo_set_default_properties (d, parent, node, devfs_path); 1092912Sartem hal_device_add_capability (d, "processor"); 1102912Sartem 1112912Sartem devinfo_add_enqueue (d, devfs_path, &devinfo_cpu_handler); 1122912Sartem 1132912Sartem return (d); 1142912Sartem } 1152912Sartem 1162912Sartem static HalDevice * 1172912Sartem devinfo_default_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type) 1182912Sartem { 1192912Sartem char *driver_name; 1202912Sartem const char *parent_path; 1212912Sartem HalDevice *d; 1222912Sartem 1232912Sartem /* ignore all children of the 'pseudo' node except lofi */ 1242912Sartem if (parent != NULL) { 1252912Sartem parent_path = hal_device_property_get_string(parent, "solaris.devfs_path"); 1262912Sartem if ((parent_path != NULL) && 1272912Sartem (strcmp (parent_path, "/pseudo") == 0)) { 1282912Sartem driver_name = di_driver_name (node); 1292912Sartem if ((driver_name != NULL) && 1302912Sartem (strcmp (driver_name, "lofi") != 0)) { 1312912Sartem return (NULL); 1322912Sartem } 1332912Sartem } 1342912Sartem } 1352912Sartem 1362912Sartem d = hal_device_new (); 1372912Sartem 1382912Sartem devinfo_set_default_properties (d, parent, node, devfs_path); 1392912Sartem 1402912Sartem devinfo_add_enqueue (d, devfs_path, &devinfo_default_handler); 1412912Sartem 1422912Sartem return (d); 1432912Sartem } 144