/* * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include <stdio.h> #include <string.h> #include <glib.h> #include <glib-object.h> #define G_UDEV_API_IS_SUBJECT_TO_CHANGE #include <gudev/gudev.h> gboolean lookup (const gpointer data); static GMainLoop* loop; int main (int argc, const char *argv[]) { int i; #if !GLIB_CHECK_VERSION(2,35,0) g_type_init (); #endif loop = g_main_loop_new (NULL, FALSE); for (i = 1 ; i < argc ; i++) g_idle_add (lookup, (const gpointer)argv[i]); g_main_loop_run (loop); g_main_loop_unref (loop); return 0; } static void print_device(GUdevDevice *device) { GHashTable *properties; GHashTableIter iter; gpointer key, value; printf (" Name: %s\n", g_udev_device_get_name (device)); printf (" Device file: %s\n", g_udev_device_get_device_file (device)); printf (" Devtype: %s\n", g_udev_device_get_devtype (device)); printf (" Driver: %s\n", g_udev_device_get_driver (device)); printf (" Subsystem: %s\n", g_udev_device_get_subsystem (device)); printf (" Sysfs path: %s\n", g_udev_device_get_sysfs_path (device)); /* We want to print out properties in some fixed order every time. * To do this, we hash on the property name, and then iterate. */ const gchar * const * keys = g_udev_device_get_property_keys (device); properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); for (;*keys;++keys) { const gchar * prop; prop = g_udev_device_get_property (device, *keys); g_hash_table_insert (properties, g_strdup (*keys), g_strdup (prop)); } g_hash_table_iter_init (&iter, properties); while (g_hash_table_iter_next (&iter, &key, &value)) printf (" Property %s: %s\n", (gchar *)key, (gchar *)value); g_hash_table_unref (properties); } gboolean lookup (const gpointer data) { const char *path = data; GUdevClient *guclient = g_udev_client_new (NULL); GUdevDevice *device; if (path[0] == '=') { gchar **parts; parts = g_strsplit (path+1, ",", 2); device = g_udev_client_query_by_subsystem_and_name (guclient, parts[0], parts[1]); g_strfreev (parts); } else if (strncmp (path, "/sys/", 5) == 0) { device = g_udev_client_query_by_sysfs_path (guclient, path); } else { device = g_udev_client_query_by_device_file (guclient, path); } if (device) { print_device (device); if (1) { GUdevDevice *parent; parent = g_udev_device_get_parent (device); if (parent) { printf ("Parent device:\n"); print_device (parent); g_object_unref (parent); } } g_object_unref (device); } printf("\n"); g_object_unref (guclient); g_main_loop_quit (loop); return FALSE; }