1 /***************************************************************************
2  * CVSID: $Id$
3  *
4  * hal_find_by_property.c : Find hal devices
5  *
6  * Copyright (C) 2005 David Zeuthen, <david@fubar.dk>
7  *
8  * Licensed under the Academic Free License version 2.1
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
23  *
24  **************************************************************************/
25 
26 
27 #ifdef HAVE_CONFIG_H
28 #  include <config.h>
29 #endif
30 
31 #include <stdio.h>
32 #include <string.h>
33 #include <unistd.h>
34 #include <getopt.h>
35 
36 #include <libhal.h>
37 
38 
39 /** Print out program usage.
40  *
41  *  @param  argc                Number of arguments given to program
42  *  @param  argv                Arguments given to program
43  */
44 static void
usage(int argc,char * argv[])45 usage (int argc, char *argv[])
46 {
47 	fprintf (stderr,
48  "\n"
49  "usage : hal-find-by-property --key <key> --string <value>\n"
50  "                              [--help] [--verbose] [--version]\n");
51 
52 /** @todo support other property types a'la hal-[get|set]-property */
53 
54 	fprintf (stderr,
55  "\n"
56  "        --key            Key of the property to check\n"
57  "        --string         String value of property\n"
58  "        --verbose        Be verbose\n"
59  "        --version        Show version and exit\n"
60  "        --help           Show this information and exit\n"
61  "\n"
62  "This program prints the Unique Device Identifiers for HAL device\n"
63  "objects where a given property assumes a given value. On success\n"
64  "the program exists with exit code 0. If there is an error, the\n"
65  "program exits with an exit code different from 0.\n"
66  "\n");
67 }
68 
69 /** Entry point
70  *
71  *  @param  argc                Number of arguments given to program
72  *  @param  argv                Arguments given to program
73  *  @return                     Return code
74  */
75 int
main(int argc,char * argv[])76 main (int argc, char *argv[])
77 {
78 	int i;
79 	int num_udis;
80 	char **udis;
81 	char *key = NULL;
82 	char *value = NULL;
83 	dbus_bool_t is_verbose = FALSE;
84 	dbus_bool_t is_version = FALSE;
85 	DBusError error;
86 	LibHalContext *hal_ctx;
87 
88 	if (argc <= 1) {
89 		usage (argc, argv);
90 		return 1;
91 	}
92 
93 	while (1) {
94 		int c;
95 		int option_index = 0;
96 		const char *opt;
97 		static struct option long_options[] = {
98 			{"key", 1, NULL, 0},
99 			{"string", 1, NULL, 0},
100 			{"verbose", 0, NULL, 0},
101 			{"version", 0, NULL, 0},
102 			{"help", 0, NULL, 0},
103 			{NULL, 0, NULL, 0}
104 		};
105 
106 		c = getopt_long (argc, argv, "",
107 				 long_options, &option_index);
108 		if (c == -1)
109 			break;
110 
111 		switch (c) {
112 		case 0:
113 			opt = long_options[option_index].name;
114 
115 			if (strcmp (opt, "help") == 0) {
116 				usage (argc, argv);
117 				return 0;
118 			} else if (strcmp (opt, "verbose") == 0) {
119 				is_verbose = TRUE;
120 			} else if (strcmp (opt, "version") == 0) {
121 				is_version = TRUE;
122 			} else if (strcmp (opt, "key") == 0) {
123 				key = strdup (optarg);
124 			} else if (strcmp (opt, "string") == 0) {
125 				value = strdup (optarg);
126 			}
127 			break;
128 
129 		default:
130 			usage (argc, argv);
131 			return 1;
132 			break;
133 		}
134 	}
135 
136 	if (is_version) {
137 		printf ("hal-find-by-property " PACKAGE_VERSION "\n");
138 		return 0;
139 	}
140 
141 	if (key == NULL || value == NULL) {
142 		usage (argc, argv);
143 		return 1;
144 	}
145 
146 	dbus_error_init (&error);
147 	if ((hal_ctx = libhal_ctx_new ()) == NULL) {
148 		fprintf (stderr, "error: libhal_ctx_new\n");
149 		return 1;
150 	}
151 	if (!libhal_ctx_set_dbus_connection (hal_ctx, dbus_bus_get (DBUS_BUS_SYSTEM, &error))) {
152 		fprintf (stderr, "error: libhal_ctx_set_dbus_connection: %s: %s\n", error.name, error.message);
153 		LIBHAL_FREE_DBUS_ERROR (&error);
154 		return 1;
155 	}
156 	if (!libhal_ctx_init (hal_ctx, &error)) {
157 		if (dbus_error_is_set(&error)) {
158 			fprintf (stderr, "error: libhal_ctx_init: %s: %s\n", error.name, error.message);
159 			LIBHAL_FREE_DBUS_ERROR (&error);
160 		}
161 		fprintf (stderr, "Could not initialise connection to hald.\n"
162 				 "Normally this means the HAL daemon (hald) is not running or not ready.\n");
163 		return 1;
164 	}
165 
166 
167 	udis = libhal_manager_find_device_string_match (hal_ctx, key, value, &num_udis, &error);
168 
169 	if (dbus_error_is_set (&error)) {
170 		fprintf (stderr, "error: %s: %s\n", error.name, error.message);
171 		LIBHAL_FREE_DBUS_ERROR (&error);
172 		return 1;
173 	}
174 
175 	if (is_verbose)
176 		printf ("Found %d device objects with string property %s = '%s'\n", num_udis, key, value);
177 
178 	if (num_udis == 0) {
179 		return 1;
180 	}
181 
182 	for (i = 0; i < num_udis; i++) {
183 		printf ("%s\n", udis[i]);
184 	}
185 
186 	libhal_free_string_array (udis);
187 
188 	return 0;
189 }
190 
191 /**
192  * @}
193  */
194