From: Marcel Holtmann Date: Fri, 2 Jan 2009 19:37:49 +0000 (+0100) Subject: Require udev >= 129 and add enumeration support X-Git-Tag: 0.6~39 X-Git-Url: https://vcs.maemo.org/git/?a=commitdiff_plain;h=f9581a61c40273285f637dce99ab8a901f8de2bd;p=connman Require udev >= 129 and add enumeration support --- diff --git a/configure.ac b/configure.ac index 564f7c0..77197de 100644 --- a/configure.ac +++ b/configure.ac @@ -103,20 +103,16 @@ AC_ARG_ENABLE(udev, AC_HELP_STRING([--enable-udev], [enable udev support]), [enable_udev=${enableval}]) if (test "${enable_udev}" = "yes"); then AC_DEFINE(HAVE_UDEV, 1, [Define if udev support is available]) - AC_CHECK_LIB(udev, udev_monitor_enable_receiving, dummy=yes, - AC_DEFINE(NEED_UDEV_MONITOR_ENABLE_RECEIVING, 1, + PKG_CHECK_MODULES(UDEV, libudev >= 129, enable_udev=yes, + AC_MSG_ERROR(udev >= 129 is required)) + AC_CHECK_LIB(udev, udev_device_get_parent_with_devtype, dummy=yes, + AC_DEFINE(NEED_UDEV_DEVICE_GET_PARENT_WITH_DEVTYPE, 1, [Define to 1 if you need the - udev_monitor_enable_receiving() function.])) - AC_CHECK_LIB(udev, udev_monitor_receive_device, dummy=yes, - AC_DEFINE(NEED_UDEV_MONITOR_RECEIVE_DEVICE, 1, + udev_device_get_parent_with_devtype() function.])) + AC_CHECK_LIB(udev, udev_enumerate_add_match_property, dummy=yes, + AC_DEFINE(NEED_UDEV_ENUMERATE_ADD_MATCH_PROPERTY, 1, [Define to 1 if you need the - udev_monitor_receive_device() function.])) - AC_CHECK_LIB(udev, udev_device_get_action, dummy=yes, - AC_DEFINE(NEED_UDEV_DEVICE_GET_ACTION, 1, - [Define to 1 if you need the - udev_device_get_action() function.])) - PKG_CHECK_MODULES(UDEV, libudev >= 127, enable_udev=yes, - AC_MSG_ERROR(udev >= 127 is required)) + udev_enumerate_add_match_property() function.])) fi AC_SUBST(UDEV_CFLAGS) AC_SUBST(UDEV_LIBS) diff --git a/src/udev.c b/src/udev.c index 0496da4..eb14655 100644 --- a/src/udev.c +++ b/src/udev.c @@ -23,7 +23,6 @@ #include #endif -#include #include #define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE @@ -33,26 +32,80 @@ #include "connman.h" -#ifdef NEED_UDEV_MONITOR_ENABLE_RECEIVING -static int udev_monitor_enable_receiving(struct udev_monitor *monitor) +#ifdef NEED_UDEV_DEVICE_GET_PARENT_WITH_DEVTYPE +static struct udev_device *udev_device_get_parent_with_devtype(struct udev_device *device, + const char *devtype) { - return 0; + return NULL; } #endif -#ifdef NEED_UDEV_MONITOR_RECEIVE_DEVICE -static struct udev_device *udev_monitor_receive_device(struct udev_monitor *monitor) +#ifdef NEED_UDEV_ENUMERATE_ADD_MATCH_PROPERTY +static int udev_enumerate_add_match_property(struct udev_enumerate *enumerate, + const char *property, const char *value) { - return udev_monitor_get_device(monitor); + return 0; } #endif -#ifdef NEED_UDEV_DEVICE_GET_ACTION -static const char *udev_device_get_action(struct udev_device *device) +static void print_properties(struct udev_device *device, const char *prefix) { - return NULL; + struct udev_list_entry *entry; + + entry = udev_device_get_properties_list_entry(device); + while (entry) { + const char *name = udev_list_entry_get_name(entry); + const char *value = udev_list_entry_get_value(entry); + + if (g_str_has_prefix(name, "CONNMAN") == TRUE || + g_str_equal(name, "DEVNAME") == TRUE || + g_str_equal(name, "DEVPATH") == TRUE) + connman_debug("%s%s = %s", prefix, name, value); + + entry = udev_list_entry_get_next(entry); + } +} + +static void print_device(struct udev_device *device, const char *action) +{ + struct udev_device *parent; + + connman_debug("=== %s ===", action); + print_properties(device, ""); + + parent = udev_device_get_parent_with_devtype(device, "usb_device"); + print_properties(parent, " "); +} + +static void enumerate_devices(struct udev *context) +{ + struct udev_enumerate *enumerate; + struct udev_list_entry *entry; + + enumerate = udev_enumerate_new(context); + if (enumerate == NULL) + return; + + udev_enumerate_add_match_property(enumerate, "CONNMAN_TYPE", "?*"); + + udev_enumerate_scan_devices(enumerate); + + entry = udev_enumerate_get_list_entry(enumerate); + while (entry) { + const char *syspath = udev_list_entry_get_name(entry); + struct udev_device *device; + + device = udev_device_new_from_syspath(context, syspath); + + print_device(device, "coldplug"); + + udev_device_unref(device); + + entry = udev_list_entry_get_next(entry); + } + + udev_enumerate_unref(enumerate); } -#endif static gboolean udev_event(GIOChannel *channel, GIOCondition condition, gpointer user_data) @@ -69,7 +122,7 @@ static gboolean udev_event(GIOChannel *channel, if (action == NULL) goto done; - connman_debug("=== %s ===", action); + print_device(device, action); done: udev_device_unref(device); @@ -111,6 +164,8 @@ int __connman_udev_init(void) return -1; } + enumerate_devices(udev_ctx); + fd = udev_monitor_get_fd(udev_mon); channel = g_io_channel_unix_new(fd);