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