- Update cable pairing plugin to use libudev
This commit is contained in:
		
							parent
							
								
									c7a736cb45
								
							
						
					
					
						commit
						d02faea259
					
				| @ -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;
 | ||||
| +	}
 | ||||
| +}
 | ||||
| +
 | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user