18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * CVSID: $Id$
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * hal-device.c : add devices HAL
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright (C) 2005 SuSE Linux Gmbh
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Steffen Winterfeldt <snwint@suse.de>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Licensed under the Academic Free License version 2.1
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 * 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 * 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
18c2aff776a775d34a4c9893a4c72e0434d68e36artemtypedef struct {
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);
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 { 0, 0, 0, 0 }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while ((i = getopt_long(argc, argv, "a:hr:", options, NULL)) != -1) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (i) {
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 /* fprintf(stderr, "connected to: %s\n", dbus_bus_get_unique_name(conn)); */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_ctx_set_dbus_connection(hal_ctx, conn)) return 4;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf (stderr, "error: libhal_ctx_init: %s: %s\n", error.name, error.message);
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 "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 * Dump all devices.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem asprintf(&udi, "/org/freedesktop/Hal/devices/%s", arg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi = calloc(1, sizeof ("/org/freedesktop/Hal/devices/%s") + strlen(arg));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(device_names = libhal_get_all_devices(hal_ctx, &num_devices, &error))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for(i = 0; i < num_devices; i++) {
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 for(libhal_psi_init(&it, props); libhal_psi_has_more(&it); libhal_psi_next(&it)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem asprintf(&udi, "/org/freedesktop/Hal/devices/%s", arg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi = calloc(1, sizeof ("/org/freedesktop/Hal/devices/%s") + strlen(arg));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "%s: %s\n", error.name, error.message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem asprintf(&udi, "/org/freedesktop/Hal/devices/%s", arg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi = calloc(1, sizeof ("/org/freedesktop/Hal/devices/%s") + strlen(arg));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dev_exists = libhal_device_exists(hal_ctx, udi, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem new_dev.real_udi = libhal_new_device(hal_ctx, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fprintf(stderr, "%s: %s\n", error.name, error.message);
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 printf("%s: %s\n", dev_exists ? "merged": "created", new_dev.udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (isspace(*s)) s++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (*s == '-' || *s == '+' || *s == '.' || isdigit(*s))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (*s && *s != '\'')
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid process_property(LibHalContext *hal_ctx, char *buf, lh_prop_t **prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*s == '-') {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((s1 = skip_number(s), s1 != s) && *s1 == ':') s = skip_space(s1 + 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*s == '=')
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*s == '\'') {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *(s ? s : s_val) = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (*s == '{') {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->v.strlist_value = calloc(1, sizeof *p->v.strlist_value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*s) *s++ = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p->v.strlist_value = realloc(p->v.strlist_value, (len + 2) * sizeof *p->v.strlist_value);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint add_properties(LibHalContext *hal_ctx, new_dev_t *nd, lh_prop_t *prop)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!strcmp(p->key, "udi") && p->type == LIBHAL_PROPERTY_TYPE_STRING) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem old_type = libhal_device_get_property_type(hal_ctx, nd->real_udi, p->key, &error);
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 switch (p->type) {
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 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 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 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 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 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 if (prop->type == LIBHAL_PROPERTY_TYPE_STRING) free(prop->v.str_value);