1 /*
2 * Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file.
5 */
6
7 #include <stdio.h>
8 #include <string.h>
9
10 #include <glib.h>
11 #include <glib-object.h>
12
13 #define G_UDEV_API_IS_SUBJECT_TO_CHANGE
14 #include <gudev/gudev.h>
15
16 gboolean lookup (const gpointer data);
17
18 static GMainLoop* loop;
19
20 int
main(int argc,const char * argv[])21 main (int argc, const char *argv[])
22 {
23 int i;
24
25 #if !GLIB_CHECK_VERSION(2,35,0)
26 g_type_init ();
27 #endif
28
29 loop = g_main_loop_new (NULL, FALSE);
30
31 for (i = 1 ; i < argc ; i++)
32 g_idle_add (lookup, (const gpointer)argv[i]);
33
34 g_main_loop_run (loop);
35
36 g_main_loop_unref (loop);
37
38 return 0;
39 }
40
41 static void
print_device(GUdevDevice * device)42 print_device(GUdevDevice *device)
43 {
44 GHashTable *properties;
45 GHashTableIter iter;
46 gpointer key, value;
47
48 printf (" Name: %s\n", g_udev_device_get_name (device));
49 printf (" Device file: %s\n", g_udev_device_get_device_file (device));
50 printf (" Devtype: %s\n", g_udev_device_get_devtype (device));
51 printf (" Driver: %s\n", g_udev_device_get_driver (device));
52 printf (" Subsystem: %s\n", g_udev_device_get_subsystem (device));
53 printf (" Sysfs path: %s\n", g_udev_device_get_sysfs_path (device));
54
55 /* We want to print out properties in some fixed order every time.
56 * To do this, we hash on the property name, and then iterate.
57 */
58 const gchar * const * keys = g_udev_device_get_property_keys (device);
59 properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
60 for (;*keys;++keys) {
61 const gchar * prop;
62
63 prop = g_udev_device_get_property (device, *keys);
64 g_hash_table_insert (properties, g_strdup (*keys), g_strdup (prop));
65 }
66
67 g_hash_table_iter_init (&iter, properties);
68 while (g_hash_table_iter_next (&iter, &key, &value))
69 printf (" Property %s: %s\n", (gchar *)key, (gchar *)value);
70
71 g_hash_table_unref (properties);
72 }
73
74 gboolean
lookup(const gpointer data)75 lookup (const gpointer data)
76 {
77 const char *path = data;
78
79 GUdevClient *guclient = g_udev_client_new (NULL);
80 GUdevDevice *device;
81
82 if (path[0] == '=') {
83 gchar **parts;
84 parts = g_strsplit (path+1, ",", 2);
85
86 device = g_udev_client_query_by_subsystem_and_name (guclient, parts[0],
87 parts[1]);
88 g_strfreev (parts);
89 } else if (strncmp (path, "/sys/", 5) == 0) {
90 device = g_udev_client_query_by_sysfs_path (guclient, path);
91 } else {
92 device = g_udev_client_query_by_device_file (guclient, path);
93 }
94
95 if (device) {
96 print_device (device);
97 if (1) {
98 GUdevDevice *parent;
99 parent = g_udev_device_get_parent (device);
100 if (parent) {
101 printf ("Parent device:\n");
102 print_device (parent);
103 g_object_unref (parent);
104 }
105 }
106 g_object_unref (device);
107 }
108 printf("\n");
109
110 g_object_unref (guclient);
111
112 g_main_loop_quit (loop);
113
114 return FALSE;
115 }
116