18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * osspec.c : Solaris HAL backend entry points
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright 2006 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"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../ids.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void mnttab_event_init ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic gboolean mnttab_event (GIOChannel *channel, GIOCondition cond, gpointer user_data);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* add entire device tree */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* start processing events */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemosspec_filter_function (DBusConnection *connection, DBusMessage *message, void *user_data)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Find the closest ancestor by looking at devfs paths
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param devfs_path Path into devfs, e.g. /pci@0,0/pci1025,57@10,2/storage@1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @return Parent Hal Device Object or #NULL if there is none
18c2aff776a775d34a4c9893a4c72e0434d68e36artemhal_util_find_closest_ancestor (const gchar *devfs_path, gchar **ancestor_devfs_path, gchar **hotplug_devfs_path)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem parent = hal_device_store_match_key_value_string (hald_get_gdl (),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "solaris.devfs_path",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((len = strlen (dsk)) < sizeof ("/dev/dsk/cN") - 1) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (p == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Setup to watch mnttab changes
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * When mnttab changes, POLLRDBAND is set. However, glib does not
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * support POLLRDBAND, so we use Solaris ports (see port_create(3C))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * to "map" POLLRDBAND to POLLIN:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * - create a port
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * - associate the port with mnttab file descriptor and POLLRDBAND
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * - now polling for POLLIN on the port descriptor will unblock when
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the associated file descriptor receives POLLRDBAND
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (port_associate (mnttab_port, PORT_SOURCE_FD, mnttab_fd, POLLRDBAND,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* suppress initial event */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) read(mnttab_fd, buf, (size_t)(sizeof (buf) - 1));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_io_add_watch (mnttab_channel, G_IO_IN, mnttab_event, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemmnttab_event (GIOChannel *channel, GIOCondition cond, gpointer user_data)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* if (cond & ~G_IO_ERR)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* we have to re-associate port with fd every time */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) read(mnttab_fd, buf, (size_t)(sizeof (buf) - 1));