diff options
author | Szymon Janc <szymon.janc@gmail.com> | 2013-11-25 22:15:49 +0000 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2013-11-27 11:29:28 +0200 |
commit | 663e0b2f0c7ed2878e2c65bff5c01b92f321199a (patch) | |
tree | ce0d9f8e6f0b969cc0d268a4cb9deb861ff220de /plugins/sixaxis.c | |
parent | f52aa874997f2f6f5c3395f79c0fcd26c3fe85d1 (diff) | |
download | bluez-663e0b2f0c7ed2878e2c65bff5c01b92f321199a.tar.gz |
plugins/sixaxis: Add initial code for udev handling
When new device is added plugin will be notified about it.
Diffstat (limited to 'plugins/sixaxis.c')
-rw-r--r-- | plugins/sixaxis.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/plugins/sixaxis.c b/plugins/sixaxis.c index bf66bef8e..7a5c6c247 100644 --- a/plugins/sixaxis.c +++ b/plugins/sixaxis.c @@ -27,19 +27,82 @@ #include <config.h> #endif +#include <stddef.h> +#include <errno.h> +#include <glib.h> +#include <libudev.h> + #include "plugin.h" #include "log.h" +static struct udev *ctx = NULL; +static struct udev_monitor *monitor = NULL; +static guint watch_id = 0; + +static void device_added(struct udev_device *udevice) +{ + DBG(""); +} + +static gboolean monitor_watch(GIOChannel *source, GIOCondition condition, + gpointer data) +{ + struct udev_device *udevice; + + udevice = udev_monitor_receive_device(monitor); + if (!udevice) + return TRUE; + + if (!g_strcmp0(udev_device_get_action(udevice), "add")) + device_added(udevice); + + udev_device_unref(udevice); + + return TRUE; +} + static int sixaxis_init(void) { + GIOChannel *channel; + DBG(""); + ctx = udev_new(); + if (!ctx) + return -EIO; + + monitor = udev_monitor_new_from_netlink(ctx, "udev"); + if (!monitor) { + udev_unref(ctx); + ctx = NULL; + + return -EIO; + } + + /* Listen for newly connected hidraw interfaces */ + udev_monitor_filter_add_match_subsystem_devtype(monitor, "hidraw", + NULL); + udev_monitor_enable_receiving(monitor); + + channel = g_io_channel_unix_new(udev_monitor_get_fd(monitor)); + watch_id = g_io_add_watch(channel, G_IO_IN, monitor_watch, NULL); + g_io_channel_unref(channel); + return 0; } static void sixaxis_exit(void) { DBG(""); + + g_source_remove(watch_id); + watch_id = 0; + + udev_monitor_unref(monitor); + monitor = NULL; + + udev_unref(ctx); + ctx = NULL; } BLUETOOTH_PLUGIN_DEFINE(sixaxis, VERSION, BLUETOOTH_PLUGIN_PRIORITY_LOW, |