18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * CVSID: $Id$
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * hal-device.c : add devices HAL
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright (C) 2005 SuSE Linux Gmbh
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Authors:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Steffen Winterfeldt <snwint@suse.de>
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#define _GNU_SOURCE
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef HAVE_CONFIG_H
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# include <config.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <string.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <unistd.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdlib.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <ctype.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <inttypes.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <getopt.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifndef DBUS_API_SUBJECT_TO_CHANGE
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#define DBUS_API_SUBJECT_TO_CHANGE 1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <dbus/dbus.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <libhal.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemtypedef struct {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *udi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *real_udi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem} new_dev_t;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemtypedef struct lh_prop_s {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem struct lh_prop_s *next;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalPropertyType type;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *key;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem union {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *str_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_int32_t int_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_uint64_t uint64_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem double double_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_bool_t bool_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **strlist_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } v;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem} lh_prop_t;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid help(void);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint dump_devices(LibHalContext *hal_ctx, char *arg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint remove_udi(LibHalContext *hal_ctx, char *arg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint add_udi(LibHalContext *hal_ctx, char *arg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid process_property(LibHalContext *hal_ctx, char *buf, lh_prop_t **prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint add_properties(LibHalContext *hal_ctx, new_dev_t *nd, lh_prop_t *prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemlh_prop_t *free_properties(lh_prop_t *prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic char *skip_space(char *s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic char *skip_non_eq_or_space(char *s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic char *skip_number(char *s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic char *skip_nonquote(char *s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemnew_dev_t new_dev;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstruct {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unsigned remove:1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unsigned add:1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unsigned list:1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *udi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem} opt;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstruct option options[] = {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem { "remove", 1, NULL, 'r' },
18c2aff776a775d34a4c9893a4c72e0434d68e36artem { "add", 1, NULL, 'a' },
18c2aff776a775d34a4c9893a4c72e0434d68e36artem { "help", 0, NULL, 'h' },
18c2aff776a775d34a4c9893a4c72e0434d68e36artem { 0, 0, 0, 0 }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem};
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint main(int argc, char **argv)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusConnection *conn;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalContext *hal_ctx;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int i, err;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem opterr = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem opt.list = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while ((i = getopt_long(argc, argv, "a:hr:", options, NULL)) != -1) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (i) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 'a':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem opt.add = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem opt.list = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem opt.udi = optarg;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 'r':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem opt.remove = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem opt.list = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem opt.udi = optarg;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 'h':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem help();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem help();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(conn = dbus_bus_get(DBUS_BUS_SYSTEM, &error))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "error: dbus_bus_get: %s: %s\n", error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 2;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* fprintf(stderr, "connected to: %s\n", dbus_bus_get_unique_name(conn)); */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(hal_ctx = libhal_ctx_new())) return 3;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_ctx_set_dbus_connection(hal_ctx, conn)) return 4;
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 5;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem err = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (opt.list)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem err = dump_devices(hal_ctx, argv[optind]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else if (opt.remove)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem err = remove_udi(hal_ctx, opt.udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else if (opt.add)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem err = add_udi(hal_ctx, opt.udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem err = 6;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_shutdown(hal_ctx, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_free(hal_ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_connection_unref(conn);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return err;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid help()
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "usage: hal-device [--help] [--add udi] [--remove udi] [udi]\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "Create, remove, or show HAL device. If no udi is given, shows all devices.\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "If udi doesn't start with a '/', '/org/freedesktop/Hal/devices/' is prepended.\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem " -a, --add udi\t\tAdd new device.\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem " \t\t\tReads property list in 'lshal' syntax from stdin.\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem " -r, --remove udi\tRemove device.\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem " -h, --help\t\tShow this text.\n"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem );
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Dump all devices.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint dump_devices(LibHalContext *hal_ctx, char *arg)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int num_devices;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **device_names;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *udi = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (arg) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*arg == '/') {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi = arg;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef HAVE_ASPRINTF
18c2aff776a775d34a4c9893a4c72e0434d68e36artem asprintf(&udi, "/org/freedesktop/Hal/devices/%s", arg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi = calloc(1, sizeof ("/org/freedesktop/Hal/devices/%s") + strlen(arg));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sprintf(udi, "/org/freedesktop/Hal/devices/%s", arg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!udi) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(device_names = libhal_get_all_devices(hal_ctx, &num_devices, &error))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "Empty HAL device list.\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 31;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device_names = calloc(2, sizeof *device_names);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device_names[0] = strdup(udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem num_devices = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for(i = 0; i < num_devices; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalPropertySet *props;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalPropertySetIterator it;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int type;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(props = libhal_device_get_all_properties(hal_ctx, device_names[i], &error))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "%s: %s\n", error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!udi)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf("%d: ", i);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf("udi = '%s'\n", device_names[i]);
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 );
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
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 );
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_UINT64:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf(" %s = %lld (0x%llx) (uint64)\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_psi_get_key(&it),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (long long) libhal_psi_get_uint64(&it),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (long long) libhal_psi_get_uint64(&it)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem );
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
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 );
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
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" : "false"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem );
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_STRLIST:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **strlist;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf (" %s = { ", libhal_psi_get_key(&it));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strlist = libhal_psi_get_strlist(&it);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (*strlist) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf("'%s'%s", *strlist, strlist[1] ? ", " : "");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strlist++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf(" } (string list)\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf("Unknown type %d = 0x%02x\n", type, type);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_property_set(props);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf("\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string_array(device_names);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint remove_udi(LibHalContext *hal_ctx, char *arg)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *udi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!arg) return 11;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*arg == '/') {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi = arg;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef HAVE_ASPRINTF
18c2aff776a775d34a4c9893a4c72e0434d68e36artem asprintf(&udi, "/org/freedesktop/Hal/devices/%s", arg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi = calloc(1, sizeof ("/org/freedesktop/Hal/devices/%s") + strlen(arg));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sprintf(udi, "/org/freedesktop/Hal/devices/%s", arg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (opt.remove) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_remove_device(hal_ctx, udi, &error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "%s: %s\n", error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 12;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "removed: %s\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 13;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint add_udi(LibHalContext *hal_ctx, char *arg)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_bool_t dev_exists = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *udi = NULL, buf[1024];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem lh_prop_t *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int err;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!arg)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 21;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*arg == '/') {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi = arg;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef HAVE_ASPRINTF
18c2aff776a775d34a4c9893a4c72e0434d68e36artem asprintf(&udi, "/org/freedesktop/Hal/devices/%s", arg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#else
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi = calloc(1, sizeof ("/org/freedesktop/Hal/devices/%s") + strlen(arg));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sprintf(udi, "/org/freedesktop/Hal/devices/%s", arg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (udi)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem new_dev.udi = strdup(udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (udi)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dev_exists = libhal_device_exists(hal_ctx, udi, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (dev_exists) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem new_dev.real_udi = strdup(new_dev.udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem new_dev.real_udi = libhal_new_device(hal_ctx, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!new_dev.real_udi) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "%s: %s\n", error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(new_dev.real_udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 22;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf("tmp udi: %s\n", new_dev.real_udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (fgets(buf, sizeof buf, stdin)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem process_property(hal_ctx, buf, &prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem err = add_properties(hal_ctx, &new_dev, prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem prop = free_properties(prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!dev_exists) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_device_commit_to_gdl(hal_ctx, new_dev.real_udi, new_dev.udi, &error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "%s: %s\n", error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(new_dev.real_udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem err = err ? err : 23;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem printf("%s: %s\n", dev_exists ? "merged": "created", new_dev.udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return err;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemchar *skip_space(char *s)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (isspace(*s)) s++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return s;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemchar *skip_non_eq_or_space(char *s)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (*s && *s != '=' && !isspace(*s))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return s;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemchar *skip_number(char *s)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (*s == '-' || *s == '+' || *s == '.' || isdigit(*s))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return s;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemchar *skip_nonquote(char *s)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (*s && *s != '\'')
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return s;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid process_property(LibHalContext *hal_ctx, char *buf, lh_prop_t **prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *s, *s1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *key, *s_val = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem lh_prop_t *p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unsigned len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int remove = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s = skip_space(buf);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*s == '-') {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem remove = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s = skip_space(s + 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((s1 = skip_number(s), s1 != s) && *s1 == ':') s = skip_space(s1 + 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s = skip_non_eq_or_space(key = s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *s++ = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!*key)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*key == '#')
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*s == '=')
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s = skip_space(s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!*s)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem remove = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p = calloc(1, sizeof *p);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->type = LIBHAL_PROPERTY_TYPE_INVALID;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->key = strdup(key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (remove) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->next = *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *prop = p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*s == '\'') {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s_val = s + 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s = strrchr(s_val, '\'');
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *(s ? s : s_val) = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->type = LIBHAL_PROPERTY_TYPE_STRING;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->v.str_value = strdup(s_val);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (*s == '{') {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s_val = s + 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s1 = strrchr(s_val, '}');
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (s1) *s1 = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->type = LIBHAL_PROPERTY_TYPE_STRLIST;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem len = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->v.strlist_value = calloc(1, sizeof *p->v.strlist_value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (*s_val++ == '\'') {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s = skip_nonquote(s_val);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*s) *s++ = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->v.strlist_value = realloc(p->v.strlist_value, (len + 2) * sizeof *p->v.strlist_value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->v.strlist_value[len] = strdup(s_val);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->v.strlist_value[++len] = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s_val = skip_nonquote(s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (!strncmp(s, "true", 4)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s += 4;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->type = LIBHAL_PROPERTY_TYPE_BOOLEAN;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->v.bool_value = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (!strncmp(s, "false", 5)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s += 5;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->type = LIBHAL_PROPERTY_TYPE_BOOLEAN;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->v.bool_value = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if ((s1 = skip_number(s)) != s) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strstr(s1, "(int)")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *s1++ = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->type = LIBHAL_PROPERTY_TYPE_INT32;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->v.int_value = strtol(s, NULL, 10);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (strstr(s1, "(uint64)")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *s1++ = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->type = LIBHAL_PROPERTY_TYPE_UINT64;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->v.uint64_value = strtoull(s, NULL, 10);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (strstr(s1, "(double)")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->type = LIBHAL_PROPERTY_TYPE_DOUBLE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->v.double_value = strtod(s, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s = s1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (p->type == LIBHAL_PROPERTY_TYPE_INVALID) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(p->key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(p);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->next = *prop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *prop = p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint add_properties(LibHalContext *hal_ctx, new_dev_t *nd, lh_prop_t *prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem lh_prop_t *p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *udi2 = NULL, *udi3 = NULL, **s;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalPropertyType old_type;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for(p = prop; p; p = p->next) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!strcmp(p->key, "udi") && p->type == LIBHAL_PROPERTY_TYPE_STRING) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi2 = p->v.str_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem old_type = libhal_device_get_property_type(hal_ctx, nd->real_udi, p->key, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (old_type != LIBHAL_PROPERTY_TYPE_INVALID &&
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ( p->type != old_type || p->type == LIBHAL_PROPERTY_TYPE_STRLIST)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_device_remove_property(hal_ctx, nd->real_udi, p->key, &error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "%s: %s\n", error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 41;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (p->type) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_INVALID:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_BOOLEAN:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_device_set_property_bool(hal_ctx, nd->real_udi, p->key, p->v.bool_value, &error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "%s: %s\n", error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 42;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_INT32:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_device_set_property_int(hal_ctx, nd->real_udi, p->key, p->v.int_value, &error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "%s: %s\n", error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 42;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_UINT64:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_device_set_property_uint64(hal_ctx, nd->real_udi, p->key, p->v.uint64_value, &error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "%s: %s\n", error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 42;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_DOUBLE:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_device_set_property_double(hal_ctx, nd->real_udi, p->key, p->v.double_value, &error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "%s: %s\n", error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 42;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_STRING:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!strcmp(p->key, "info.udi")) udi3 = p->v.str_value;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_device_set_property_string(hal_ctx, nd->real_udi, p->key, p->v.str_value, &error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "%s: %s\n", error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 42;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case LIBHAL_PROPERTY_TYPE_STRLIST:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for(s = p->v.strlist_value; *s; s++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_device_property_strlist_append(hal_ctx, nd->real_udi, p->key, *s, &error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "%s: %s\n", error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LIBHAL_FREE_DBUS_ERROR (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 42;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (udi2) udi3 = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (udi3) udi2 = udi3;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (udi2 && !nd->udi)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem nd->udi = strdup(udi2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemlh_prop_t *free_properties(lh_prop_t *prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem lh_prop_t *next;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **s;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for(; prop; prop = next) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem next = prop->next;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(prop->key);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop->type == LIBHAL_PROPERTY_TYPE_STRING) free(prop->v.str_value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (prop->type == LIBHAL_PROPERTY_TYPE_STRLIST && prop->v.strlist_value) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for(s = prop->v.strlist_value; *s; ) free(*s++);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(prop->v.strlist_value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(prop);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}