sysevent.c revision 42a7bded1b1244af097afdc88654381a3d3879f9
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * sysevent.c : Solaris sysevents
42a7bded1b1244af097afdc88654381a3d3879f9jacobs * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Use is subject to license terms.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Licensed under the Academic Free License version 2.1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem **************************************************************************/
92f381329ebf1c2209df9608670666b32b291e05artem#pragma ident "%Z%%M% %I% %E% SMI"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../osspec.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../logger.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../hald.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../hald_dbus.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../util.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic gboolean sysevent_iochannel_data(GIOChannel *, GIOCondition, gpointer);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * pipe used to serialize sysevents through the main loop
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sysevent_iochannel = g_io_channel_unix_new (sysevent_pipe_fds[0]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_io_channel_set_flags (sysevent_iochannel, G_IO_FLAG_NONBLOCK, &err);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sysevent_iochannel, G_IO_IN, sysevent_iochannel_data, NULL);
42a7bded1b1244af097afdc88654381a3d3879f9jacobs if (sysevent_subscribe_event(shp, EC_DEV_ADD, subcl, 3) != 0) {
42a7bded1b1244af097afdc88654381a3d3879f9jacobs if (sysevent_subscribe_event(shp, EC_DEV_REMOVE, subcl, 3) != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("subscribe(dev_remove) failed %d", errno));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (sysevent_subscribe_event(shp, EC_DEV_BRANCH, subcl, 1) != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("subscribe(dev_branch) failed %d", errno));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char s[1024];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((subclass = sysevent_get_subclass_name(ev)) == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (nvlist_lookup_string(attr_list, DEV_PHYS_PATH, &phys_path) != 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (nvlist_lookup_string(attr_list, DEV_NAME, &dev_name) != 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem nwritten = write(sysevent_pipe_fds[1], s, strlen(s) + 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("sysevent_dev_handler: wrote %d bytes", nwritten));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (g_io_channel_read_line (sysevent_iochannel, &s, &len, NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (len == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem class[0] = subclass[0] = phys_path[0] = dev_name[0] = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem matches = sscanf(s, "%s %s %s %s", class, subclass, phys_path, dev_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("sysevent: class=%s, sub=%s", class, subclass));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem parent = hal_util_find_closest_ancestor (devfs_path, &parent_devfs_path, &hotplug_devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *parent_udi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((d = hal_device_store_match_key_value_string (hald_get_gdl (),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("device not found in GDL %s", devfs_path));
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 if ((parent = hal_device_store_match_key_value_string (hald_get_gdl (),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("parent not found in GDL %s", parent_udi));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((node = di_init (devfs_path, DINFOCPYALL)) == DI_NODE_NIL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("device not found in devinfo %s", devfs_path));
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);