Drop most BlueZ 4 patches
... in preparation for rebasing to BlueZ 5. https://bugzilla.redhat.com/show_bug.cgi?id=974145
This commit is contained in:
parent
f62c1803a5
commit
34d6c0af39
@ -1,25 +0,0 @@
|
||||
From 9c6f914530c3873e88b55e3f7c18ce2b8b533e20 Mon Sep 17 00:00:00 2001
|
||||
From: Bastien Nocera <hadess@hadess.net>
|
||||
Date: Thu, 10 Jan 2013 09:14:33 +0100
|
||||
Subject: [PATCH] Activate the Socket Mobile CF kit
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=498756
|
||||
---
|
||||
scripts/bluetooth-serial.rules | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/scripts/bluetooth-serial.rules b/scripts/bluetooth-serial.rules
|
||||
index 072335f..f6284ff 100644
|
||||
--- a/scripts/bluetooth-serial.rules
|
||||
+++ b/scripts/bluetooth-serial.rules
|
||||
@@ -33,3 +33,7 @@ SUBSYSTEM=="tty", SUBSYSTEMS=="pcmcia", ATTRS{prod_id1}=="PCMCIA", ATTRS{prod_id
|
||||
|
||||
# CC&C BT0100M
|
||||
SUBSYSTEM=="tty", SUBSYSTEMS=="pcmcia", ATTRS{prod_id1}=="Bluetooth BT0100M", ENV{HCIOPTS}="bcsp 115200", RUN+="bluetooth_serial"
|
||||
+
|
||||
+# SocketMobile CF Connection Kit
|
||||
+SUBSYSTEM=="tty", SUBSYSTEMS=="pcmcia", ATTRS{prod_id1}=="Socket", ATTRS{prod_id2}=="CF+ Personal Network Card Rev 2.5", ENV{HCIOPTS}="socket", RUN+="bluetooth_serial"
|
||||
+
|
||||
--
|
||||
1.8.0.1
|
||||
|
@ -1,631 +0,0 @@
|
||||
From 03827726cebf7d8b5bc5a4e7859ea92a7e62044f Mon Sep 17 00:00:00 2001
|
||||
From: Bastien Nocera <hadess@hadess.net>
|
||||
Date: Fri, 30 Dec 2011 12:34:29 +0100
|
||||
Subject: [PATCH] Add sixaxis cable-pairing plugin
|
||||
|
||||
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 +-
|
||||
acinclude.m4 | 16 +++
|
||||
configure.ac | 1 +
|
||||
plugins/cable.c | 382 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
src/adapter.c | 19 +++
|
||||
src/adapter.h | 3 +
|
||||
src/device.c | 37 ++++--
|
||||
src/device.h | 2 +
|
||||
8 files changed, 456 insertions(+), 13 deletions(-)
|
||||
create mode 100644 plugins/cable.c
|
||||
|
||||
diff --git a/Makefile.am b/Makefile.am
|
||||
index 1c214c6..c70ff24 100644
|
||||
--- a/Makefile.am
|
||||
+++ b/Makefile.am
|
||||
@@ -238,6 +238,11 @@ builtin_sources += thermometer/main.c \
|
||||
endif
|
||||
|
||||
|
||||
+if CABLE
|
||||
+builtin_modules += cable
|
||||
+builtin_sources += plugins/cable.c
|
||||
+endif
|
||||
+
|
||||
builtin_modules += hciops mgmtops
|
||||
builtin_sources += plugins/hciops.c plugins/mgmtops.c
|
||||
|
||||
@@ -306,7 +311,7 @@ src_bluetoothd_SOURCES = $(gdbus_sources) $(builtin_sources) \
|
||||
src/event.h src/event.c \
|
||||
src/oob.h src/oob.c src/eir.h src/eir.c
|
||||
src_bluetoothd_LDADD = lib/libbluetooth-private.la @GLIB_LIBS@ @DBUS_LIBS@ \
|
||||
- -ldl -lrt
|
||||
+ @CABLE_LIBS@ -ldl -lrt
|
||||
src_bluetoothd_LDFLAGS = $(AM_LDFLAGS) -Wl,--export-dynamic \
|
||||
-Wl,--version-script=$(srcdir)/src/bluetooth.ver
|
||||
|
||||
@@ -428,7 +433,7 @@ EXTRA_DIST += doc/manager-api.txt \
|
||||
|
||||
AM_YFLAGS = -d
|
||||
|
||||
-AM_CFLAGS += @DBUS_CFLAGS@ @GLIB_CFLAGS@
|
||||
+AM_CFLAGS += @DBUS_CFLAGS@ @GLIB_CFLAGS@ @CABLE_CFLAGS@
|
||||
|
||||
INCLUDES = -I$(builddir)/lib -I$(builddir)/src -I$(srcdir)/src \
|
||||
-I$(srcdir)/audio -I$(srcdir)/sbc -I$(srcdir)/gdbus \
|
||||
diff --git a/acinclude.m4 b/acinclude.m4
|
||||
index 1d6d736..ae58bbd 100644
|
||||
--- a/acinclude.m4
|
||||
+++ b/acinclude.m4
|
||||
@@ -139,6 +139,12 @@ AC_DEFUN([AC_PATH_UDEV], [
|
||||
AC_SUBST(UDEV_LIBS)
|
||||
])
|
||||
|
||||
+AC_DEFUN([AC_PATH_CABLE], [
|
||||
+ PKG_CHECK_MODULES(CABLE, libudev libusb-1.0, cable_found=yes, cable_found=no)
|
||||
+ AC_SUBST(CABLE_CFLAGS)
|
||||
+ AC_SUBST(CABLE_LIBS)
|
||||
+])
|
||||
+
|
||||
AC_DEFUN([AC_PATH_SNDFILE], [
|
||||
PKG_CHECK_MODULES(SNDFILE, sndfile, sndfile_found=yes, sndfile_found=no)
|
||||
AC_SUBST(SNDFILE_CFLAGS)
|
||||
@@ -176,6 +182,7 @@ AC_DEFUN([AC_ARG_BLUEZ], [
|
||||
sndfile_enable=${sndfile_found}
|
||||
hal_enable=no
|
||||
usb_enable=${usb_found}
|
||||
+ cable_enable=${cable_found}
|
||||
alsa_enable=${alsa_found}
|
||||
gstreamer_enable=${gstreamer_found}
|
||||
audio_enable=yes
|
||||
@@ -265,6 +272,10 @@ AC_DEFUN([AC_ARG_BLUEZ], [
|
||||
usb_enable=${enableval}
|
||||
])
|
||||
|
||||
+ AC_ARG_ENABLE(cable, AC_HELP_STRING([--enable-cable], [enable DeviceKit support]), [
|
||||
+ cable_enable=${enableval}
|
||||
+ ])
|
||||
+
|
||||
AC_ARG_ENABLE(tools, AC_HELP_STRING([--enable-tools], [install Bluetooth utilities]), [
|
||||
tools_enable=${enableval}
|
||||
])
|
||||
@@ -366,6 +377,10 @@ AC_DEFUN([AC_ARG_BLUEZ], [
|
||||
AC_DEFINE(HAVE_LIBUSB, 1, [Define to 1 if you have USB library.])
|
||||
fi
|
||||
|
||||
+ if (test "${cable_enable}" = "yes" && test "${cable_found}" = "yes"); then
|
||||
+ AC_DEFINE(HAVE_CABLE, 1, [Define to 1 if you have libcable.])
|
||||
+ fi
|
||||
+
|
||||
AM_CONDITIONAL(SNDFILE, test "${sndfile_enable}" = "yes" && test "${sndfile_found}" = "yes")
|
||||
AM_CONDITIONAL(USB, test "${usb_enable}" = "yes" && test "${usb_found}" = "yes")
|
||||
AM_CONDITIONAL(SBC, test "${alsa_enable}" = "yes" || test "${gstreamer_enable}" = "yes" ||
|
||||
@@ -398,4 +413,5 @@ AC_DEFUN([AC_ARG_BLUEZ], [
|
||||
AM_CONDITIONAL(DBUSOOBPLUGIN, test "${dbusoob_enable}" = "yes")
|
||||
AM_CONDITIONAL(WIIMOTEPLUGIN, test "${wiimote_enable}" = "yes")
|
||||
AM_CONDITIONAL(GATTMODULES, test "${gatt_enable}" = "yes")
|
||||
+ AM_CONDITIONAL(CABLE, test "${cable_enable}" = "yes" && test "${cable_found}" = "yes")
|
||||
])
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index f2db920..8e7ad79 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -46,6 +46,7 @@ AC_PATH_GSTREAMER
|
||||
AC_PATH_USB
|
||||
AC_PATH_UDEV
|
||||
AC_PATH_SNDFILE
|
||||
+AC_PATH_CABLE
|
||||
AC_PATH_OUI
|
||||
AC_PATH_READLINE
|
||||
AC_PATH_CHECK
|
||||
diff --git a/plugins/cable.c b/plugins/cable.c
|
||||
new file mode 100644
|
||||
index 0000000..89333c4
|
||||
--- /dev/null
|
||||
+++ b/plugins/cable.c
|
||||
@@ -0,0 +1,382 @@
|
||||
+/*
|
||||
+ *
|
||||
+ * BlueZ - Bluetooth protocol stack for Linux
|
||||
+ *
|
||||
+ * Copyright (C) 2009 Bastien Nocera <hadess@hadess.net>
|
||||
+ *
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License as published by
|
||||
+ * the Free Software Foundation; either version 2 of the License, or
|
||||
+ * (at your option) any later version.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License
|
||||
+ * along with this program; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+#ifdef HAVE_CONFIG_H
|
||||
+#include <config.h>
|
||||
+#endif
|
||||
+
|
||||
+#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>
|
||||
+#include <libusb.h>
|
||||
+
|
||||
+#include "plugin.h"
|
||||
+#include "log.h"
|
||||
+
|
||||
+#include "adapter.h"
|
||||
+#include "manager.h"
|
||||
+#include "device.h"
|
||||
+
|
||||
+#include "storage.h"
|
||||
+#include "sdp_lib.h"
|
||||
+
|
||||
+/* Vendor and product ID for the Sixaxis PS3 controller */
|
||||
+#define VENDOR 0x054c
|
||||
+#define PRODUCT 0x0268
|
||||
+#define SIXAXIS_PNP_RECORD "3601920900000A000100000900013503191124090004350D35061901000900113503190011090006350909656E09006A0901000900093508350619112409010009000D350F350D350619010009001335031900110901002513576972656C65737320436F6E74726F6C6C65720901012513576972656C65737320436F6E74726F6C6C6572090102251B536F6E7920436F6D707574657220456E7465727461696E6D656E740902000901000902010901000902020800090203082109020428010902052801090206359A35980822259405010904A101A102850175089501150026FF00810375019513150025013500450105091901291381027501950D0600FF8103150026FF0005010901A10075089504350046FF0009300931093209358102C0050175089527090181027508953009019102750895300901B102C0A1028502750895300901B102C0A10285EE750895300901B102C0A10285EF750895300901B102C0C0090207350835060904090901000902082800090209280109020A280109020B09010009020C093E8009020D280009020E2800"
|
||||
+#define HID_UUID "00001124-0000-1000-8000-00805f9b34fb"
|
||||
+
|
||||
+static struct btd_device *create_cable_association(DBusConnection *conn,
|
||||
+ struct btd_adapter *adapter,
|
||||
+ const char *name,
|
||||
+ const char *address,
|
||||
+ guint32 vendor_id,
|
||||
+ guint32 product_id,
|
||||
+ const char *pnp_record)
|
||||
+{
|
||||
+ sdp_record_t *rec;
|
||||
+ struct btd_device *device;
|
||||
+ bdaddr_t src, dst;
|
||||
+ char srcaddr[18];
|
||||
+
|
||||
+ device = adapter_find_device(adapter, address);
|
||||
+ if (device == NULL) {
|
||||
+ device = device_create(conn, adapter, address, BDADDR_BREDR);
|
||||
+ if (device != NULL)
|
||||
+ adapter_create_device_for_device(conn, adapter, device);
|
||||
+ }
|
||||
+ if (device != NULL) {
|
||||
+ device_set_temporary(device, FALSE);
|
||||
+ device_set_name(device, name);
|
||||
+ }
|
||||
+
|
||||
+ str2ba(address, &dst);
|
||||
+ adapter_get_address(adapter, &src);
|
||||
+ ba2str(&src, srcaddr);
|
||||
+
|
||||
+ write_device_name(&dst, &src, (char *) name);
|
||||
+
|
||||
+ /* Store the device's SDP record */
|
||||
+ rec = record_from_string(pnp_record);
|
||||
+ store_record(srcaddr, address, rec);
|
||||
+ sdp_record_free(rec);
|
||||
+ /* Set the device id */
|
||||
+ store_device_id(srcaddr, address, 0xffff, vendor_id, product_id, 0);
|
||||
+ /* Don't write a profile, it will be updated when the device connects */
|
||||
+
|
||||
+ device_set_trust (conn, device, TRUE);
|
||||
+
|
||||
+ return device;
|
||||
+}
|
||||
+
|
||||
+static char *get_bdaddr(libusb_device_handle *devh, int itfnum)
|
||||
+{
|
||||
+ unsigned char msg[17];
|
||||
+ char *address;
|
||||
+ int res;
|
||||
+
|
||||
+ res = libusb_control_transfer(devh,
|
||||
+ LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
|
||||
+ 0x01, 0x03f2, itfnum,
|
||||
+ (void*) msg, sizeof(msg),
|
||||
+ 5000);
|
||||
+
|
||||
+ if (res < 0) {
|
||||
+ DBG("Getting the device Bluetooth address failed");
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ address = g_strdup_printf("%02X:%02X:%02X:%02X:%02X:%02X",
|
||||
+ msg[4], msg[5], msg[6], msg[7], msg[8], msg[9]);
|
||||
+
|
||||
+ DBG("Device Bluetooth address: %s\n", address);
|
||||
+
|
||||
+ return address;
|
||||
+}
|
||||
+
|
||||
+static gboolean set_master_bdaddr(libusb_device_handle *devh, int itfnum, char *host)
|
||||
+{
|
||||
+ unsigned char msg[8];
|
||||
+ int mac[6];
|
||||
+ int res;
|
||||
+
|
||||
+ if (sscanf(host, "%X:%X:%X:%X:%X:%X",
|
||||
+ &mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]) != 6) {
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ msg[0] = 0x01;
|
||||
+ msg[1] = 0x00;
|
||||
+ msg[2] = mac[0];
|
||||
+ msg[3] = mac[1];
|
||||
+ msg[4] = mac[2];
|
||||
+ msg[5] = mac[3];
|
||||
+ msg[6] = mac[4];
|
||||
+ msg[7] = mac[5];
|
||||
+
|
||||
+ res = libusb_control_transfer(devh,
|
||||
+ LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
|
||||
+ 0x09, 0x03f5, itfnum,
|
||||
+ (void*) msg, sizeof(msg),
|
||||
+ 5000);
|
||||
+
|
||||
+ if (res < 0) {
|
||||
+ DBG("Setting the master Bluetooth address failed");
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
+static void handle_usb_device(struct btd_adapter *adapter,
|
||||
+ libusb_device *dev,
|
||||
+ struct libusb_config_descriptor *cfg,
|
||||
+ int itfnum,
|
||||
+ const struct libusb_interface_descriptor *alt)
|
||||
+{
|
||||
+ DBusConnection *conn;
|
||||
+ libusb_device_handle *devh;
|
||||
+ char *device_bdaddr;
|
||||
+ char adapter_bdaddr[18];
|
||||
+ struct btd_device *device;
|
||||
+ bdaddr_t dst;
|
||||
+
|
||||
+ device_bdaddr = NULL;
|
||||
+ conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
|
||||
+ if (conn == NULL) {
|
||||
+ DBG("Failed to get on the bus");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (libusb_open(dev, &devh) < 0) {
|
||||
+ DBG("Can't open device");
|
||||
+ goto bail;
|
||||
+ }
|
||||
+ libusb_detach_kernel_driver(devh, itfnum);
|
||||
+
|
||||
+ if (libusb_claim_interface(devh, itfnum) < 0) {
|
||||
+ DBG("Can't claim interface %d", itfnum);
|
||||
+ goto bail;
|
||||
+ }
|
||||
+
|
||||
+ device_bdaddr = get_bdaddr(devh, itfnum);
|
||||
+ if (device_bdaddr == NULL) {
|
||||
+ DBG("Failed to get the Bluetooth address from the device");
|
||||
+ goto bail;
|
||||
+ }
|
||||
+
|
||||
+ device = create_cable_association(conn,
|
||||
+ adapter,
|
||||
+ "PLAYSTATION(R)3 Controller",
|
||||
+ device_bdaddr,
|
||||
+ VENDOR, PRODUCT, SIXAXIS_PNP_RECORD);
|
||||
+ btd_device_add_uuid(device, HID_UUID);
|
||||
+
|
||||
+ adapter_get_address(adapter, &dst);
|
||||
+ ba2str(&dst, adapter_bdaddr);
|
||||
+ DBG("Adapter bdaddr %s", adapter_bdaddr);
|
||||
+
|
||||
+ if (set_master_bdaddr(devh, itfnum, adapter_bdaddr) == FALSE) {
|
||||
+ DBG("Failed to set the master Bluetooth address");
|
||||
+ goto bail;
|
||||
+ }
|
||||
+
|
||||
+bail:
|
||||
+ dbus_connection_unref(conn);
|
||||
+ g_free(device_bdaddr);
|
||||
+ libusb_release_interface(devh, itfnum);
|
||||
+ /* We ignore errors from the reattach, as there's nothing we
|
||||
+ * can do about it */
|
||||
+ libusb_attach_kernel_driver(devh, itfnum);
|
||||
+ if (devh != NULL)
|
||||
+ libusb_close(devh);
|
||||
+}
|
||||
+
|
||||
+static void handle_device_plug(struct udev_device *udevice)
|
||||
+{
|
||||
+ struct btd_adapter *adapter;
|
||||
+ guint i;
|
||||
+
|
||||
+ libusb_device **list, *usbdev;
|
||||
+ ssize_t num_devices;
|
||||
+ struct libusb_device_descriptor desc;
|
||||
+ guint8 j;
|
||||
+
|
||||
+ 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 (udev_device_get_property_value(udevice, "ID_USB_DRIVER") != NULL)
|
||||
+ return;
|
||||
+
|
||||
+ DBG("Found Sixaxis device");
|
||||
+
|
||||
+ /* Look for the default adapter */
|
||||
+ adapter = manager_get_default_adapter();
|
||||
+ if (adapter == NULL)
|
||||
+ return;
|
||||
+
|
||||
+ /* Look for the USB device */
|
||||
+ libusb_init(NULL);
|
||||
+
|
||||
+ num_devices = libusb_get_device_list(NULL, &list);
|
||||
+ if (num_devices < 0) {
|
||||
+ DBG("libusb_get_device_list failed");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ usbdev = NULL;
|
||||
+ for (i = 0; i < num_devices; i++) {
|
||||
+ char *path;
|
||||
+
|
||||
+ 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, udev_device_get_devnode(udevice)) == 0) {
|
||||
+ g_free(path);
|
||||
+ usbdev = libusb_ref_device(list[i]);
|
||||
+ break;
|
||||
+ }
|
||||
+ g_free(path);
|
||||
+ }
|
||||
+
|
||||
+ libusb_free_device_list(list, TRUE);
|
||||
+ if (usbdev == NULL) {
|
||||
+ DBG("Found a Sixaxis, but couldn't find it via libusb");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (libusb_get_device_descriptor(usbdev, &desc) < 0) {
|
||||
+ DBG("libusb_get_device_descriptor() failed");
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ /* Look for the interface number that interests us */
|
||||
+ for (j = 0; j < desc.bNumConfigurations; j++) {
|
||||
+ struct libusb_config_descriptor *config;
|
||||
+ guint8 k;
|
||||
+
|
||||
+ if (libusb_get_config_descriptor(usbdev, j, &config) < 0) {
|
||||
+ DBG("Failed to get config descriptor %d", j);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ for (k = 0; k < config->bNumInterfaces; k++) {
|
||||
+ const struct libusb_interface *itf = &config->interface[k];
|
||||
+ int l;
|
||||
+
|
||||
+ for (l = 0; l < itf->num_altsetting ; l++) {
|
||||
+ struct libusb_interface_descriptor alt;
|
||||
+
|
||||
+ alt = itf->altsetting[l];
|
||||
+ if (alt.bInterfaceClass == 3) {
|
||||
+ handle_usb_device(adapter, usbdev, config, l, &alt);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+out:
|
||||
+ if (usbdev != NULL)
|
||||
+ libusb_unref_device(usbdev);
|
||||
+ libusb_exit(NULL);
|
||||
+}
|
||||
+
|
||||
+static gboolean device_event_idle(struct udev_device *udevice)
|
||||
+{
|
||||
+ handle_device_plug(udevice);
|
||||
+ udev_device_unref(udevice);
|
||||
+ return FALSE;
|
||||
+}
|
||||
+
|
||||
+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)
|
||||
+{
|
||||
+ 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;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static int cable_init(void)
|
||||
+{
|
||||
+ GIOChannel *channel;
|
||||
+
|
||||
+ DBG("Setup cable plugin");
|
||||
+
|
||||
+ ctx = udev_new();
|
||||
+ monitor = udev_monitor_new_from_netlink(ctx, "udev");
|
||||
+ if (monitor == NULL) {
|
||||
+ error ("Could not get udev monitor");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ /* Listen for newly connected usb device */
|
||||
+ udev_monitor_filter_add_match_subsystem_devtype(monitor,
|
||||
+ "usb", 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_event, NULL);
|
||||
+ g_io_channel_unref(channel);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void cable_exit(void)
|
||||
+{
|
||||
+ DBG("Cleanup cable plugin");
|
||||
+
|
||||
+ 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;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+BLUETOOTH_PLUGIN_DEFINE(cable, VERSION,
|
||||
+ BLUETOOTH_PLUGIN_PRIORITY_DEFAULT, cable_init, cable_exit)
|
||||
diff --git a/src/adapter.c b/src/adapter.c
|
||||
index f922876..b688642 100644
|
||||
--- a/src/adapter.c
|
||||
+++ b/src/adapter.c
|
||||
@@ -952,6 +952,25 @@ static struct btd_device *adapter_create_device(DBusConnection *conn,
|
||||
return device;
|
||||
}
|
||||
|
||||
+void adapter_create_device_for_device(DBusConnection *conn,
|
||||
+ struct btd_adapter *adapter,
|
||||
+ struct btd_device *device)
|
||||
+{
|
||||
+ const char *path;
|
||||
+
|
||||
+ device_set_temporary(device, TRUE);
|
||||
+
|
||||
+ adapter->devices = g_slist_append(adapter->devices, device);
|
||||
+
|
||||
+ path = device_get_path(device);
|
||||
+ g_dbus_emit_signal(conn, adapter->path,
|
||||
+ ADAPTER_INTERFACE, "DeviceCreated",
|
||||
+ DBUS_TYPE_OBJECT_PATH, &path,
|
||||
+ DBUS_TYPE_INVALID);
|
||||
+
|
||||
+ adapter_update_devices(adapter);
|
||||
+}
|
||||
+
|
||||
void adapter_remove_device(DBusConnection *conn, struct btd_adapter *adapter,
|
||||
struct btd_device *device,
|
||||
gboolean remove_storage)
|
||||
diff --git a/src/adapter.h b/src/adapter.h
|
||||
index b7ea62b..ac0aa2e 100644
|
||||
--- a/src/adapter.h
|
||||
+++ b/src/adapter.h
|
||||
@@ -114,6 +114,9 @@ void adapter_update_found_devices(struct btd_adapter *adapter,
|
||||
uint8_t *data, uint8_t data_len);
|
||||
void adapter_emit_device_found(struct btd_adapter *adapter,
|
||||
struct remote_dev_info *dev);
|
||||
+void adapter_create_device_for_device(DBusConnection *conn,
|
||||
+ struct btd_adapter *adapter,
|
||||
+ struct btd_device *device);
|
||||
void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode);
|
||||
int adapter_set_name(struct btd_adapter *adapter, const char *name);
|
||||
void adapter_name_changed(struct btd_adapter *adapter, const char *name);
|
||||
diff --git a/src/device.c b/src/device.c
|
||||
index c210bcb..056b450 100644
|
||||
--- a/src/device.c
|
||||
+++ b/src/device.c
|
||||
@@ -471,31 +471,46 @@ static DBusMessage *set_alias(DBusConnection *conn, DBusMessage *msg,
|
||||
return dbus_message_new_method_return(msg);
|
||||
}
|
||||
|
||||
-static DBusMessage *set_trust(DBusConnection *conn, DBusMessage *msg,
|
||||
- gboolean value, void *data)
|
||||
+int device_set_trust (DBusConnection *conn, struct btd_device *device,
|
||||
+ gboolean trusted)
|
||||
{
|
||||
- struct btd_device *device = data;
|
||||
struct btd_adapter *adapter = device->adapter;
|
||||
char srcaddr[18], dstaddr[18];
|
||||
bdaddr_t src;
|
||||
int err;
|
||||
|
||||
- if (device->trusted == value)
|
||||
- return dbus_message_new_method_return(msg);
|
||||
-
|
||||
adapter_get_address(adapter, &src);
|
||||
ba2str(&src, srcaddr);
|
||||
ba2str(&device->bdaddr, dstaddr);
|
||||
|
||||
- err = write_trust(srcaddr, dstaddr, GLOBAL_TRUST, value);
|
||||
+ err = write_trust(srcaddr, dstaddr, GLOBAL_TRUST, trusted);
|
||||
if (err < 0)
|
||||
- return btd_error_failed(msg, strerror(-err));
|
||||
+ return err;
|
||||
|
||||
- device->trusted = value;
|
||||
+ device->trusted = trusted;
|
||||
|
||||
- emit_property_changed(conn, dbus_message_get_path(msg),
|
||||
+ emit_property_changed(conn, device->path,
|
||||
DEVICE_INTERFACE, "Trusted",
|
||||
- DBUS_TYPE_BOOLEAN, &value);
|
||||
+ DBUS_TYPE_BOOLEAN, &trusted);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static DBusMessage *set_trust(DBusConnection *conn, DBusMessage *msg,
|
||||
+ gboolean value, void *data)
|
||||
+{
|
||||
+ struct btd_device *device = data;
|
||||
+ struct btd_adapter *adapter = device->adapter;
|
||||
+ char srcaddr[18], dstaddr[18];
|
||||
+ bdaddr_t src;
|
||||
+ int err;
|
||||
+
|
||||
+ if (device->trusted == value)
|
||||
+ return dbus_message_new_method_return(msg);
|
||||
+
|
||||
+ err = device_set_trust (conn, device, value);
|
||||
+ if (err < 0)
|
||||
+ return btd_error_failed(msg, strerror(-err));
|
||||
|
||||
return dbus_message_new_method_return(msg);
|
||||
}
|
||||
diff --git a/src/device.h b/src/device.h
|
||||
index 26e17f7..0d5e5ce 100644
|
||||
--- a/src/device.h
|
||||
+++ b/src/device.h
|
||||
@@ -119,6 +119,8 @@ void btd_unregister_device_driver(struct btd_device_driver *driver);
|
||||
struct btd_device *btd_device_ref(struct btd_device *device);
|
||||
void btd_device_unref(struct btd_device *device);
|
||||
|
||||
+int device_set_trust(DBusConnection *conn, struct btd_device *device,
|
||||
+ gboolean trusted);
|
||||
int device_block(DBusConnection *conn, struct btd_device *device,
|
||||
gboolean update_only);
|
||||
int device_unblock(DBusConnection *conn, struct btd_device *device,
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -1,28 +0,0 @@
|
||||
From dcbeaaa74020031741ad3727e651cdd2d00c773f Mon Sep 17 00:00:00 2001
|
||||
From: Luke Hutchison <luke.hutch@gmail.com>
|
||||
Date: Thu, 10 Jan 2013 09:13:19 +0100
|
||||
Subject: [PATCH] Allow PulseAudio to connect by default
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=874015#c0
|
||||
---
|
||||
audio/audio.conf | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/audio/audio.conf b/audio/audio.conf
|
||||
index fd6092a..9a80e63 100644
|
||||
--- a/audio/audio.conf
|
||||
+++ b/audio/audio.conf
|
||||
@@ -4,6 +4,10 @@
|
||||
# particular interface
|
||||
[General]
|
||||
|
||||
+# Allow PulseAudio to connect by default
|
||||
+# https://bugzilla.redhat.com/show_bug.cgi?id=964031
|
||||
+Disable=Socket
|
||||
+
|
||||
# Switch to master role for incoming connections (defaults to true)
|
||||
#Master=true
|
||||
|
||||
--
|
||||
1.8.0.1
|
||||
|
@ -1,46 +0,0 @@
|
||||
From 0b5f5d0be6a1c9aa2d63e72e6a979f46cfbcc866 Mon Sep 17 00:00:00 2001
|
||||
From: Mathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
|
||||
Date: Thu, 10 Jan 2013 09:20:22 +0100
|
||||
Subject: [PATCH] Enable the Gateway and Source audio profiles by default.
|
||||
|
||||
Those can be disabled by the user in /etc/bluetooth/audio.conf if
|
||||
necessary.
|
||||
|
||||
https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/948613
|
||||
---
|
||||
audio/a2dp.c | 2 +-
|
||||
audio/manager.c | 4 ++--
|
||||
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/audio/a2dp.c b/audio/a2dp.c
|
||||
index 404be53..6c0ab26 100644
|
||||
--- a/audio/a2dp.c
|
||||
+++ b/audio/a2dp.c
|
||||
@@ -1444,7 +1444,7 @@ int a2dp_register(DBusConnection *conn, const bdaddr_t *src, GKeyFile *config)
|
||||
{
|
||||
int sbc_srcs = 0, sbc_sinks = 0;
|
||||
int mpeg12_srcs = 0, mpeg12_sinks = 0;
|
||||
- gboolean source = TRUE, sink = FALSE, socket = FALSE;
|
||||
+ gboolean source = TRUE, sink = TRUE, socket = TRUE;
|
||||
gboolean delay_reporting = FALSE;
|
||||
char *str;
|
||||
GError *err = NULL;
|
||||
diff --git a/audio/manager.c b/audio/manager.c
|
||||
index d442d1d..99e03bb 100644
|
||||
--- a/audio/manager.c
|
||||
+++ b/audio/manager.c
|
||||
@@ -110,9 +110,9 @@ static GSList *devices = NULL;
|
||||
static struct enabled_interfaces enabled = {
|
||||
.hfp = TRUE,
|
||||
.headset = TRUE,
|
||||
- .gateway = FALSE,
|
||||
+ .gateway = TRUE,
|
||||
.sink = TRUE,
|
||||
- .source = FALSE,
|
||||
+ .source = TRUE,
|
||||
.control = TRUE,
|
||||
.socket = FALSE,
|
||||
.media = TRUE,
|
||||
--
|
||||
1.8.0.1
|
||||
|
@ -1,84 +0,0 @@
|
||||
From a66a557038c0e3d21bc4f14090efb497558a12be Mon Sep 17 00:00:00 2001
|
||||
From: Lucas De Marchi <lucas.demarchi@profusion.mobi>
|
||||
Date: Tue, 26 Jun 2012 18:11:25 -0300
|
||||
Subject: [PATCH] Fix GDBus flags after conversion to macros
|
||||
|
||||
Commit "aa3b9016bf444b60e1b7e1804dfc323a23a93c5a Convert GDBus methods
|
||||
to use macro helpers" converted the previous tables to use the new
|
||||
macros but some flags were lost.
|
||||
---
|
||||
attrib/client.c | 2 +-
|
||||
audio/control.c | 2 +-
|
||||
audio/headset.c | 2 +-
|
||||
audio/transport.c | 2 +-
|
||||
src/manager.c | 2 +-
|
||||
5 files changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/attrib/client.c b/attrib/client.c
|
||||
index 8d119df..b3e3abe 100644
|
||||
--- a/attrib/client.c
|
||||
+++ b/attrib/client.c
|
||||
@@ -519,7 +519,7 @@ static const GDBusMethodTable char_methods[] = {
|
||||
{ GDBUS_METHOD("GetProperties",
|
||||
NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
|
||||
get_properties) },
|
||||
- { GDBUS_METHOD("SetProperty",
|
||||
+ { GDBUS_ASYNC_METHOD("SetProperty",
|
||||
GDBUS_ARGS({ "name", "s" }, { "value", "v" }), NULL,
|
||||
set_property) },
|
||||
{ }
|
||||
diff --git a/audio/control.c b/audio/control.c
|
||||
index c5a6a58..187f838 100644
|
||||
--- a/audio/control.c
|
||||
+++ b/audio/control.c
|
||||
@@ -198,7 +198,7 @@ static DBusMessage *control_get_properties(DBusConnection *conn,
|
||||
}
|
||||
|
||||
static const GDBusMethodTable control_methods[] = {
|
||||
- { GDBUS_ASYNC_METHOD("IsConnected",
|
||||
+ { GDBUS_DEPRECATED_METHOD("IsConnected",
|
||||
NULL, GDBUS_ARGS({ "connected", "b" }),
|
||||
control_is_connected) },
|
||||
{ GDBUS_METHOD("GetProperties",
|
||||
diff --git a/audio/headset.c b/audio/headset.c
|
||||
index 729e4dc..b9c6265 100644
|
||||
--- a/audio/headset.c
|
||||
+++ b/audio/headset.c
|
||||
@@ -2094,7 +2094,7 @@ static const GDBusMethodTable headset_methods[] = {
|
||||
static const GDBusSignalTable headset_signals[] = {
|
||||
{ GDBUS_DEPRECATED_SIGNAL("Connected", NULL) },
|
||||
{ GDBUS_DEPRECATED_SIGNAL("Disconnected", NULL) },
|
||||
- { GDBUS_DEPRECATED_SIGNAL("AnswerRequested", NULL) },
|
||||
+ { GDBUS_SIGNAL("AnswerRequested", NULL) },
|
||||
{ GDBUS_DEPRECATED_SIGNAL("Stopped", NULL) },
|
||||
{ GDBUS_DEPRECATED_SIGNAL("Playing", NULL) },
|
||||
{ GDBUS_DEPRECATED_SIGNAL("SpeakerGainChanged",
|
||||
diff --git a/audio/transport.c b/audio/transport.c
|
||||
index b015625..832ad2a 100644
|
||||
--- a/audio/transport.c
|
||||
+++ b/audio/transport.c
|
||||
@@ -959,7 +959,7 @@ static const GDBusMethodTable transport_methods[] = {
|
||||
{ GDBUS_ASYNC_METHOD("Release",
|
||||
GDBUS_ARGS({ "access_type", "s" }), NULL,
|
||||
release ) },
|
||||
- { GDBUS_ASYNC_METHOD("SetProperty",
|
||||
+ { GDBUS_METHOD("SetProperty",
|
||||
GDBUS_ARGS({ "name", "s" }, { "value", "v" }),
|
||||
NULL, set_property) },
|
||||
{ },
|
||||
diff --git a/src/manager.c b/src/manager.c
|
||||
index 385354d..7061f64 100644
|
||||
--- a/src/manager.c
|
||||
+++ b/src/manager.c
|
||||
@@ -207,7 +207,7 @@ static const GDBusMethodTable manager_methods[] = {
|
||||
GDBUS_ARGS({ "pattern", "s" }),
|
||||
GDBUS_ARGS({ "adapter", "o" }),
|
||||
find_adapter) },
|
||||
- { GDBUS_ASYNC_METHOD("ListAdapters",
|
||||
+ { GDBUS_DEPRECATED_METHOD("ListAdapters",
|
||||
NULL, GDBUS_ARGS({ "adapters", "ao" }),
|
||||
list_adapters) },
|
||||
{ }
|
||||
--
|
||||
1.8.0.1
|
||||
|
@ -1,51 +0,0 @@
|
||||
From 2f92669697152848f2fae584d45fde5d80ea6eb8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Dalleau?=
|
||||
<frederic.dalleau@linux.intel.com>
|
||||
Date: Fri, 22 Jun 2012 16:11:25 +0200
|
||||
Subject: [PATCH] audio: Permit concurrent use of AG and HF roles
|
||||
|
||||
If a device supports both HF and AG roles, then if a SCO connection
|
||||
related to AG profile happens, the connection is rejected because HF is
|
||||
not connected. One consequence is pulseaudio failing to load bluetooth
|
||||
module.
|
||||
---
|
||||
audio/main.c | 9 +++++++--
|
||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/audio/main.c b/audio/main.c
|
||||
index 5c751af..a48c8b8 100644
|
||||
--- a/audio/main.c
|
||||
+++ b/audio/main.c
|
||||
@@ -102,7 +102,7 @@ static void sco_server_cb(GIOChannel *chan, GError *err, gpointer data)
|
||||
if (device->headset) {
|
||||
if (headset_get_state(device) < HEADSET_STATE_CONNECTED) {
|
||||
DBG("Refusing SCO from non-connected headset");
|
||||
- goto drop;
|
||||
+ goto gateway;
|
||||
}
|
||||
|
||||
if (!headset_get_hfp_active(device)) {
|
||||
@@ -115,7 +115,11 @@ static void sco_server_cb(GIOChannel *chan, GError *err, gpointer data)
|
||||
goto drop;
|
||||
|
||||
headset_set_state(device, HEADSET_STATE_PLAYING);
|
||||
- } else if (device->gateway) {
|
||||
+ goto connect;
|
||||
+ }
|
||||
+
|
||||
+gateway:
|
||||
+ if (device->gateway) {
|
||||
if (!gateway_is_connected(device)) {
|
||||
DBG("Refusing SCO from non-connected AG");
|
||||
goto drop;
|
||||
@@ -126,6 +130,7 @@ static void sco_server_cb(GIOChannel *chan, GError *err, gpointer data)
|
||||
} else
|
||||
goto drop;
|
||||
|
||||
+connect:
|
||||
sk = g_io_channel_unix_get_fd(chan);
|
||||
fcntl(sk, F_SETFL, 0);
|
||||
|
||||
--
|
||||
1.8.0.1
|
||||
|
@ -1,32 +0,0 @@
|
||||
From d557e0d956d69318664ed5d1c3e4a765da24bc2a Mon Sep 17 00:00:00 2001
|
||||
From: Alexander Holler <holler@ahsoftware.de>
|
||||
Date: Tue, 20 Nov 2012 12:47:08 +0100
|
||||
Subject: [PATCH] hid2hci: change subsystem in udev rule from usb to usb*
|
||||
|
||||
With kernel 3.6 (commit 7e97243c2080ecae7129e83635227fdebd4feef6) the
|
||||
class for some devices (e.g. dongles from Logitech) were changed from
|
||||
usb to usbmisc. As consequence the udev rule for hid2hci didn't work
|
||||
anymore with kernels >= 3.6.
|
||||
|
||||
Changing the subsystem from "usb" to "usb*" matches both "usb" and
|
||||
"usbmisc" and works with all kernels.
|
||||
---
|
||||
scripts/bluetooth-hid2hci.rules | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/scripts/bluetooth-hid2hci.rules b/scripts/bluetooth-hid2hci.rules
|
||||
index 0687c8a..db6bb03 100644
|
||||
--- a/scripts/bluetooth-hid2hci.rules
|
||||
+++ b/scripts/bluetooth-hid2hci.rules
|
||||
@@ -1,7 +1,7 @@
|
||||
# do not edit this file, it will be overwritten on update
|
||||
|
||||
ACTION=="remove", GOTO="hid2hci_end"
|
||||
-SUBSYSTEM!="usb", GOTO="hid2hci_end"
|
||||
+SUBSYSTEM!="usb*", GOTO="hid2hci_end"
|
||||
|
||||
# Variety of Dell Bluetooth devices - match on a mouse device that is
|
||||
# self powered and where a HID report needs to be sent to switch modes
|
||||
--
|
||||
1.8.0
|
||||
|
@ -1,37 +0,0 @@
|
||||
From c70bf65af6e301f18063491b22112300c0fb9b89 Mon Sep 17 00:00:00 2001
|
||||
From: Bastien Nocera <hadess@hadess.net>
|
||||
Date: Sun, 17 Jun 2012 01:25:46 +0200
|
||||
Subject: [PATCH 1/3] input: Add helper function to request disconnect
|
||||
|
||||
---
|
||||
input/device.c | 7 +++++++
|
||||
input/device.h | 1 +
|
||||
2 files changed, 8 insertions(+)
|
||||
|
||||
diff --git a/input/device.c b/input/device.c
|
||||
index 0e3f4a9..8fdd4e0 100644
|
||||
--- a/input/device.c
|
||||
+++ b/input/device.c
|
||||
@@ -1306,3 +1306,10 @@ int input_device_close_channels(const bdaddr_t *src, const bdaddr_t *dst)
|
||||
|
||||
return 0;
|
||||
}
|
||||
+
|
||||
+void input_device_request_disconnect(struct fake_input *fake)
|
||||
+{
|
||||
+ if (fake == NULL || fake->idev == NULL)
|
||||
+ return;
|
||||
+ device_request_disconnect(fake->idev->device, NULL);
|
||||
+}
|
||||
diff --git a/input/device.h b/input/device.h
|
||||
index 509a353..ff52967 100644
|
||||
--- a/input/device.h
|
||||
+++ b/input/device.h
|
||||
@@ -49,3 +49,4 @@ int input_device_unregister(const char *path, const char *uuid);
|
||||
int input_device_set_channel(const bdaddr_t *src, const bdaddr_t *dst, int psm,
|
||||
GIOChannel *io);
|
||||
int input_device_close_channels(const bdaddr_t *src, const bdaddr_t *dst);
|
||||
+void input_device_request_disconnect(struct fake_input *fake);
|
||||
--
|
||||
1.7.10
|
||||
|
@ -1,101 +0,0 @@
|
||||
From ea793cb9f744cd2942b66385118161b880de958a Mon Sep 17 00:00:00 2001
|
||||
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
|
||||
Date: Tue, 19 Jun 2012 12:44:43 +0300
|
||||
Subject: [PATCH] input: Fix not adding watches when io channel is connected
|
||||
|
||||
This can leave dangling pointers in case one of the channel is never
|
||||
connected which cause -EALREADY to be returned by
|
||||
input_device_set_channel next time the device attempts to connect.
|
||||
|
||||
For the same reason the code path when acting as client now add the
|
||||
watch as soon as the connection completes instead when both channels
|
||||
are connected.
|
||||
---
|
||||
input/device.c | 31 ++++++++++++++++++++++++-------
|
||||
1 file changed, 24 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/input/device.c b/input/device.c
|
||||
index 0e3f4a9..09a9a39 100644
|
||||
--- a/input/device.c
|
||||
+++ b/input/device.c
|
||||
@@ -387,6 +387,11 @@ static gboolean intr_watch_cb(GIOChannel *chan, GIOCondition cond, gpointer data
|
||||
struct input_conn *iconn = data;
|
||||
struct input_device *idev = iconn->idev;
|
||||
gboolean connected = FALSE;
|
||||
+ char address[18];
|
||||
+
|
||||
+ ba2str(&iconn->idev->dst, address);
|
||||
+
|
||||
+ DBG("Device %s disconnected", address);
|
||||
|
||||
/* Checking for ctrl_watch avoids a double g_io_channel_shutdown since
|
||||
* it's likely that ctrl_watch_cb has been queued for dispatching in
|
||||
@@ -415,6 +420,11 @@ static gboolean intr_watch_cb(GIOChannel *chan, GIOCondition cond, gpointer data
|
||||
static gboolean ctrl_watch_cb(GIOChannel *chan, GIOCondition cond, gpointer data)
|
||||
{
|
||||
struct input_conn *iconn = data;
|
||||
+ char address[18];
|
||||
+
|
||||
+ ba2str(&iconn->idev->dst, address);
|
||||
+
|
||||
+ DBG("Device %s disconnected", address);
|
||||
|
||||
/* Checking for intr_watch avoids a double g_io_channel_shutdown since
|
||||
* it's likely that intr_watch_cb has been queued for dispatching in
|
||||
@@ -811,13 +821,6 @@ static int input_device_connected(struct input_device *idev,
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
- iconn->intr_watch = g_io_add_watch(iconn->intr_io,
|
||||
- G_IO_HUP | G_IO_ERR | G_IO_NVAL,
|
||||
- intr_watch_cb, iconn);
|
||||
- iconn->ctrl_watch = g_io_add_watch(iconn->ctrl_io,
|
||||
- G_IO_HUP | G_IO_ERR | G_IO_NVAL,
|
||||
- ctrl_watch_cb, iconn);
|
||||
-
|
||||
connected = TRUE;
|
||||
emit_property_changed(idev->conn, idev->path, INPUT_DEVICE_INTERFACE,
|
||||
"Connected", DBUS_TYPE_BOOLEAN, &connected);
|
||||
@@ -854,6 +857,10 @@ static void interrupt_connect_cb(GIOChannel *chan, GError *conn_err,
|
||||
dbus_message_unref(iconn->pending_connect);
|
||||
iconn->pending_connect = NULL;
|
||||
|
||||
+ iconn->intr_watch = g_io_add_watch(iconn->intr_io,
|
||||
+ G_IO_HUP | G_IO_ERR | G_IO_NVAL,
|
||||
+ intr_watch_cb, iconn);
|
||||
+
|
||||
return;
|
||||
|
||||
failed:
|
||||
@@ -913,6 +920,10 @@ static void control_connect_cb(GIOChannel *chan, GError *conn_err,
|
||||
|
||||
iconn->intr_io = io;
|
||||
|
||||
+ iconn->ctrl_watch = g_io_add_watch(iconn->ctrl_io,
|
||||
+ G_IO_HUP | G_IO_ERR | G_IO_NVAL,
|
||||
+ ctrl_watch_cb, iconn);
|
||||
+
|
||||
return;
|
||||
|
||||
failed:
|
||||
@@ -1272,11 +1283,17 @@ int input_device_set_channel(const bdaddr_t *src, const bdaddr_t *dst, int psm,
|
||||
if (iconn->ctrl_io)
|
||||
return -EALREADY;
|
||||
iconn->ctrl_io = g_io_channel_ref(io);
|
||||
+ iconn->ctrl_watch = g_io_add_watch(iconn->ctrl_io,
|
||||
+ G_IO_HUP | G_IO_ERR | G_IO_NVAL,
|
||||
+ ctrl_watch_cb, iconn);
|
||||
break;
|
||||
case L2CAP_PSM_HIDP_INTR:
|
||||
if (iconn->intr_io)
|
||||
return -EALREADY;
|
||||
iconn->intr_io = g_io_channel_ref(io);
|
||||
+ iconn->intr_watch = g_io_add_watch(iconn->intr_io,
|
||||
+ G_IO_HUP | G_IO_ERR | G_IO_NVAL,
|
||||
+ intr_watch_cb, iconn);
|
||||
break;
|
||||
}
|
||||
|
||||
--
|
||||
1.8.0.1
|
||||
|
@ -1,34 +0,0 @@
|
||||
From b57c64f1aa5c51dd785f2572636b8c41ada06d72 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Raiskup <praiskup@redhat.com>
|
||||
Date: Tue, 30 Aug 2011 15:10:46 +0200
|
||||
Subject: [PATCH] network: NULL dereference fix
|
||||
|
||||
Variable ifindex dereferenced on line 242 before null check on line 249.
|
||||
---
|
||||
network/common.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/network/common.c b/network/common.c
|
||||
index 4704072..a223685 100644
|
||||
--- a/network/common.c
|
||||
+++ b/network/common.c
|
||||
@@ -240,13 +240,15 @@ int bnep_if_down(const char *devname)
|
||||
|
||||
int bnep_add_to_bridge(const char *devname, const char *bridge)
|
||||
{
|
||||
- int ifindex = if_nametoindex(devname);
|
||||
+ int ifindex;
|
||||
struct ifreq ifr;
|
||||
int sk, err;
|
||||
|
||||
if (!devname || !bridge)
|
||||
return -EINVAL;
|
||||
|
||||
+ ifindex = if_nametoindex(devname);
|
||||
+
|
||||
sk = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (sk < 0)
|
||||
return -1;
|
||||
--
|
||||
1.8.0.1
|
||||
|
@ -1,27 +0,0 @@
|
||||
From 57170b311f1468330f4a9961dc0b3ac45f97bc13 Mon Sep 17 00:00:00 2001
|
||||
From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
|
||||
Date: Sat, 30 Jun 2012 00:39:05 -0300
|
||||
Subject: [PATCH] network: fix network Connect() method parameters
|
||||
|
||||
---
|
||||
network/connection.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/network/connection.c b/network/connection.c
|
||||
index 544ec3a..59423a9 100644
|
||||
--- a/network/connection.c
|
||||
+++ b/network/connection.c
|
||||
@@ -554,7 +554,9 @@ static void path_unregister(void *data)
|
||||
|
||||
static const GDBusMethodTable connection_methods[] = {
|
||||
{ GDBUS_ASYNC_METHOD("Connect",
|
||||
- NULL, NULL, connection_connect) },
|
||||
+ GDBUS_ARGS({"uuid", "s"}),
|
||||
+ GDBUS_ARGS({"interface", "s"}),
|
||||
+ connection_connect) },
|
||||
{ GDBUS_METHOD("Disconnect",
|
||||
NULL, NULL, connection_disconnect) },
|
||||
{ GDBUS_METHOD("GetProperties",
|
||||
--
|
||||
1.8.0.1
|
||||
|
@ -1,118 +0,0 @@
|
||||
From cca11542bcd4d1748c850806c1599ed1b76ea19a Mon Sep 17 00:00:00 2001
|
||||
From: Bastien Nocera <hadess@hadess.net>
|
||||
Date: Sun, 17 Jun 2012 01:26:18 +0200
|
||||
Subject: [PATCH 2/3] fakehid: Disconnect from PS3 remote after 10 mins
|
||||
|
||||
After 10 minutes, disconnect the PS3 BD Remote to avoid draining its
|
||||
battery. This is consistent with its behaviour on the PS3.
|
||||
|
||||
Original patch by Ruslan N. Marchenko <rufferson@gmail.com>
|
||||
---
|
||||
input/device.h | 1 +
|
||||
input/fakehid.c | 36 ++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 37 insertions(+)
|
||||
|
||||
diff --git a/input/device.h b/input/device.h
|
||||
index ff52967..d8baa2c 100644
|
||||
--- a/input/device.h
|
||||
+++ b/input/device.h
|
||||
@@ -33,6 +33,7 @@ struct fake_input {
|
||||
int uinput; /* uinput socket */
|
||||
int rfcomm; /* RFCOMM socket */
|
||||
uint8_t ch; /* RFCOMM channel number */
|
||||
+ guint timeout_id; /* Disconnect timeout ID */
|
||||
gboolean (*connect) (struct input_conn *iconn, GError **err);
|
||||
int (*disconnect) (struct input_conn *iconn);
|
||||
void *priv;
|
||||
diff --git a/input/fakehid.c b/input/fakehid.c
|
||||
index 3181538..a125356 100644
|
||||
--- a/input/fakehid.c
|
||||
+++ b/input/fakehid.c
|
||||
@@ -44,6 +44,9 @@
|
||||
#include "fakehid.h"
|
||||
#include "uinput.h"
|
||||
|
||||
+/* Timeout to get the PS3 remote disconnected, in seconds */
|
||||
+#define PS3_REMOTE_TIMEOUT 10 * 60
|
||||
+
|
||||
enum ps3remote_special_keys {
|
||||
PS3R_BIT_PS = 0,
|
||||
PS3R_BIT_ENTER = 3,
|
||||
@@ -141,6 +144,20 @@ static unsigned int ps3remote_keymap[] = {
|
||||
[0xff] = KEY_MAX,
|
||||
};
|
||||
|
||||
+static gboolean ps3_remote_timeout_cb(gpointer user_data);
|
||||
+
|
||||
+static void ps3remote_set_timeout(struct fake_input *fake, gboolean enable)
|
||||
+{
|
||||
+ if (enable) {
|
||||
+ fake->timeout_id = g_timeout_add_seconds(PS3_REMOTE_TIMEOUT, ps3_remote_timeout_cb, fake);
|
||||
+ } else {
|
||||
+ if (fake->timeout_id > 0) {
|
||||
+ g_source_remove(fake->timeout_id);
|
||||
+ fake->timeout_id = 0;
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int ps3remote_decode(char *buff, int size, unsigned int *value)
|
||||
{
|
||||
static unsigned int lastkey = 0;
|
||||
@@ -203,6 +220,16 @@ error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
+static gboolean
|
||||
+ps3_remote_timeout_cb(gpointer user_data)
|
||||
+{
|
||||
+ struct fake_input *fake = (struct fake_input *) user_data;
|
||||
+ input_device_request_disconnect(fake);
|
||||
+ DBG("Disconnected PS3 BD Remote after timeout");
|
||||
+ fake->timeout_id = 0;
|
||||
+ return FALSE;
|
||||
+}
|
||||
+
|
||||
static gboolean ps3remote_event(GIOChannel *chan, GIOCondition cond,
|
||||
gpointer data)
|
||||
{
|
||||
@@ -221,6 +248,9 @@ static gboolean ps3remote_event(GIOChannel *chan, GIOCondition cond,
|
||||
goto failed;
|
||||
}
|
||||
|
||||
+ /* Remove the old timeout */
|
||||
+ ps3remote_set_timeout(fake, FALSE);
|
||||
+
|
||||
fd = g_io_channel_unix_get_fd(chan);
|
||||
|
||||
memset(buff, 0, sizeof(buff));
|
||||
@@ -256,6 +286,8 @@ static gboolean ps3remote_event(GIOChannel *chan, GIOCondition cond,
|
||||
goto failed;
|
||||
}
|
||||
|
||||
+ ps3remote_set_timeout(fake, TRUE);
|
||||
+
|
||||
return TRUE;
|
||||
|
||||
failed:
|
||||
@@ -318,6 +350,8 @@ static int ps3remote_setup_uinput(struct fake_input *fake,
|
||||
goto err;
|
||||
}
|
||||
|
||||
+ ps3remote_set_timeout(fake, TRUE);
|
||||
+
|
||||
return 0;
|
||||
|
||||
err:
|
||||
@@ -378,6 +412,8 @@ struct fake_input *fake_hid_connadd(struct fake_input *fake,
|
||||
for (l = fake_hid->devices; l != NULL; l = l->next) {
|
||||
old = l->data;
|
||||
if (old->idev == fake->idev) {
|
||||
+ if (fake->timeout_id > 0)
|
||||
+ g_source_remove(fake->timeout_id);
|
||||
g_free(fake);
|
||||
fake = old;
|
||||
fake_hid->connect(fake, NULL);
|
||||
--
|
||||
1.7.10
|
||||
|
@ -1,26 +0,0 @@
|
||||
From a354165e58f937ee12c16ab48ce334b664c8f163 Mon Sep 17 00:00:00 2001
|
||||
From: Bastien Nocera <hadess@hadess.net>
|
||||
Date: Sun, 17 Jun 2012 01:29:01 +0200
|
||||
Subject: [PATCH 3/3] fakehid: Use the same constant as declared
|
||||
|
||||
ps3remote_keymap[] uses 0xff as the max value, so should we.
|
||||
---
|
||||
input/fakehid.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/input/fakehid.c b/input/fakehid.c
|
||||
index a125356..a758413 100644
|
||||
--- a/input/fakehid.c
|
||||
+++ b/input/fakehid.c
|
||||
@@ -335,7 +335,7 @@ static int ps3remote_setup_uinput(struct fake_input *fake,
|
||||
}
|
||||
|
||||
/* enabling keys */
|
||||
- for (i = 0; i < 256; i++)
|
||||
+ for (i = 0; i < 0xff; i++)
|
||||
if (ps3remote_keymap[i] != KEY_RESERVED)
|
||||
if (ioctl(fake->uinput, UI_SET_KEYBIT,
|
||||
ps3remote_keymap[i]) < 0) {
|
||||
--
|
||||
1.7.10
|
||||
|
19
bluez.spec
19
bluez.spec
@ -15,27 +15,8 @@ Source6: pand.conf
|
||||
Source7: rfcomm.init
|
||||
Source8: bluez-uinput.modules
|
||||
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=964031
|
||||
Patch0: 0001-Allow-PulseAudio-to-connect-by-default.patch
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=877998
|
||||
Patch1: 0001-hid2hci-change-subsystem-in-udev-rule-from-usb-to-us.patch
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=498756
|
||||
Patch4: 0001-Activate-the-Socket-Mobile-CF-kit.patch
|
||||
# http://thread.gmane.org/gmane.linux.bluez.kernel/2396
|
||||
Patch5: 0001-Add-sixaxis-cable-pairing-plugin.patch
|
||||
# PS3 BD Remote patches
|
||||
Patch6: 0001-input-Add-helper-function-to-request-disconnect.patch
|
||||
Patch7: 0002-fakehid-Disconnect-from-PS3-remote-after-10-mins.patch
|
||||
Patch8: 0003-fakehid-Use-the-same-constant-as-declared.patch
|
||||
# Upstream patches
|
||||
Patch9: 0001-audio-Permit-concurrent-use-of-AG-and-HF-roles.patch
|
||||
Patch10: 0001-Fix-GDBus-flags-after-conversion-to-macros.patch
|
||||
Patch11: 0001-input-Fix-not-adding-watches-when-io-channel-is-conn.patch
|
||||
Patch12: 0001-network-fix-network-Connect-method-parameters.patch
|
||||
Patch13: 0001-network-NULL-dereference-fix.patch
|
||||
# Ubuntu patches
|
||||
Patch14: 0001-work-around-Logitech-diNovo-Edge-keyboard-firmware-i.patch
|
||||
Patch15: 0001-Enable-the-Gateway-and-Source-audio-profiles-by-defa.patch
|
||||
|
||||
BuildRequires: git
|
||||
BuildRequires: flex
|
||||
|
Loading…
Reference in New Issue
Block a user