sysevent.c revision 42a7bded1b1244af097afdc88654381a3d3879f9
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * sysevent.c : Solaris sysevents
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
42a7bded1b1244af097afdc88654381a3d3879f9jacobs * Copyright 2007 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
92f381329ebf1c2209df9608670666b32b291e05artem#pragma ident "%Z%%M% %I% %E% SMI"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
00687e57f8c568d4f8fb446b6530a2942842292fartem#ifdef HAVE_CONFIG_H
00687e57f8c568d4f8fb446b6530a2942842292fartem# 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>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <glib.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"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "sysevent.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifndef ESC_LOFI
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#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 *);
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;
42a7bded1b1244af097afdc88654381a3d3879f9jacobs const char *subcl[3];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * pipe used to serialize sysevents through the main loop
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (pipe (sysevent_pipe_fds) != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("pipe() failed errno=%d", errno));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sysevent_iochannel = g_io_channel_unix_new (sysevent_pipe_fds[0]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (sysevent_iochannel == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem 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);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sysevent_source_id = g_io_add_watch (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem 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
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;
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
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (nvlist_lookup_string(attr_list, DEV_PHYS_PATH, &phys_path) != 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (nvlist_lookup_string(attr_list, DEV_NAME, &dev_name) != 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dev_name = "";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem snprintf(s, sizeof (s), "%s %s %s %s\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem class, subclass, phys_path, dev_name);
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,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GIOCondition condition,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gpointer user_data)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem 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];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("sysevent_iochannel_data"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (g_io_channel_read_line (sysevent_iochannel, &s, &len, NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &err) == G_IO_STATUS_NORMAL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (len == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
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 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);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
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
18c2aff776a775d34a4c9893a4c72e0434d68e36artem 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}