xref: /aosp_15_r20/external/autotest/client/deps/fakegudev/src/gudev-exercise.c (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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