lshal.c revision 18c2aff776a775d34a4c9893a4c72e0434d68e36
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * CVSID: $Id$
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * lshal.c : Show devices managed by HAL
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright (C) 2003 David Zeuthen, <david@fubar.dk>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright (C) 2005 Pierre Ossman, <drzeus@drzeus.cx>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Licensed under the Academic Free License version 2.1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * This program is free software; you can redistribute it and/or modify
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * it under the terms of the GNU General Public License as published by
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the Free Software Foundation; either version 2 of the License, or
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * (at your option) any later version.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * This program is distributed in the hope that it will be useful,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * but WITHOUT ANY WARRANTY; without even the implied warranty of
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * GNU General Public License for more details.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * You should have received a copy of the GNU General Public License
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * along with this program; if not, write to the Free Software
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem **************************************************************************/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef HAVE_CONFIG_H
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# include <config.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdlib.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <string.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <unistd.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <getopt.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <glib.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <dbus/dbus-glib-lowlevel.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <dbus/dbus-glib.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <libhal.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef __SUNPRO_C
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#define __FUNCTION__ __func__
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/**
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @defgroup HalLsHal List HAL devices
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @ingroup HalMisc
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @brief A commandline tool, lshal, for displaying and, optionally,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * monitor the devices managed by the HAL daemon. Uses libhal.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Macro for terminating the program on an unrecoverable error */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#define DIE(expr) do {printf("*** [DIE] %s:%s():%d : ", __FILE__, __FUNCTION__, __LINE__); printf expr; printf("\n"); exit(1); } while(0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#define UDI_BASE "/org/freedesktop/Hal/devices/"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic LibHalContext *hal_ctx;
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic dbus_bool_t long_list = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic dbus_bool_t tree_view = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic dbus_bool_t short_list = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic char *show_device = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstruct Device {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *name;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *parent;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem};
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Generate a short name for a device
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param udi Universal Device Id
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic const char *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemshort_name (const char *udi)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return &udi[sizeof(UDI_BASE) - 1];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Print all properties of a device
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param udi Universal Device Id
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemprint_props (const char *udi)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalPropertySet *props;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalPropertySetIterator it;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int type;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem props = libhal_device_get_all_properties (hal_ctx, udi, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* NOTE : This may be NULL if the device was removed
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * in the daemon; this is because
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * hal_device_get_all_properties() is a in
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * essence an IPC call and other stuff may
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * be happening..
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (props == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (libhal_psi_init (&it, props); libhal_psi_has_more (&it); libhal_psi_next (&it)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem type = libhal_psi_get_type (&it);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (type) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_STRING:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (" %s = '%s' (string)\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_psi_get_key (&it),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_psi_get_string (&it));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_INT32:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (" %s = %d (0x%x) (int)\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_psi_get_key (&it),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_psi_get_int (&it),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_psi_get_int (&it));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_UINT64:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (" %s = %llu (0x%llx) (uint64)\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_psi_get_key (&it),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (long long unsigned int) libhal_psi_get_uint64 (&it),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (long long unsigned int) libhal_psi_get_uint64 (&it));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_DOUBLE:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (" %s = %g (double)\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_psi_get_key (&it),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_psi_get_double (&it));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_BOOLEAN:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (" %s = %s (bool)\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_psi_get_key (&it),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_psi_get_bool (&it) ? "true" :
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "false");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_STRLIST:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unsigned int i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **strlist;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (" %s = {", libhal_psi_get_key (&it));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strlist = libhal_psi_get_strlist (&it);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; strlist[i] != 0; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("'%s'", strlist[i]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strlist[i+1] != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (", ");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("} (string list)\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("Unknown type %d=0x%02x\n", type, type);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_property_set (props);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Dumps information about a single device
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param udi Universal Device Id
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdump_device (const char *udi)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_device_exists (hal_ctx, udi, &error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (long_list) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("udi = '%s'\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem print_props (udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%s\n", short_name (udi));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Dump all children of device
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param udi Universal Device Id of parent
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param num_devices Total number of devices in device list
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param devices List of devices
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param depth Current recursion depth
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdump_children (char *udi, int num_devices, struct Device *devices, int depth)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; i < num_devices; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!udi) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (devices[i].parent)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!devices[i].parent)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp (devices[i].parent, udi))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (long_list)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("udi = '%s'\n", devices[i].name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int j;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (tree_view) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (j = 0;j < depth;j++)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf(" ");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%s\n", short_name (devices[i].name));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (long_list) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem print_props (devices[i].name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dump_children(devices[i].name, num_devices, devices, depth + 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Dump all devices to stdout
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdump_devices (void)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int num_devices;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **device_names;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem struct Device *devices;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device_names = libhal_get_all_devices (hal_ctx, &num_devices, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (device_names == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DIE (("Couldn't obtain list of devices\n"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devices = malloc (sizeof(struct Device) * num_devices);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!devices) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string_array (device_names);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0;i < num_devices;i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devices[i].name = device_names[i];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devices[i].parent = libhal_device_get_property_string (hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device_names[i], "info.parent", &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (dbus_error_is_set (&error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Free the error (which include a dbus_error_init())
18c2aff776a775d34a4c9893a4c72e0434d68e36artem This should prevent errors if a call above fails */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_free (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (long_list) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "Dumping %d device(s) from the Global Device List:\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "-------------------------------------------------\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem num_devices);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dump_children(NULL, num_devices, devices, 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0;i < num_devices;i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (devices[i].parent)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string (devices[i].parent);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free (devices);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string_array (device_names);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (long_list) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "Dumped %d device(s) from the Global Device List.\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "------------------------------------------------\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem num_devices);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Invoked when a device is added to the Global Device List. Simply prints
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * a message on stdout.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param udi Universal Device Id
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevice_added (LibHalContext *ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *udi)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (show_device && strcmp(show_device, udi))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (long_list) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("*** lshal: device_added, udi='%s'\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem print_props (udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%s added\n", short_name (udi));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Invoked when a device is removed from the Global Device List. Simply
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * prints a message on stdout.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param udi Universal Device Id
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevice_removed (LibHalContext *ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *udi)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (show_device && strcmp(show_device, udi))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (long_list)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("*** lshal: device_removed, udi='%s'\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%s removed\n", short_name (udi));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Invoked when device in the Global Device List acquires a new capability.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Prints the name of the capability to stdout.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param udi Universal Device Id
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param capability Name of capability
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevice_new_capability (LibHalContext *ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *capability)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (show_device && strcmp(show_device, udi))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (long_list) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("*** lshal: new_capability, udi='%s'\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("*** capability: %s\n", capability);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%s capability %s added\n", short_name (udi),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem capability);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Invoked when device in the Global Device List loses a capability.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Prints the name of the capability to stdout.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param udi Universal Device Id
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param capability Name of capability
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevice_lost_capability (LibHalContext *ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *capability)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (show_device && strcmp(show_device, udi))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (long_list) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("*** lshal: lost_capability, udi='%s'\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("*** capability: %s\n", capability);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%s capability %s lost\n", short_name (udi),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem capability);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Acquires and prints the value of of a property to stdout.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param udi Universal Device Id
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param key Key of property
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemprint_property (const char *udi, const char *key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int type;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *str;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem type = libhal_device_get_property_type (hal_ctx, udi, key, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (type) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_STRING:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem str = libhal_device_get_property_string (hal_ctx, udi, key, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (long_list?"*** new value: '%s' (string)\n":"'%s'", str);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string (str);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_INT32:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_int32_t value = libhal_device_get_property_int (hal_ctx, udi, key, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (long_list?"*** new value: %d (0x%x) (int)\n":"%d (0x%x)",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem value, value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_UINT64:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_uint64_t value = libhal_device_get_property_uint64 (hal_ctx, udi, key, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (long_list?"*** new value: %llu (0x%llx) (uint64)\n":"%llu (0x%llx)",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (long long unsigned int) value, (long long unsigned int) value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_DOUBLE:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (long_list?"*** new value: %g (double)\n":"%g",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_device_get_property_double (hal_ctx, udi, key, &error));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_BOOLEAN:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (long_list?"*** new value: %s (bool)\n":"%s",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_device_get_property_bool (hal_ctx, udi, key, &error) ? "true" : "false");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_STRLIST:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unsigned int i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **strlist;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (long_list)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("*** new value: {");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("{");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strlist = libhal_device_get_property_strlist (hal_ctx, udi, key, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; strlist[i] != 0; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("'%s'", strlist[i]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strlist[i+1] != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (", ");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (long_list)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("} (string list)\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("}");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string_array (strlist);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "Unknown type %d='%c'\n", type, type);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (dbus_error_is_set (&error))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_free (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Invoked when a property of a device in the Global Device List is
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * changed, and we have we have subscribed to changes for that device.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param udi Univerisal Device Id
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param key Key of property
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemproperty_modified (LibHalContext *ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *key,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_bool_t is_removed,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_bool_t is_added)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (show_device && strcmp(show_device, udi))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (long_list) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("*** lshal: property_modified, udi=%s, key=%s\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (" is_removed=%s, is_added=%s\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_removed ? "true" : "false",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_added ? "true" : "false");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!is_removed)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem print_property (udi, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%s property %s ", short_name (udi), key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (is_removed)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("removed");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("= ");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem print_property (udi, key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (is_added)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (" (new)");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Invoked when a property of a device in the Global Device List is
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * changed, and we have we have subscribed to changes for that device.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param udi Univerisal Device Id
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param condition_name Name of condition
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param message D-BUS message with parameters
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevice_condition (LibHalContext *ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *condition_name,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *condition_details)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (show_device && strcmp(show_device, udi))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (long_list) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("*** lshal: device_condition, udi=%s\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (" condition_name=%s\n", condition_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (" condition_details=%s\n", condition_details);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("%s condition %s = %s\n", short_name (udi),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem condition_name, condition_details);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Print out program usage.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param argc Number of arguments given to program
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param argv Arguments given to program
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemusage (int argc, char *argv[])
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "lshal version " PACKAGE_VERSION "\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "\n" "usage : %s [options]\n", argv[0]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "Options:\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem " -m, --monitor Monitor device list\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem " -s, --short short output (print only nonstatic part of udi)\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem " -l, --long Long output\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem " -t, --tree Tree view\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem " -u, --show <udi> Show only the specified device\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem " -h, --help Show this information and exit\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem " -V, --version Print version number\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "Without any given options lshal will start with option --long."
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "Shows all devices and their properties. If the --monitor option is given\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "then the device list and all devices are monitored for changes.\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Entry point
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param argc Number of arguments given to program
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param argv Arguments given to program
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @return Return code
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint
18c2aff776a775d34a4c9893a4c72e0434d68e36artemmain (int argc, char *argv[])
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_bool_t do_monitor = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GMainLoop *loop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusConnection *conn;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (argc == 1) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* This is the default case lshal without any options */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem long_list = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem static const struct option long_options[] = {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {"monitor", no_argument, NULL, 'm'},
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {"long", no_argument, NULL, 'l'},
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {"short", no_argument, NULL, 's'},
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {"tree", no_argument, NULL, 't'},
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {"show", required_argument, NULL, 'u'},
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {"help", no_argument, NULL, 'h'},
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {"usage", no_argument, NULL, 'U'},
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {"version", no_argument, NULL, 'V'},
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {NULL, 0, NULL, 0}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem };
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (1) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int c;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem c = getopt_long (argc, argv, "mlstu:hUV", long_options, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (c == -1) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* this should happen e.g. if 'lshal -' and this is incorrect/incomplete option */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!do_monitor && !long_list && !short_list && !tree_view && !show_device) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem usage (argc, argv);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (c) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 'm':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem do_monitor = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 'l':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem long_list = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 's':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem short_list = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem long_list = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 't':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem tree_view = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 'u':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strchr(optarg, '/') != NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem show_device = strdup(optarg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem show_device = malloc(strlen(UDI_BASE) + strlen(optarg) + 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem memcpy(show_device, UDI_BASE, strlen(UDI_BASE));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem memcpy(show_device + strlen(UDI_BASE), optarg, strlen(optarg) + 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 'h':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 'U':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem usage (argc, argv);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 'V':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("lshal version " PACKAGE_VERSION "\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem usage (argc, argv);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (do_monitor)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem loop = g_main_loop_new (NULL, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem loop = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem conn = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (conn == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "error: dbus_bus_get: %s: %s\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (do_monitor)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_connection_setup_with_g_main (conn, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((hal_ctx = libhal_ctx_new ()) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "error: libhal_ctx_new\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_ctx_set_dbus_connection (hal_ctx, conn)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "error: libhal_ctx_set_dbus_connection: %s: %s\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_ctx_init (hal_ctx, &error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (dbus_error_is_set(&error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "error: libhal_ctx_init: %s: %s\n", error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "Could not initialise connection to hald.\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "Normally this means the HAL daemon (hald) is not running or not ready.\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_set_device_added (hal_ctx, device_added);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_set_device_removed (hal_ctx, device_removed);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_set_device_new_capability (hal_ctx, device_new_capability);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_set_device_lost_capability (hal_ctx, device_lost_capability);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_set_device_property_modified (hal_ctx, property_modified);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_set_device_condition (hal_ctx, device_condition);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (show_device)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dump_device (show_device);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else if (!do_monitor)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dump_devices ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* run the main loop only if we should monitor */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (do_monitor && loop != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if( long_list || short_list || tree_view )
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dump_devices ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ( libhal_device_property_watch_all (hal_ctx, &error) == FALSE) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "error: monitoring devicelist - libhal_device_property_watch_all: %s: %s\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf ("\nStart monitoring devicelist:\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "-------------------------------------------------\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_main_loop_run (loop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ( libhal_ctx_shutdown (hal_ctx, &error) == FALSE)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_free (hal_ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_connection_close (conn);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_connection_unref (conn);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (show_device)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(show_device);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/**
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */