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