/*
* 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;
}