118c2aff7Sartem /*************************************************************************** 218c2aff7Sartem * CVSID: $Id$ 318c2aff7Sartem * 418c2aff7Sartem * hal_get_property.c : Get property for a device 518c2aff7Sartem * 618c2aff7Sartem * Copyright (C) 2003 David Zeuthen, <david@fubar.dk> 718c2aff7Sartem * 818c2aff7Sartem * Licensed under the Academic Free License version 2.1 918c2aff7Sartem * 1018c2aff7Sartem * This program is free software; you can redistribute it and/or modify 1118c2aff7Sartem * it under the terms of the GNU General Public License as published by 1218c2aff7Sartem * the Free Software Foundation; either version 2 of the License, or 1318c2aff7Sartem * (at your option) any later version. 1418c2aff7Sartem * 1518c2aff7Sartem * This program is distributed in the hope that it will be useful, 1618c2aff7Sartem * but WITHOUT ANY WARRANTY; without even the implied warranty of 1718c2aff7Sartem * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1818c2aff7Sartem * GNU General Public License for more details. 1918c2aff7Sartem * 2018c2aff7Sartem * You should have received a copy of the GNU General Public License 2118c2aff7Sartem * along with this program; if not, write to the Free Software 2218c2aff7Sartem * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 2318c2aff7Sartem * 2418c2aff7Sartem **************************************************************************/ 2518c2aff7Sartem 2618c2aff7Sartem 2718c2aff7Sartem #ifdef HAVE_CONFIG_H 2818c2aff7Sartem # include <config.h> 2918c2aff7Sartem #endif 3018c2aff7Sartem 3118c2aff7Sartem #include <stdio.h> 3218c2aff7Sartem #include <string.h> 3318c2aff7Sartem #include <unistd.h> 3418c2aff7Sartem #include <getopt.h> 3518c2aff7Sartem 3618c2aff7Sartem #include <libhal.h> 3718c2aff7Sartem 3818c2aff7Sartem /** 3918c2aff7Sartem * @defgroup HalGetProperty Get HAL device property 4018c2aff7Sartem * @ingroup HalMisc 4118c2aff7Sartem * 4218c2aff7Sartem * @brief A commandline tool getting a property of a device. Uses libhal 4318c2aff7Sartem * 4418c2aff7Sartem * @{ 4518c2aff7Sartem */ 4618c2aff7Sartem 4718c2aff7Sartem static LibHalContext *hal_ctx; 4818c2aff7Sartem 4918c2aff7Sartem /** Print out program usage. 5018c2aff7Sartem * 5118c2aff7Sartem * @param argc Number of arguments given to program 5218c2aff7Sartem * @param argv Arguments given to program 5318c2aff7Sartem */ 5418c2aff7Sartem static void 5518c2aff7Sartem usage (int argc, char *argv[]) 5618c2aff7Sartem { 5718c2aff7Sartem fprintf (stderr, 5818c2aff7Sartem "\n" 5918c2aff7Sartem "usage : hal-get-property --udi <udi> --key <key> \n" 6018c2aff7Sartem " [--hex] [--help] [--verbose] [--version]\n"); 6118c2aff7Sartem fprintf (stderr, 6218c2aff7Sartem "\n" 6318c2aff7Sartem " --udi Unique Device Id\n" 6418c2aff7Sartem " --key Key of the property to get\n" 6518c2aff7Sartem " --hex Show integer values in hex (without leading 0x)\n" 6618c2aff7Sartem " --verbose Be verbose\n" 6718c2aff7Sartem " --version Show version and exit\n" 6818c2aff7Sartem " --help Show this information and exit\n" 6918c2aff7Sartem "\n" 7018c2aff7Sartem "This program retrieves a property from a device. If the property exist\n" 7118c2aff7Sartem "then it is printed on stdout and this program exits with exit code 0.\n" 7218c2aff7Sartem "On error, the program exits with an exit code different from 0\n" 7318c2aff7Sartem "\n"); 7418c2aff7Sartem } 7518c2aff7Sartem 7618c2aff7Sartem /** Entry point 7718c2aff7Sartem * 7818c2aff7Sartem * @param argc Number of arguments given to program 7918c2aff7Sartem * @param argv Arguments given to program 8018c2aff7Sartem * @return Return code 8118c2aff7Sartem */ 8218c2aff7Sartem int 8318c2aff7Sartem main (int argc, char *argv[]) 8418c2aff7Sartem { 8518c2aff7Sartem char *udi = NULL; 8618c2aff7Sartem char *key = NULL; 8718c2aff7Sartem int type; 8818c2aff7Sartem dbus_bool_t is_hex = FALSE; 8918c2aff7Sartem dbus_bool_t is_verbose = FALSE; 9018c2aff7Sartem dbus_bool_t is_version = FALSE; 91*de7d23d8SLin Guo - Sun Microsystems dbus_bool_t udi_exists = FALSE; 9218c2aff7Sartem char *str; 9318c2aff7Sartem DBusError error; 9418c2aff7Sartem 9518c2aff7Sartem if (argc <= 1) { 9618c2aff7Sartem usage (argc, argv); 9718c2aff7Sartem return 1; 9818c2aff7Sartem } 9918c2aff7Sartem 10018c2aff7Sartem while (1) { 10118c2aff7Sartem int c; 10218c2aff7Sartem int option_index = 0; 10318c2aff7Sartem const char *opt; 10418c2aff7Sartem static struct option long_options[] = { 10518c2aff7Sartem {"udi", 1, NULL, 0}, 10618c2aff7Sartem {"key", 1, NULL, 0}, 10718c2aff7Sartem {"hex", 0, NULL, 0}, 10818c2aff7Sartem {"verbose", 0, NULL, 0}, 10918c2aff7Sartem {"version", 0, NULL, 0}, 11018c2aff7Sartem {"help", 0, NULL, 0}, 11118c2aff7Sartem {NULL, 0, NULL, 0} 11218c2aff7Sartem }; 11318c2aff7Sartem 11418c2aff7Sartem c = getopt_long (argc, argv, "", 11518c2aff7Sartem long_options, &option_index); 11618c2aff7Sartem if (c == -1) 11718c2aff7Sartem break; 11818c2aff7Sartem 11918c2aff7Sartem switch (c) { 12018c2aff7Sartem case 0: 12118c2aff7Sartem opt = long_options[option_index].name; 12218c2aff7Sartem 12318c2aff7Sartem if (strcmp (opt, "help") == 0) { 12418c2aff7Sartem usage (argc, argv); 12518c2aff7Sartem return 0; 12618c2aff7Sartem } else if (strcmp (opt, "hex") == 0) { 12718c2aff7Sartem is_hex = TRUE; 12818c2aff7Sartem } else if (strcmp (opt, "verbose") == 0) { 12918c2aff7Sartem is_verbose = TRUE; 13018c2aff7Sartem } else if (strcmp (opt, "version") == 0) { 13118c2aff7Sartem is_version = TRUE; 13218c2aff7Sartem } else if (strcmp (opt, "key") == 0) { 13318c2aff7Sartem key = strdup (optarg); 13418c2aff7Sartem } else if (strcmp (opt, "udi") == 0) { 13518c2aff7Sartem udi = strdup (optarg); 13618c2aff7Sartem } 13718c2aff7Sartem break; 13818c2aff7Sartem 13918c2aff7Sartem default: 14018c2aff7Sartem usage (argc, argv); 14118c2aff7Sartem return 1; 14218c2aff7Sartem break; 14318c2aff7Sartem } 14418c2aff7Sartem } 14518c2aff7Sartem 14618c2aff7Sartem if (is_version) { 14718c2aff7Sartem printf ("hal-get-property " PACKAGE_VERSION "\n"); 14818c2aff7Sartem return 0; 14918c2aff7Sartem } 15018c2aff7Sartem 15118c2aff7Sartem if (udi == NULL || key == NULL) { 15218c2aff7Sartem usage (argc, argv); 15318c2aff7Sartem return 1; 15418c2aff7Sartem } 15518c2aff7Sartem 15618c2aff7Sartem dbus_error_init (&error); 15718c2aff7Sartem if ((hal_ctx = libhal_ctx_new ()) == NULL) { 15818c2aff7Sartem fprintf (stderr, "error: libhal_ctx_new\n"); 15918c2aff7Sartem return 1; 16018c2aff7Sartem } 16118c2aff7Sartem if (!libhal_ctx_set_dbus_connection (hal_ctx, dbus_bus_get (DBUS_BUS_SYSTEM, &error))) { 16218c2aff7Sartem fprintf (stderr, "error: libhal_ctx_set_dbus_connection: %s: %s\n", error.name, error.message); 16318c2aff7Sartem LIBHAL_FREE_DBUS_ERROR (&error); 16418c2aff7Sartem return 1; 16518c2aff7Sartem } 16618c2aff7Sartem if (!libhal_ctx_init (hal_ctx, &error)) { 16718c2aff7Sartem if (dbus_error_is_set(&error)) { 16818c2aff7Sartem fprintf (stderr, "error: libhal_ctx_init: %s: %s\n", error.name, error.message); 169*de7d23d8SLin Guo - Sun Microsystems dbus_error_free (&error); 17018c2aff7Sartem } 17118c2aff7Sartem fprintf (stderr, "Could not initialise connection to hald.\n" 17218c2aff7Sartem "Normally this means the HAL daemon (hald) is not running or not ready.\n"); 17318c2aff7Sartem return 1; 17418c2aff7Sartem } 17518c2aff7Sartem 176*de7d23d8SLin Guo - Sun Microsystems /* check UDI exists */ 177*de7d23d8SLin Guo - Sun Microsystems udi_exists = libhal_device_exists (hal_ctx, udi, &error); 178*de7d23d8SLin Guo - Sun Microsystems if (!udi_exists) { 179*de7d23d8SLin Guo - Sun Microsystems fprintf (stderr, "error: UDI %s does not exist\n", udi); 180*de7d23d8SLin Guo - Sun Microsystems return 1; 181*de7d23d8SLin Guo - Sun Microsystems } 182*de7d23d8SLin Guo - Sun Microsystems if (dbus_error_is_set(&error)) { 183*de7d23d8SLin Guo - Sun Microsystems fprintf (stderr, "error: libhal_device_exists: %s: %s\n", error.name, error.message); 184*de7d23d8SLin Guo - Sun Microsystems dbus_error_free (&error); 185*de7d23d8SLin Guo - Sun Microsystems return 1; 186*de7d23d8SLin Guo - Sun Microsystems } 187*de7d23d8SLin Guo - Sun Microsystems 188*de7d23d8SLin Guo - Sun Microsystems 18918c2aff7Sartem type = libhal_device_get_property_type (hal_ctx, udi, key, &error); 19018c2aff7Sartem if (type == LIBHAL_PROPERTY_TYPE_INVALID) { 191*de7d23d8SLin Guo - Sun Microsystems if (dbus_error_is_set(&error)) { 19218c2aff7Sartem fprintf (stderr, "error: libhal_device_get_property_type: %s: %s\n", error.name, error.message); 193*de7d23d8SLin Guo - Sun Microsystems dbus_error_free (&error); 194*de7d23d8SLin Guo - Sun Microsystems } else { 195*de7d23d8SLin Guo - Sun Microsystems fprintf (stderr, "error: libhal_device_get_property_type: invalid params.\n"); 196*de7d23d8SLin Guo - Sun Microsystems } 19718c2aff7Sartem return 1; 19818c2aff7Sartem } 19918c2aff7Sartem /* emit the value to stdout */ 20018c2aff7Sartem switch (type) { 20118c2aff7Sartem case LIBHAL_PROPERTY_TYPE_STRING: 20218c2aff7Sartem str = libhal_device_get_property_string (hal_ctx, udi, key, &error); 20318c2aff7Sartem if (is_verbose) 20418c2aff7Sartem printf ("Type is string\n"); 20518c2aff7Sartem printf ("%s\n", str); 20618c2aff7Sartem libhal_free_string (str); 20718c2aff7Sartem break; 20818c2aff7Sartem case LIBHAL_PROPERTY_TYPE_INT32: 20918c2aff7Sartem if (is_verbose) 21018c2aff7Sartem printf ("Type is integer (shown in %s)\n", 21118c2aff7Sartem (is_hex ? "hexadecimal" : "decimal")); 21218c2aff7Sartem printf ((is_hex ? "%x\n" : "%d\n"), 21318c2aff7Sartem libhal_device_get_property_int (hal_ctx, udi, key, &error)); 21418c2aff7Sartem break; 21518c2aff7Sartem case LIBHAL_PROPERTY_TYPE_UINT64: 21618c2aff7Sartem if (is_verbose) 21718c2aff7Sartem printf ("Type is uint64 (shown in %s)\n", 21818c2aff7Sartem (is_hex ? "hexadecimal" : "decimal")); 21918c2aff7Sartem printf ((is_hex ? "%llx\n" : "%llu\n"), 22018c2aff7Sartem (long long unsigned int) libhal_device_get_property_uint64 (hal_ctx, udi, key, &error)); 22118c2aff7Sartem break; 22218c2aff7Sartem case LIBHAL_PROPERTY_TYPE_DOUBLE: 22318c2aff7Sartem if (is_verbose) 22418c2aff7Sartem printf ("Type is double\n"); 22518c2aff7Sartem printf ("%f\n", 22618c2aff7Sartem libhal_device_get_property_double (hal_ctx, udi, key, &error)); 22718c2aff7Sartem break; 22818c2aff7Sartem case LIBHAL_PROPERTY_TYPE_BOOLEAN: 22918c2aff7Sartem if (is_verbose) 23018c2aff7Sartem printf ("Type is boolean\n"); 23118c2aff7Sartem printf ("%s\n", 23218c2aff7Sartem libhal_device_get_property_bool (hal_ctx, udi, key, &error) ? "true" : "false"); 23318c2aff7Sartem break; 23418c2aff7Sartem 23518c2aff7Sartem case LIBHAL_PROPERTY_TYPE_STRLIST: 23618c2aff7Sartem { 23718c2aff7Sartem unsigned int i; 23818c2aff7Sartem char **strlist; 23918c2aff7Sartem 24018c2aff7Sartem if ((strlist = libhal_device_get_property_strlist (hal_ctx, udi, key, &error)) != NULL) { 24118c2aff7Sartem 24218c2aff7Sartem for (i = 0; strlist[i] != 0; i++) { 24318c2aff7Sartem printf ("%s", strlist[i]); 24418c2aff7Sartem if (strlist[i+1] != NULL) 24518c2aff7Sartem printf (" "); 24618c2aff7Sartem } 24718c2aff7Sartem } 24818c2aff7Sartem break; 24918c2aff7Sartem } 25018c2aff7Sartem default: 25118c2aff7Sartem printf ("Unknown type %d='%c'\n", type, type); 25218c2aff7Sartem return 1; 25318c2aff7Sartem break; 25418c2aff7Sartem } 25518c2aff7Sartem 25618c2aff7Sartem if (dbus_error_is_set (&error)) { 25718c2aff7Sartem fprintf (stderr, "error: %s: %s\n", error.name, error.message); 25818c2aff7Sartem dbus_error_free (&error); 25918c2aff7Sartem return 1; 26018c2aff7Sartem } 26118c2aff7Sartem 26218c2aff7Sartem 26318c2aff7Sartem return 0; 26418c2aff7Sartem } 26518c2aff7Sartem 26618c2aff7Sartem /** 26718c2aff7Sartem * @} 26818c2aff7Sartem */ 269