- Update cable pairing plugin to use libudev

This commit is contained in:
Bastien Nocera 2009-10-09 15:08:22 +00:00
parent c7a736cb45
commit d02faea259
2 changed files with 92 additions and 54 deletions

View File

@ -1,44 +1,57 @@
From df50f89ea8967fa0ba0d21aac0ce905801d31c70 Mon Sep 17 00:00:00 2001
From 7194839445edb3fd112b2bc79878c303e3b7c9e2 Mon Sep 17 00:00:00 2001
From: Bastien Nocera <hadess@hadess.net>
Date: Tue, 1 Sep 2009 17:32:48 +0100
Subject: [PATCH] Add sixaxis cable-pairing plugin
Implement the old "sixpair" using gudev (a GObject layer on top
of udev's monitoring system), and libusb-1.0.
Implement the old "sixpair" using libudev and libusb-1.0.
When a Sixaxis device is plugged in, events are filtered, and
the device is selected, poked around to set the default Bluetooth
address, and added to the database of the current default adapter.
---
Makefile.am | 9 ++
Makefile.am | 9 +-
acinclude.m4 | 16 +++
configure.ac | 1 +
plugins/cable.c | 362 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 388 insertions(+), 0 deletions(-)
plugins/cable.c | 384 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 408 insertions(+), 2 deletions(-)
create mode 100644 plugins/cable.c
diff --git a/Makefile.am b/Makefile.am
index c8337d6..0bdf694 100644
index c8337d6..e5eccdf 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -162,6 +162,15 @@ builtin_modules += service
@@ -162,6 +162,11 @@ builtin_modules += service
builtin_sources += plugins/service.c
endif
+if CABLE
+plugin_LTLIBRARIES += plugins/cable.la
+
+plugins_cable_la_LIBADD = @CABLE_LIBS@
+plugins_cable_la_LDFLAGS = -module -avoid-version -no-undefined
+plugins_cable_la_CFLAGS = -fvisibility=hidden @DBUS_CFLAGS@ \
+ @GLIB_CFLAGS@ @CABLE_CFLAGS@
+builtin_modules += cable
+builtin_sources += plugins/cable.c
+endif
+
builtin_modules += hciops
builtin_sources += plugins/hciops.c
@@ -192,7 +197,7 @@ src_bluetoothd_SOURCES = $(gdbus_sources) $(builtin_sources) \
src/dbus-common.c src/dbus-common.h \
src/dbus-hci.h src/dbus-hci.c
src_bluetoothd_LDADD = lib/libbluetooth.la @GLIB_LIBS@ @DBUS_LIBS@ \
- @CAPNG_LIBS@ -ldl
+ @CAPNG_LIBS@ @CABLE_LIBS@ -ldl
src_bluetoothd_LDFLAGS = -Wl,--export-dynamic \
-Wl,--version-script=src/bluetooth.ver
src_bluetoothd_DEPENDENCIES = src/bluetooth.ver lib/libbluetooth.la
@@ -305,7 +310,7 @@ EXTRA_DIST += doc/manager-api.txt \
AM_YFLAGS = -d
-AM_CFLAGS = @DBUS_CFLAGS@ @GLIB_CFLAGS@ @CAPNG_CFLAGS@ \
+AM_CFLAGS = @DBUS_CFLAGS@ @GLIB_CFLAGS@ @CAPNG_CFLAGS@ @CABLE_CFLAGS@ \
-DBLUETOOTH_PLUGIN_BUILTIN -DPLUGINDIR=\""$(plugindir)"\"
INCLUDES = -I$(builddir)/lib -I$(builddir)/src -I$(srcdir)/src \
diff --git a/acinclude.m4 b/acinclude.m4
index e7d1c32..3feddf8 100644
index e7d1c32..10e5241 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -142,6 +142,12 @@ AC_DEFUN([AC_PATH_USB], [
@ -46,7 +59,7 @@ index e7d1c32..3feddf8 100644
])
+AC_DEFUN([AC_PATH_CABLE], [
+ PKG_CHECK_MODULES(CABLE, gudev-1.0 libusb-1.0, cable_found=yes, cable_found=no)
+ PKG_CHECK_MODULES(CABLE, libudev libusb-1.0, cable_found=yes, cable_found=no)
+ AC_SUBST(CABLE_CFLAGS)
+ AC_SUBST(CABLE_LIBS)
+])
@ -104,10 +117,10 @@ index b93cca0..5df134f 100644
AC_PATH_CAPNG
diff --git a/plugins/cable.c b/plugins/cable.c
new file mode 100644
index 0000000..6e81ba0
index 0000000..0b7cc7a
--- /dev/null
+++ b/plugins/cable.c
@@ -0,0 +1,362 @@
@@ -0,0 +1,384 @@
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
@ -135,8 +148,9 @@ index 0000000..6e81ba0
+#include <config.h>
+#endif
+
+#define G_UDEV_API_IS_SUBJECT_TO_CHANGE
+#include <gudev/gudev.h>
+#include <glib.h>
+#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE 1
+#include <libudev.h>
+#include <dbus/dbus.h>
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/sdp.h>
@ -319,7 +333,7 @@ index 0000000..6e81ba0
+ libusb_close(devh);
+}
+
+static void handle_device_plug(GUdevDevice *device)
+static void handle_device_plug(struct udev_device *udevice)
+{
+ struct btd_adapter *adapter;
+ int adapter_id;
@ -330,11 +344,11 @@ index 0000000..6e81ba0
+ struct libusb_device_descriptor desc;
+ guint8 j;
+
+ if (g_udev_device_has_property(device, "ID_SERIAL") == FALSE ||
+ g_strcmp0(g_udev_device_get_property(device, "ID_SERIAL"), "Sony_PLAYSTATION_R_3_Controller") != 0)
+ if (g_strcmp0(udev_device_get_property_value(udevice, "ID_SERIAL"),
+ "Sony_PLAYSTATION_R_3_Controller") != 0)
+ return;
+ /* Don't look at events with an associated driver */
+ if (g_udev_device_has_property(device, "ID_USB_DRIVER") != FALSE)
+ if (udev_device_get_property_value(udevice, "ID_USB_DRIVER") != NULL)
+ return;
+
+ debug("Found Sixaxis device");
@ -365,7 +379,7 @@ index 0000000..6e81ba0
+ path = g_strdup_printf("%s/%03d/%03d", "/dev/bus/usb",
+ libusb_get_bus_number(list[i]),
+ libusb_get_device_address(list[i]));
+ if (g_strcmp0(path, g_udev_device_get_device_file(device)) == 0) {
+ if (g_strcmp0(path, udev_device_get_devnode(udevice)) == 0) {
+ g_free(path);
+ usbdev = libusb_ref_device(list[i]);
+ break;
@ -415,45 +429,58 @@ index 0000000..6e81ba0
+ libusb_exit(NULL);
+}
+
+static gboolean device_event_idle(GUdevDevice *device)
+static gboolean device_event_idle(struct udev_device *udevice)
+{
+ handle_device_plug(device);
+ g_object_unref (device);
+ handle_device_plug(udevice);
+ udev_device_unref(udevice);
+ return FALSE;
+}
+
+static void uevent_cb(GUdevClient *client,
+ const char *action,
+ GUdevDevice *device,
+ gpointer user_data)
+static struct udev *ctx = NULL;
+static struct udev_monitor *monitor = NULL;
+static guint watch_id = 0;
+
+static gboolean
+monitor_event(GIOChannel *source,
+ GIOCondition condition,
+ gpointer data)
+{
+ if (g_strcmp0(action, "add") == 0) {
+ /* FIXME:
+ * This happens because we need to wait for the
+ * device node to be created by udev,
+ * we should really just call: handle_device_plug(device); */
+ g_object_ref(device);
+ g_timeout_add_seconds(1, (GSourceFunc) device_event_idle, device);
+ }
+ struct udev_device *udevice;
+
+ udevice = udev_monitor_receive_device(monitor);
+ if (udevice == NULL)
+ goto out;
+ if (g_strcmp0(udev_device_get_action(udevice), "add") != 0)
+ goto out;
+
+ g_timeout_add_seconds(1, (GSourceFunc) device_event_idle, udevice);
+
+out:
+ return TRUE;
+}
+
+GUdevClient *client = NULL;
+
+static int cable_init(void)
+{
+ const char * subsystems[] = { "usb", NULL };
+ GIOChannel *channel;
+
+ debug("Setup cable plugin");
+
+ g_type_init();
+ ctx = udev_new();
+ monitor = udev_monitor_new_from_netlink(ctx, "udev");
+ if (monitor == NULL) {
+ error ("Could not get udev monitor");
+ return -1;
+ }
+
+ client = g_udev_client_new(subsystems);
+ /* Listen for newly connected usb device */
+ udev_monitor_filter_add_match_subsystem_devtype(monitor,
+ "usb", NULL);
+ udev_monitor_enable_receiving(monitor);
+
+ /* Listen for newly connected devices */
+ g_signal_connect(G_OBJECT(client),
+ "uevent",
+ G_CALLBACK(uevent_cb),
+ NULL);
+ channel = g_io_channel_unix_new(udev_monitor_get_fd(monitor));
+ watch_id = g_io_add_watch(channel, G_IO_IN, monitor_event, NULL);
+ g_io_channel_unref(channel);
+
+ return 0;
+}
@ -462,9 +489,17 @@ index 0000000..6e81ba0
+{
+ debug("Cleanup cable plugin");
+
+ if (client != NULL) {
+ g_object_unref(client);
+ client = NULL;
+ if (watch_id != 0) {
+ g_source_remove(watch_id);
+ watch_id = 0;
+ }
+ if (monitor != NULL) {
+ udev_monitor_unref(monitor);
+ monitor = NULL;
+ }
+ if (ctx != NULL) {
+ udev_unref(ctx);
+ ctx = NULL;
+ }
+}
+

View File

@ -1,7 +1,7 @@
Summary: Bluetooth utilities
Name: bluez
Version: 4.55
Release: 1%{?dist}
Release: 2%{?dist}
License: GPLv2+
Group: Applications/System
Source: http://www.kernel.org/pub/linux/bluetooth/%{name}-%{version}.tar.gz
@ -34,7 +34,7 @@ BuildRequires: gstreamer-plugins-base-devel, gstreamer-devel
BuildRequires: libsndfile-devel
BuildRequires: libcap-ng-devel
# For cable pairing
BuildRequires: libgudev-devel
BuildRequires: libudev-devel
%ifnarch s390 s390x
BuildRequires: libusb1-devel
%endif
@ -272,6 +272,9 @@ fi
%config(noreplace) %{_sysconfdir}/sysconfig/pand
%changelog
* Fri Oct 09 2009 Bastien Nocera <bnocera@redhat.com> 4.55-2
- Update cable pairing plugin to use libudev
* Mon Oct 05 2009 Bastien Nocera <bnocera@redhat.com> 4.55-1
- Update to 4.55
- Add libcap-ng support to drop capabilities (#517660)