18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * sysevent.c : Solaris sysevents
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Use is subject to license terms.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Licensed under the Academic Free License version 2.1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem **************************************************************************/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
00687e57f8c568d4f8fb446b6530a2942842292fartem#ifdef HAVE_CONFIG_H
a9da3307db733eb1739ba859952610bba3d894abnp#include <config.h>
00687e57f8c568d4f8fb446b6530a2942842292fartem#endif
00687e57f8c568d4f8fb446b6530a2942842292fartem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <unistd.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdlib.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <string.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <errno.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <fcntl.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/dkio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/stat.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <libdevinfo.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <libsysevent.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/sysevent/dev.h>
d2ec54f7875f7e05edd56195adbeb593c947763fphitran#include <sys/sysevent/pwrctl.h>
a9da3307db733eb1739ba859952610bba3d894abnp#include <sys/sysevent/dr.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <glib.h>
a9da3307db733eb1739ba859952610bba3d894abnp#include <config_admin.h>
a9da3307db733eb1739ba859952610bba3d894abnp#include <kstat.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../osspec.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../logger.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../hald.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../hald_dbus.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../device_info.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../util.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "osspec_solaris.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "hotplug.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "devinfo.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "devinfo_storage.h"
7b840e52d558c34b70cbcde044d8d79852d169d2phitran#include "devinfo_acpi.h"
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz#include "devinfo_usb.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "sysevent.h"
a9da3307db733eb1739ba859952610bba3d894abnp#include "devinfo_misc.h"
a9da3307db733eb1739ba859952610bba3d894abnp#include "devinfo_cpu.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifndef ESC_LOFI
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz#define ESC_LOFI "lofi"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void sysevent_dev_handler(sysevent_t *);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic gboolean sysevent_iochannel_data(GIOChannel *, GIOCondition, gpointer);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void sysevent_dev_add(gchar *, gchar *);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void sysevent_dev_remove(gchar *, gchar *);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void sysevent_dev_branch(gchar *);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void sysevent_lofi_add(gchar *, gchar *);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void sysevent_lofi_remove(gchar *, gchar *);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzstatic void sysevent_devfs_add(gchar *);
d2ec54f7875f7e05edd56195adbeb593c947763fphitranstatic void sysevent_pwrctl(gchar *, gchar *, gchar *, gchar *, gchar *,
d2ec54f7875f7e05edd56195adbeb593c947763fphitran gchar *, uint_t);
a9da3307db733eb1739ba859952610bba3d894abnpstatic void sysevent_process_dr(gchar *, gchar *);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic sysevent_handle_t *shp;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic int sysevent_pipe_fds[2];
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic GIOChannel *sysevent_iochannel;
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic guint sysevent_source_id;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemsysevent_init(void)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GError *err = NULL;
d2ec54f7875f7e05edd56195adbeb593c947763fphitran const char *subcl[6];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * pipe used to serialize sysevents through the main loop
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (pipe (sysevent_pipe_fds) != 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz HAL_INFO (("pipe() failed errno=%d", errno));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (FALSE);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz sysevent_iochannel = g_io_channel_unix_new (sysevent_pipe_fds[0]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (sysevent_iochannel == NULL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz HAL_INFO (("g_io_channel_unix_new failed"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_io_channel_set_flags (sysevent_iochannel, G_IO_FLAG_NONBLOCK, &err);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz sysevent_source_id = g_io_add_watch (
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz sysevent_iochannel, G_IO_IN, sysevent_iochannel_data, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem shp = sysevent_bind_handle(sysevent_dev_handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (shp == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("sysevent_bind_handle failed %d", errno));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem subcl[0] = ESC_DISK;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem subcl[1] = ESC_LOFI;
42a7bded1b1244af097afdc88654381a3d3879f9jacobs subcl[2] = ESC_PRINTER;
42a7bded1b1244af097afdc88654381a3d3879f9jacobs if (sysevent_subscribe_event(shp, EC_DEV_ADD, subcl, 3) != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("subscribe(dev_add) failed %d", errno));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sysevent_unbind_handle(shp);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
42a7bded1b1244af097afdc88654381a3d3879f9jacobs if (sysevent_subscribe_event(shp, EC_DEV_REMOVE, subcl, 3) != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("subscribe(dev_remove) failed %d", errno));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sysevent_unbind_handle(shp);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem subcl[0] = ESC_DEV_BRANCH_REMOVE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (sysevent_subscribe_event(shp, EC_DEV_BRANCH, subcl, 1) != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("subscribe(dev_branch) failed %d", errno));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sysevent_unbind_handle(shp);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
d2ec54f7875f7e05edd56195adbeb593c947763fphitran subcl[0] = ESC_PWRCTL_ADD;
d2ec54f7875f7e05edd56195adbeb593c947763fphitran subcl[1] = ESC_PWRCTL_REMOVE;
d2ec54f7875f7e05edd56195adbeb593c947763fphitran subcl[2] = ESC_PWRCTL_STATE_CHANGE;
d2ec54f7875f7e05edd56195adbeb593c947763fphitran subcl[3] = ESC_PWRCTL_BRIGHTNESS_UP;
d2ec54f7875f7e05edd56195adbeb593c947763fphitran subcl[4] = ESC_PWRCTL_BRIGHTNESS_DOWN;
d2ec54f7875f7e05edd56195adbeb593c947763fphitran subcl[5] = ESC_PWRCTL_POWER_BUTTON;
d2ec54f7875f7e05edd56195adbeb593c947763fphitran if (sysevent_subscribe_event(shp, EC_PWRCTL, subcl, 6) != 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz HAL_INFO(("subscribe(dev_add) failed %d", errno));
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz sysevent_unbind_handle(shp);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz return (FALSE);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz subcl[0] = ESC_DEVFS_DEVI_ADD;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (sysevent_subscribe_event(shp, EC_DEVFS, subcl, 1) != 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz HAL_INFO (("subscribe(EC_DEVFS) failed %d", errno));
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz sysevent_unbind_handle(shp);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz return (FALSE);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
7b840e52d558c34b70cbcde044d8d79852d169d2phitran
a9da3307db733eb1739ba859952610bba3d894abnp subcl[0] = ESC_DR_AP_STATE_CHANGE;
a9da3307db733eb1739ba859952610bba3d894abnp if (sysevent_subscribe_event(shp, EC_DR, subcl, 1) != 0) {
a9da3307db733eb1739ba859952610bba3d894abnp HAL_INFO (("subscribe(dynamic reconfiguration) failed %d",
a9da3307db733eb1739ba859952610bba3d894abnp errno));
a9da3307db733eb1739ba859952610bba3d894abnp sysevent_unbind_handle(shp);
a9da3307db733eb1739ba859952610bba3d894abnp return (FALSE);
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemsysevent_fini(void)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sysevent_unbind_handle(shp);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem shp = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemsysevent_dev_handler(sysevent_t *ev)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *class;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *subclass;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem nvlist_t *attr_list;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *phys_path;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *dev_name;
7b840e52d558c34b70cbcde044d8d79852d169d2phitran char *dev_hid;
7b840e52d558c34b70cbcde044d8d79852d169d2phitran char *dev_uid;
7b840e52d558c34b70cbcde044d8d79852d169d2phitran uint_t dev_index;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char s[1024];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ssize_t nwritten;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((class = sysevent_get_class_name(ev)) == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((subclass = sysevent_get_subclass_name(ev)) == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (sysevent_get_attr_list(ev, &attr_list) != 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (strcmp(class, EC_DEVFS) == 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (nvlist_lookup_string(attr_list, DEVFS_PATHNAME, &phys_path) != 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz goto out;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz snprintf(s, sizeof (s), "%s %s %s\n",
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz class, subclass, phys_path);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz nwritten = write(sysevent_pipe_fds[1], s, strlen(s) + 1);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz HAL_INFO (("sysevent_dev_handler: wrote %d bytes", nwritten));
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz goto out;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
d2ec54f7875f7e05edd56195adbeb593c947763fphitran if (strcmp(class, EC_PWRCTL) == 0) {
d2ec54f7875f7e05edd56195adbeb593c947763fphitran if (nvlist_lookup_string(attr_list, PWRCTL_DEV_PHYS_PATH,
7b840e52d558c34b70cbcde044d8d79852d169d2phitran &phys_path) != 0) {
7b840e52d558c34b70cbcde044d8d79852d169d2phitran goto out;
7b840e52d558c34b70cbcde044d8d79852d169d2phitran }
a9da3307db733eb1739ba859952610bba3d894abnp } else if (strcmp(class, EC_DR) == 0) {
a9da3307db733eb1739ba859952610bba3d894abnp if (nvlist_lookup_string(attr_list, DR_AP_ID,
a9da3307db733eb1739ba859952610bba3d894abnp &phys_path) != 0) {
a9da3307db733eb1739ba859952610bba3d894abnp goto out;
a9da3307db733eb1739ba859952610bba3d894abnp }
7b840e52d558c34b70cbcde044d8d79852d169d2phitran } else if (nvlist_lookup_string(attr_list, DEV_PHYS_PATH, &phys_path)
7b840e52d558c34b70cbcde044d8d79852d169d2phitran != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
7b840e52d558c34b70cbcde044d8d79852d169d2phitran }
7b840e52d558c34b70cbcde044d8d79852d169d2phitran
a9da3307db733eb1739ba859952610bba3d894abnp /*
a9da3307db733eb1739ba859952610bba3d894abnp * In case of EC_DR, use dev_name to store DR_HINT val
a9da3307db733eb1739ba859952610bba3d894abnp */
a9da3307db733eb1739ba859952610bba3d894abnp if (strcmp(class, EC_DR) == 0) {
a9da3307db733eb1739ba859952610bba3d894abnp if (nvlist_lookup_string(attr_list, DR_HINT, &dev_name) != 0) {
a9da3307db733eb1739ba859952610bba3d894abnp goto out;
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp } else if (nvlist_lookup_string(attr_list, DEV_NAME, &dev_name) != 0) {
d2ec54f7875f7e05edd56195adbeb593c947763fphitran if (strcmp(class, EC_PWRCTL) == 0) {
7b840e52d558c34b70cbcde044d8d79852d169d2phitran dev_name = "noname";
7b840e52d558c34b70cbcde044d8d79852d169d2phitran } else {
7b840e52d558c34b70cbcde044d8d79852d169d2phitran dev_name = "";
7b840e52d558c34b70cbcde044d8d79852d169d2phitran }
7b840e52d558c34b70cbcde044d8d79852d169d2phitran }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
d2ec54f7875f7e05edd56195adbeb593c947763fphitran if (nvlist_lookup_string(attr_list, PWRCTL_DEV_HID, &dev_hid) != 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz dev_hid = "";
7b840e52d558c34b70cbcde044d8d79852d169d2phitran }
d2ec54f7875f7e05edd56195adbeb593c947763fphitran if (nvlist_lookup_string(attr_list, PWRCTL_DEV_UID, &dev_uid) != 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz dev_uid = "";
7b840e52d558c34b70cbcde044d8d79852d169d2phitran }
d2ec54f7875f7e05edd56195adbeb593c947763fphitran if (nvlist_lookup_uint32(attr_list, PWRCTL_DEV_INDEX, &dev_index)
7b840e52d558c34b70cbcde044d8d79852d169d2phitran != 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz dev_index = 0;
7b840e52d558c34b70cbcde044d8d79852d169d2phitran }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
7b840e52d558c34b70cbcde044d8d79852d169d2phitran snprintf(s, sizeof (s), "%s %s %s %s %s %s %d\n",
7b840e52d558c34b70cbcde044d8d79852d169d2phitran class, subclass, phys_path, dev_name, dev_hid, dev_uid, dev_index);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem nwritten = write(sysevent_pipe_fds[1], s, strlen(s) + 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("sysevent_dev_handler: wrote %d bytes", nwritten));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem nvlist_free(attr_list);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic gboolean
18c2aff776a775d34a4c9893a4c72e0434d68e36artemsysevent_iochannel_data (GIOChannel *source,
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz GIOCondition condition,
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz gpointer user_data)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz GError *err = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *s = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gsize len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int matches;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar class[1024];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar subclass[1024];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar phys_path[1024];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar dev_name[1024];
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz gchar dev_uid[1024];
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz gchar dev_hid[1024];
7b840e52d558c34b70cbcde044d8d79852d169d2phitran uint_t dev_index;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("sysevent_iochannel_data"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (g_io_channel_read_line (sysevent_iochannel, &s, &len, NULL,
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz &err) == G_IO_STATUS_NORMAL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (len == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
a9da3307db733eb1739ba859952610bba3d894abnp HAL_INFO (("IOChannel val => %s", s));
7b840e52d558c34b70cbcde044d8d79852d169d2phitran class[0] = subclass[0] = phys_path[0] = dev_name[0] =
7b840e52d558c34b70cbcde044d8d79852d169d2phitran dev_hid[0] = dev_uid[0] = '\0';
7b840e52d558c34b70cbcde044d8d79852d169d2phitran matches = sscanf(s, "%s %s %s %s %s %s %d", class, subclass,
7b840e52d558c34b70cbcde044d8d79852d169d2phitran phys_path, dev_name, dev_hid, dev_uid, &dev_index);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (matches < 3) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("sysevent: class=%s, sub=%s", class, subclass));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp(class, EC_DEV_ADD) == 0) {
42a7bded1b1244af097afdc88654381a3d3879f9jacobs if ((strcmp(subclass, ESC_DISK) == 0) ||
42a7bded1b1244af097afdc88654381a3d3879f9jacobs (strcmp(subclass, ESC_PRINTER) == 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sysevent_dev_add(phys_path, dev_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (strcmp(subclass, ESC_LOFI) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sysevent_lofi_add(phys_path, dev_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (strcmp(class, EC_DEV_REMOVE) == 0) {
42a7bded1b1244af097afdc88654381a3d3879f9jacobs if ((strcmp(subclass, ESC_DISK) == 0) ||
42a7bded1b1244af097afdc88654381a3d3879f9jacobs (strcmp(subclass, ESC_PRINTER) == 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sysevent_dev_remove(phys_path, dev_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (strcmp(subclass, ESC_LOFI) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sysevent_lofi_remove(phys_path, dev_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (strcmp(class, EC_DEV_BRANCH) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sysevent_dev_branch(phys_path);
d2ec54f7875f7e05edd56195adbeb593c947763fphitran } else if (strcmp(class, EC_PWRCTL) == 0) {
d2ec54f7875f7e05edd56195adbeb593c947763fphitran sysevent_pwrctl(class, subclass, phys_path,
d2ec54f7875f7e05edd56195adbeb593c947763fphitran dev_name, dev_hid, dev_uid, dev_index);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz } else if (strcmp(class, EC_DEVFS) == 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (strcmp(subclass, ESC_DEVFS_DEVI_ADD) == 0) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz sysevent_devfs_add(phys_path);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
a9da3307db733eb1739ba859952610bba3d894abnp } else if (strcmp(class, EC_DR) == 0) {
a9da3307db733eb1739ba859952610bba3d894abnp /*
a9da3307db733eb1739ba859952610bba3d894abnp * Note: AP_ID is stored in phys_path and HINT is
a9da3307db733eb1739ba859952610bba3d894abnp * stored in dev_name, to avoid creating seperate
a9da3307db733eb1739ba859952610bba3d894abnp * variables and multiple conditions checking
a9da3307db733eb1739ba859952610bba3d894abnp */
a9da3307db733eb1739ba859952610bba3d894abnp HAL_DEBUG (("In %s, AP_ID-> %s, Hint-> %s", class,
a9da3307db733eb1739ba859952610bba3d894abnp phys_path, dev_name));
a9da3307db733eb1739ba859952610bba3d894abnp if (strcmp(subclass, ESC_DR_AP_STATE_CHANGE) == 0) {
a9da3307db733eb1739ba859952610bba3d894abnp sysevent_process_dr(phys_path, dev_name);
a9da3307db733eb1739ba859952610bba3d894abnp }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (err) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_error_free (err);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemsysevent_dev_add(gchar *devfs_path, gchar *name)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gchar *parent_devfs_path, *hotplug_devfs_path;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *parent;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("dev_add: %s %s", name, devfs_path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz parent = hal_util_find_closest_ancestor (devfs_path, &parent_devfs_path, &hotplug_devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (parent == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("dev_add: parent=%s", parent_devfs_path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("dev_add: real=%s", hotplug_devfs_path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add (parent, hotplug_devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (parent_devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_free (hotplug_devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hotplug_event_process_queue ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemsysevent_dev_remove(gchar *devfs_path, gchar *name)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("dev_remove: %s %s", name, devfs_path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_remove_branch (devfs_path, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hotplug_event_process_queue ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemsysevent_dev_branch(gchar *devfs_path)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("branch_remove: %s", devfs_path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_remove_branch (devfs_path, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hotplug_event_process_queue ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemsysevent_lofi_add(gchar *devfs_path, gchar *name)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem di_node_t node;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *parent_udi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HalDevice *d, *parent;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("lofi_add: %s %s", name, devfs_path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((d = hal_device_store_match_key_value_string (hald_get_gdl (),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "solaris.devfs_path", devfs_path)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("device not found in GDL %s", devfs_path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem parent_udi = hal_device_property_get_string (d, "info.parent");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((parent_udi == NULL) || (strlen(parent_udi) == 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("parent not found in GDL %s", parent_udi));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((parent = hal_device_store_match_key_value_string (hald_get_gdl (),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "info.udi", parent_udi)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("parent not found in GDL %s", parent_udi));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((node = di_init (devfs_path, DINFOCPYALL)) == DI_NODE_NIL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("device not found in devinfo %s", devfs_path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("device %s parent %s", hal_device_get_udi (d), parent_udi));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_lofi_add_major (parent, node, devfs_path, NULL, TRUE, d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem di_fini (node);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hotplug_event_process_queue ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemsysevent_lofi_remove(gchar *parent_devfs_path, gchar *name)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_lofi_remove_minor(parent_devfs_path, name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hotplug_event_process_queue ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzstatic HalDevice *
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzlookup_parent(char *devfs_path)
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz{
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz gchar *path = NULL;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz HalDevice *parent = NULL;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz char *p;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz path = strdup (devfs_path);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz p = strrchr (path, '/');
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (p == NULL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz free (path);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz return (NULL);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz *p = '\0';
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* Look up the parent node in the gdl. */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz parent = hal_device_store_match_key_value_string (hald_get_gdl (),
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz "solaris.devfs_path", path);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if (parent == NULL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* Look up the parent node in the tdl. */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz parent = hal_device_store_match_key_value_string (hald_get_tdl (),
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz "solaris.devfs_path", path);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz free (path);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz return (parent);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz}
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz/*
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz * Handle the USB bus devices hot plugging events.
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzstatic void
112cd14a18db3bd3fac4ff92c4117b51ddd339abqzsysevent_devfs_add(gchar *devfs_path)
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz{
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz di_node_t node;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz HalDevice *parent;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz char *driver_name;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz HAL_INFO (("devfs_handle: %s", devfs_path));
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if ((node = di_init (devfs_path, DINFOCPYALL)) == DI_NODE_NIL) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz HAL_INFO (("device not found in devinfo %s", devfs_path));
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz return;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz }
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if ((driver_name = di_driver_name (node)) == NULL)
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz goto out;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz /* The disk and printer devices are handled by EC_DEV_ADD class. */
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if ((strcmp (driver_name, "scsa2usb") == 0) ||
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz (strcmp (driver_name, "usbprn") == 0))
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz goto out;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz if ((parent = lookup_parent (devfs_path)) == NULL)
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz goto out;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz devinfo_usb_add (parent, node, devfs_path, NULL);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz di_fini (node);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hotplug_event_process_queue ();
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz return;
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz out:
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz di_fini (node);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz}
d2ec54f7875f7e05edd56195adbeb593c947763fphitran
d2ec54f7875f7e05edd56195adbeb593c947763fphitranstatic void
d2ec54f7875f7e05edd56195adbeb593c947763fphitransysevent_pwrctl(gchar *class, gchar *subclass, gchar *phys_path,
d2ec54f7875f7e05edd56195adbeb593c947763fphitran gchar *dev_name, gchar *dev_hid, gchar *dev_uid, uint_t dev_index)
d2ec54f7875f7e05edd56195adbeb593c947763fphitran{
d2ec54f7875f7e05edd56195adbeb593c947763fphitran const gchar prefix[] = "/org/freedesktop/Hal/devices/pseudo/acpi_drv_0";
d2ec54f7875f7e05edd56195adbeb593c947763fphitran gchar udi[HAL_PATH_MAX];
d2ec54f7875f7e05edd56195adbeb593c947763fphitran
d2ec54f7875f7e05edd56195adbeb593c947763fphitran if (strcmp(dev_hid, "PNP0C0A") == 0) {
d2ec54f7875f7e05edd56195adbeb593c947763fphitran snprintf(udi, sizeof(udi), "%s_battery%d_0", prefix, dev_index);
076d97abc78bcba2f2216859fe2c6913cc7aff32Phi Tran devinfo_battery_rescan(phys_path, udi);
d2ec54f7875f7e05edd56195adbeb593c947763fphitran } else if (strcmp(dev_hid, "ACPI0003") == 0) {
d2ec54f7875f7e05edd56195adbeb593c947763fphitran snprintf(udi, sizeof (udi), "%s_ac%d_0", prefix, dev_index);
076d97abc78bcba2f2216859fe2c6913cc7aff32Phi Tran devinfo_battery_rescan(phys_path, udi);
d2ec54f7875f7e05edd56195adbeb593c947763fphitran } else if (strcmp(dev_hid, "PNP0C0D") == 0) {
d2ec54f7875f7e05edd56195adbeb593c947763fphitran snprintf(udi, sizeof (udi), "%s_lid_0", prefix);
076d97abc78bcba2f2216859fe2c6913cc7aff32Phi Tran devinfo_lid_event(subclass, udi);
d2ec54f7875f7e05edd56195adbeb593c947763fphitran } else if (strcmp(subclass, ESC_PWRCTL_POWER_BUTTON) == 0) {
076d97abc78bcba2f2216859fe2c6913cc7aff32Phi Tran devinfo_power_button_event();
d2ec54f7875f7e05edd56195adbeb593c947763fphitran } else if ((strcmp(subclass, ESC_PWRCTL_BRIGHTNESS_UP) == 0) ||
d2ec54f7875f7e05edd56195adbeb593c947763fphitran (strcmp(subclass, ESC_PWRCTL_BRIGHTNESS_DOWN) == 0)) {
076d97abc78bcba2f2216859fe2c6913cc7aff32Phi Tran devinfo_brightness_hotkeys_event(subclass);
d2ec54f7875f7e05edd56195adbeb593c947763fphitran } else {
d2ec54f7875f7e05edd56195adbeb593c947763fphitran HAL_INFO(("Unmatched EC_PWRCTL"));
d2ec54f7875f7e05edd56195adbeb593c947763fphitran }
d2ec54f7875f7e05edd56195adbeb593c947763fphitran}
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnpstatic void
a9da3307db733eb1739ba859952610bba3d894abnpsysevent_dr_remove_cpu()
a9da3307db733eb1739ba859952610bba3d894abnp{
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp HalDeviceStore *gdl;
a9da3307db733eb1739ba859952610bba3d894abnp GSList *iter;
a9da3307db733eb1739ba859952610bba3d894abnp HalDevice *d, *del_dev;
a9da3307db733eb1739ba859952610bba3d894abnp int cpu_id, del_cpuid;
a9da3307db733eb1739ba859952610bba3d894abnp kstat_ctl_t *kc;
a9da3307db733eb1739ba859952610bba3d894abnp kstat_t *ksp;
a9da3307db733eb1739ba859952610bba3d894abnp kstat_named_t *ksdata;
a9da3307db733eb1739ba859952610bba3d894abnp const char *cpu_devfs_path;
a9da3307db733eb1739ba859952610bba3d894abnp /*
a9da3307db733eb1739ba859952610bba3d894abnp * Find the CPU's that are DR removed. For each "processor" device in
a9da3307db733eb1739ba859952610bba3d894abnp * HAL device tree, check if it has its corresponding kstat_info. If
a9da3307db733eb1739ba859952610bba3d894abnp * not, then, that cpu has been removed and can remove the entry from
a9da3307db733eb1739ba859952610bba3d894abnp * HAL entry
a9da3307db733eb1739ba859952610bba3d894abnp */
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp HAL_DEBUG (("sysevent_dr_remove_cpu()"));
a9da3307db733eb1739ba859952610bba3d894abnp kc = kstat_open ();
a9da3307db733eb1739ba859952610bba3d894abnp if (kc == NULL) {
a9da3307db733eb1739ba859952610bba3d894abnp HAL_INFO (("Error in removing HAL cpu entry during DR. Could"
a9da3307db733eb1739ba859952610bba3d894abnp " not open kstat to get cpu info: %s", strerror (errno)));
a9da3307db733eb1739ba859952610bba3d894abnp return;
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp /*
a9da3307db733eb1739ba859952610bba3d894abnp * Iterate through the HAL device list to get the processor devices
a9da3307db733eb1739ba859952610bba3d894abnp */
a9da3307db733eb1739ba859952610bba3d894abnp gdl = hald_get_gdl ();
a9da3307db733eb1739ba859952610bba3d894abnp iter = gdl->devices;
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp while (iter != NULL) {
a9da3307db733eb1739ba859952610bba3d894abnp d = HAL_DEVICE (iter->data);
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp if (!hal_device_has_property (d, "processor.number")) {
a9da3307db733eb1739ba859952610bba3d894abnp iter = iter->next;
a9da3307db733eb1739ba859952610bba3d894abnp continue;
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp cpu_id = hal_device_property_get_int (d, "processor.number");
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp /*
a9da3307db733eb1739ba859952610bba3d894abnp * Check if the above cpu_id has its info in kstat
a9da3307db733eb1739ba859952610bba3d894abnp */
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp ksp = kstat_lookup (kc, "cpu_info", cpu_id, NULL);
a9da3307db733eb1739ba859952610bba3d894abnp if (ksp != NULL) {
a9da3307db733eb1739ba859952610bba3d894abnp iter = iter->next;
a9da3307db733eb1739ba859952610bba3d894abnp continue;
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp /*
a9da3307db733eb1739ba859952610bba3d894abnp * kstat info not found. Delete the device entry
a9da3307db733eb1739ba859952610bba3d894abnp */
a9da3307db733eb1739ba859952610bba3d894abnp HAL_INFO ((" Remove CPU entry: %d", cpu_id));
a9da3307db733eb1739ba859952610bba3d894abnp iter = iter->next;
a9da3307db733eb1739ba859952610bba3d894abnp cpu_devfs_path = hal_device_property_get_string (d,
a9da3307db733eb1739ba859952610bba3d894abnp "solaris.devfs_path");
a9da3307db733eb1739ba859952610bba3d894abnp if (cpu_devfs_path == NULL) {
a9da3307db733eb1739ba859952610bba3d894abnp HAL_INFO (("Could not get cpu_devfs_path to "
a9da3307db733eb1739ba859952610bba3d894abnp "remove for cpu_id %d", cpu_id));
a9da3307db733eb1739ba859952610bba3d894abnp } else {
a9da3307db733eb1739ba859952610bba3d894abnp /*
a9da3307db733eb1739ba859952610bba3d894abnp * Remove the cpu device
a9da3307db733eb1739ba859952610bba3d894abnp */
a9da3307db733eb1739ba859952610bba3d894abnp HAL_DEBUG (("Queue %s for removal", cpu_devfs_path));
a9da3307db733eb1739ba859952610bba3d894abnp devinfo_remove_enqueue ((char *)cpu_devfs_path, NULL);
a9da3307db733eb1739ba859952610bba3d894abnp hotplug_event_process_queue ();
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp if (kc) {
a9da3307db733eb1739ba859952610bba3d894abnp kstat_close (kc);
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp}
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnpint
a9da3307db733eb1739ba859952610bba3d894abnpsysevent_dr_insert_cpu(di_node_t node, void *arg)
a9da3307db733eb1739ba859952610bba3d894abnp{
a9da3307db733eb1739ba859952610bba3d894abnp char *devfs_path;
a9da3307db733eb1739ba859952610bba3d894abnp char *device_type = NULL;
a9da3307db733eb1739ba859952610bba3d894abnp DevinfoDevHandler *dh;
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp dh = &devinfo_cpu_handler;
a9da3307db733eb1739ba859952610bba3d894abnp devfs_path = di_devfs_path (node);
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp (void) di_prop_lookup_strings (DDI_DEV_T_ANY, node, "device_type",
a9da3307db733eb1739ba859952610bba3d894abnp &device_type);
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp dh->add (NULL, node, devfs_path, device_type);
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp di_devfs_path_free (devfs_path);
a9da3307db733eb1739ba859952610bba3d894abnp return (DI_WALK_CONTINUE);
a9da3307db733eb1739ba859952610bba3d894abnp}
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp/*
a9da3307db733eb1739ba859952610bba3d894abnp * Remove/Add the DR event device
a9da3307db733eb1739ba859952610bba3d894abnp * Note: Currently it supports only CPU DR events
a9da3307db733eb1739ba859952610bba3d894abnp */
a9da3307db733eb1739ba859952610bba3d894abnpstatic void
a9da3307db733eb1739ba859952610bba3d894abnpsysevent_process_dr(gchar *ap_id, gchar *hint_val)
a9da3307db733eb1739ba859952610bba3d894abnp{
a9da3307db733eb1739ba859952610bba3d894abnp cfga_err_t cfgerr;
a9da3307db733eb1739ba859952610bba3d894abnp cfga_list_data_t *cfg_stat;
a9da3307db733eb1739ba859952610bba3d894abnp int nlist;
a9da3307db733eb1739ba859952610bba3d894abnp char *errstr;
a9da3307db733eb1739ba859952610bba3d894abnp di_node_t root_node;
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp if ((ap_id == NULL) || (hint_val == NULL))
a9da3307db733eb1739ba859952610bba3d894abnp return;
a9da3307db733eb1739ba859952610bba3d894abnp HAL_DEBUG (("sysevent_process_dr: %s", ap_id));
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp cfgerr = config_list_ext (1, (char *const *)&ap_id, &cfg_stat, &nlist,
a9da3307db733eb1739ba859952610bba3d894abnp NULL, NULL, &errstr, 0);
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnp if (cfgerr != CFGA_OK) {
a9da3307db733eb1739ba859952610bba3d894abnp HAL_INFO (("DR sysevent process %d config_list_ext error: %s",
a9da3307db733eb1739ba859952610bba3d894abnp ap_id, errstr));
a9da3307db733eb1739ba859952610bba3d894abnp goto out;
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp /*
a9da3307db733eb1739ba859952610bba3d894abnp * Check if the device type is CPU
a9da3307db733eb1739ba859952610bba3d894abnp */
a9da3307db733eb1739ba859952610bba3d894abnp HAL_DEBUG ((" Ap-Type: %s, State: %d", cfg_stat->ap_type,
a9da3307db733eb1739ba859952610bba3d894abnp cfg_stat->ap_r_state));
a9da3307db733eb1739ba859952610bba3d894abnp if (strcmp (cfg_stat->ap_type, "CPU") == 0) {
a9da3307db733eb1739ba859952610bba3d894abnp if (strcmp (hint_val, DR_HINT_REMOVE) == 0) {
a9da3307db733eb1739ba859952610bba3d894abnp sysevent_dr_remove_cpu();
a9da3307db733eb1739ba859952610bba3d894abnp } else if (strcmp (hint_val, DR_HINT_INSERT) == 0) {
a9da3307db733eb1739ba859952610bba3d894abnp /*
a9da3307db733eb1739ba859952610bba3d894abnp * Go through the device list and add the new cpu
a9da3307db733eb1739ba859952610bba3d894abnp * entries into HAL
a9da3307db733eb1739ba859952610bba3d894abnp */
a9da3307db733eb1739ba859952610bba3d894abnp if ((root_node =
a9da3307db733eb1739ba859952610bba3d894abnp di_init ("/", DINFOCPYALL)) == DI_NODE_NIL) {
a9da3307db733eb1739ba859952610bba3d894abnp HAL_INFO (("di_init failed. "\
a9da3307db733eb1739ba859952610bba3d894abnp "Cannot insert CPU"));
a9da3307db733eb1739ba859952610bba3d894abnp goto out;
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp di_walk_node (root_node, DI_WALK_CLDFIRST, NULL,
a9da3307db733eb1739ba859952610bba3d894abnp sysevent_dr_insert_cpu);
a9da3307db733eb1739ba859952610bba3d894abnp di_fini (root_node);
a9da3307db733eb1739ba859952610bba3d894abnp hotplug_event_process_queue ();
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp } else {
a9da3307db733eb1739ba859952610bba3d894abnp HAL_INFO (("Not a CPU, so cannot DR"));
a9da3307db733eb1739ba859952610bba3d894abnp }
a9da3307db733eb1739ba859952610bba3d894abnp
a9da3307db733eb1739ba859952610bba3d894abnpout:
a9da3307db733eb1739ba859952610bba3d894abnp if (cfg_stat)
a9da3307db733eb1739ba859952610bba3d894abnp free (cfg_stat);
a9da3307db733eb1739ba859952610bba3d894abnp if (errstr)
a9da3307db733eb1739ba859952610bba3d894abnp free (errstr);
a9da3307db733eb1739ba859952610bba3d894abnp}