Hello community,
here is the log from the commit of package bluez-utils
checked in at Wed Oct 3 00:47:04 CEST 2007.
--------
--- bluez-utils/bluez-utils.changes 2007-09-03 09:55:05.000000000 +0200
+++ /mounts/work_src_done/STABLE/bluez-utils/bluez-utils.changes 2007-09-17 16:11:45.000000000 +0200
@@ -1,0 +2,12 @@
+Mon Sep 17 16:11:21 CEST 2007 - seife@suse.de
+
+- update to v3.19:
+ * Limit range of bitpool announced while in ACP side.
+ * Use poll instead of usleep to wait for worker thread.
+ * Use default event mask from the specification.
+ * Add HID proxy support for Logitech diNovo Edge dongle.
+ * Add refresh option to re-request device names.
+ * Show correct connection link type.
+- fixes bug 325678
+
+-------------------------------------------------------------------
Old:
----
bluez-utils-3.18.tar.bz2
New:
----
bluez-utils-3.19.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ bluez-utils.spec ++++++
--- /var/tmp/diff_new_pack.k16778/_old 2007-10-03 00:46:50.000000000 +0200
+++ /var/tmp/diff_new_pack.k16778/_new 2007-10-03 00:46:50.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package bluez-utils (Version 3.18)
+# spec file for package bluez-utils (Version 3.19)
#
# Copyright (c) 2007 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -12,14 +12,14 @@
Name: bluez-utils
BuildRequires: alsa-devel bluez-libs cups dbus-1-devel fuse-devel libusb-devel openobex-devel pkgconfig resmgr xorg-x11-devel
-URL: http://bluez.sourceforge.net
-Version: 3.18
+Url: http://bluez.sourceforge.net
+Version: 3.19
Release: 1
Summary: Bluetooth Daemons and Utilities
License: GPL v2 or later
PreReq: %fillup_prereq %insserv_prereq
Group: Hardware/Mobile
-Autoreqprov: on
+AutoReqProv: on
Source: bluez-utils-%{version}.tar.bz2
Source1: bluez-utils_doc.tar.bz2
Source2: opd-v0.2-2003-03-18.tgz
@@ -79,7 +79,7 @@
%package -n bluez-test
Group: Development/Tools/Debuggers
-License: GPL v2 or later, X11/MIT
+License: GPL v2 or later; X11/MIT
Summary: Tools for testing of various Bluetooth-functions
Requires: bluez-libs >= %( echo `rpm -q --queryformat '%{VERSION}' bluez-libs`) python-gobject2 dbus-1-python
@@ -214,6 +214,7 @@
%{_bindir}/sdptool
%{_bindir}/ciptool
%{_bindir}/dfutool
+%{_bindir}/dfubabel
%{_bindir}/passkey-agent
%{_bindir}/auth-agent
%{_sbindir}/hciattach
@@ -249,6 +250,7 @@
%doc %{_mandir}/man1/rfcomm.1.gz
%doc %{_mandir}/man1/l2ping.1.gz
%doc %{_mandir}/man1/dfutool.1.gz
+%doc %{_mandir}/man1/dfubabel.1.gz
#%doc %{_mandir}/man1/hidd.1.gz
%dir %{_sysconfdir}/bluetooth
%config(noreplace) %{_sysconfdir}/bluetooth/hcid.conf
@@ -280,8 +282,16 @@
%{_bindir}/apitest
# %{_bindir}/scotest
%doc %{_defaultdocdir}/bluez-test
-
%changelog
+* Mon Sep 17 2007 - seife@suse.de
+- update to v3.19:
+ * Limit range of bitpool announced while in ACP side.
+ * Use poll instead of usleep to wait for worker thread.
+ * Use default event mask from the specification.
+ * Add HID proxy support for Logitech diNovo Edge dongle.
+ * Add refresh option to re-request device names.
+ * Show correct connection link type.
+- fixes bug 325678
* Mon Sep 03 2007 - seife@suse.de
- update to v3.18:
* Implement proper locking for headsets.
++++++ bluez-utils-3.18.tar.bz2 -> bluez-utils-3.19.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/acinclude.m4 new/bluez-utils-3.19/acinclude.m4
--- old/bluez-utils-3.18/acinclude.m4 2007-08-28 17:59:36.000000000 +0200
+++ new/bluez-utils-3.19/acinclude.m4 2007-09-16 09:57:28.000000000 +0200
@@ -187,6 +187,7 @@
avctrl_enable=no
hid2hci_enable=${usb_found}
dfutool_enable=no
+ dfubabel_enable=no
AC_ARG_ENABLE(fortify, AC_HELP_STRING([--disable-fortify], [disable compile time buffer checks]), [
fortify_enable=${enableval}
@@ -207,7 +208,7 @@
hcid_enable=${enableval}
sdpd_enable=${enableval}
hidd_enable=${enableval}
- pand_enalbe=${enableval}
+ pand_enable=${enableval}
test_enable=${enableval}
cups_enable=${enableval}
manpages_enable=${enableval}
@@ -218,6 +219,7 @@
avctrl_enable=${enableval}
hid2hci_enable=${enableval}
dfutool_enable=${enableval}
+ dfubabel_enable=${enableval}
])
AC_ARG_ENABLE(inotify, AC_HELP_STRING([--enable-inotify], [enable inotify support]), [
@@ -332,6 +334,10 @@
dfutool_enable=${enableval}
])
+ AC_ARG_ENABLE(dfubabel, AC_HELP_STRING([--enable-dfubabel], [install Babel DFU mode switching utility]), [
+ dfubabel_enable=${enableval}
+ ])
+
if (test "${fortify_enable}" = "yes"); then
CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
fi
@@ -394,4 +400,5 @@
AM_CONDITIONAL(AVCTRL, test "${avctrl_enable}" = "yes" && test "${usb_found}" = "yes")
AM_CONDITIONAL(HID2HCI, test "${hid2hci_enable}" = "yes" && test "${usb_found}" = "yes")
AM_CONDITIONAL(DFUTOOL, test "${dfutool_enable}" = "yes" && test "${usb_found}" = "yes")
+ AM_CONDITIONAL(DFUBABEL, test "${dfubabel_enable}" = "yes" && test "${usb_found}" = "yes")
])
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/audio/a2dp.c new/bluez-utils-3.19/audio/a2dp.c
--- old/bluez-utils-3.18/audio/a2dp.c 2007-09-02 18:26:32.000000000 +0200
+++ new/bluez-utils-3.19/audio/a2dp.c 2007-09-16 09:57:29.000000000 +0200
@@ -41,6 +41,9 @@
#include "sink.h"
#include "a2dp.h"
+#define MAX_BITPOOL 64
+#define MIN_BITPOOL 2
+
/* The duration that streams without users are allowed to stay in
* STREAMING state. */
#define SUSPEND_TIMEOUT 5000
@@ -274,7 +277,7 @@
else if (supported->allocation_method & A2DP_ALLOCATION_SNR)
cap->allocation_method = A2DP_ALLOCATION_SNR;
- min_bitpool = MAX(2, supported->min_bitpool);
+ min_bitpool = MAX(MIN_BITPOOL, supported->min_bitpool);
max_bitpool = MIN(default_bitpool(cap->frequency, cap->channel_mode),
supported->max_bitpool);
@@ -371,6 +374,9 @@
{
struct a2dp_sep *a2dp_sep = user_data;
struct device *dev;
+ struct avdtp_service_capability *cap;
+ struct avdtp_media_codec_capability *codec_cap;
+ struct sbc_codec_cap *sbc_cap;
if (a2dp_sep->type == AVDTP_SEP_TYPE_SINK)
debug("SBC Sink: Set_Configuration_Ind");
@@ -384,6 +390,24 @@
return FALSE;
}
+ /* Check bipool range */
+ for (codec_cap = NULL; caps; caps = g_slist_next(caps)) {
+ cap = caps->data;
+ if (cap->category == AVDTP_MEDIA_CODEC) {
+ codec_cap = (void *) cap->data;
+ if (codec_cap->media_codec_type == A2DP_CODEC_SBC) {
+ sbc_cap = (void *) codec_cap;
+ if (sbc_cap->min_bitpool < MIN_BITPOOL ||
+ sbc_cap->max_bitpool > MAX_BITPOOL) {
+ *err = AVDTP_UNSUPPORTED_CONFIGURATION;
+ *category = AVDTP_MEDIA_CODEC;
+ return FALSE;
+ }
+ }
+ break;
+ }
+ }
+
avdtp_stream_add_cb(session, stream, stream_state_changed, a2dp_sep);
a2dp_sep->stream = stream;
@@ -437,8 +461,8 @@
sbc_cap.allocation_method = ( A2DP_ALLOCATION_LOUDNESS |
A2DP_ALLOCATION_SNR );
- sbc_cap.min_bitpool = 2;
- sbc_cap.max_bitpool = 250;
+ sbc_cap.min_bitpool = MIN_BITPOOL;
+ sbc_cap.max_bitpool = MAX_BITPOOL;
media_codec = avdtp_service_cap_new(AVDTP_MEDIA_CODEC, &sbc_cap,
sizeof(sbc_cap));
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/audio/pcm_bluetooth.c new/bluez-utils-3.19/audio/pcm_bluetooth.c
--- old/bluez-utils-3.18/audio/pcm_bluetooth.c 2007-09-02 18:26:32.000000000 +0200
+++ new/bluez-utils-3.19/audio/pcm_bluetooth.c 2007-09-16 10:08:29.000000000 +0200
@@ -43,7 +43,7 @@
#define UINT_SECS_MAX (UINT_MAX / 1000000 - 1)
-#define MIN_PERIOD_TIME 1000
+#define MIN_PERIOD_TIME 1
#define BUFFER_SIZE 2048
@@ -135,8 +135,8 @@
snd_pcm_ioplug_t io;
volatile snd_pcm_sframes_t hw_ptr;
struct ipc_data_cfg cfg; /* Bluetooth device config */
- int stream_fd; /* Audio stream filedescriptor */
- int sock; /* Daemon unix socket */
+ struct pollfd stream; /* Audio stream filedescriptor */
+ struct pollfd server; /* Audio daemon filedescriptor */
uint8_t buffer[BUFFER_SIZE]; /* Encoded transfer buffer */
int count; /* Transfer buffer counter */
struct bluetooth_a2dp a2dp; /* A2DP data */
@@ -166,6 +166,10 @@
unsigned int prev_periods;
double period_time;
struct timeval start;
+ struct pollfd fds[2];
+
+ fds[0] = data->server;
+ fds[1] = data->stream;
prev_periods = 0;
period_time = 1000000.0 * data->io.period_size / data->io.rate;
@@ -175,6 +179,7 @@
while (1) {
unsigned int dtime, periods;
struct timeval cur, delta;
+ int ret;
if (data->stopped)
goto iter_sleep;
@@ -208,12 +213,81 @@
}
iter_sleep:
- usleep(MIN_PERIOD_TIME);
+ ret = poll(fds, 2, MIN_PERIOD_TIME);
+ if (ret < 0) {
+ SNDERR("poll error: %s (%d)", strerror(errno), errno);
+ if (errno != EINTR)
+ break;
+ } else if (ret > 0) {
+ ret = (fds[0].revents) ? 0 : 1;
+ SNDERR("poll fd %d revents %d", ret, fds[ret].revents);
+ if (fds[ret].revents & (POLLERR | POLLHUP | POLLNVAL))
+ break;
+ }
/* Offer opportunity to be canceled by main thread */
pthread_testcancel();
}
+
+ data->hw_thread = 0;
+ pthread_exit(NULL);
+}
+
+#if 0
+static int bluetooth_state_init(struct ipc_packet *pkt, int newstate)
+{
+ struct ipc_data_state *state = (void *) pkt->data;
+
+ pkt->length = sizeof(*state);
+ pkt->type = PKT_TYPE_STATE_REQ;
+ pkt->error = PKT_ERROR_NONE;
+ state->state = newstate;
+
+ return 0;
+}
+
+static int bluetooth_state(struct bluetooth_data *data, int newstate)
+{
+ char buf[IPC_MTU];
+ struct ipc_packet *pkt = (void *) buf;
+ struct ipc_data_state *state = (void *) pkt->data;
+ int ret;
+
+ memset(buf, 0, sizeof(buf));
+
+ ret = bluetooth_state_init(pkt, newstate);
+ if (ret < 0)
+ return -ret;
+
+ ret = send(data->server.fd, pkt, sizeof(*pkt) + pkt->length, 0);
+ if (ret < 0)
+ return -errno;
+ else if (ret == 0)
+ return -EIO;
+
+ DBG("OK - %d bytes sent. Waiting for response...", ret);
+
+ memset(buf, 0, sizeof(buf));
+
+ ret = recv(data->server.fd, buf, sizeof(*pkt) + sizeof(*state), 0);
+ if (ret < 0)
+ return -errno;
+ else if (ret == 0)
+ return -EIO;
+
+ if (pkt->type != PKT_TYPE_STATE_RSP) {
+ SNDERR("Unexpected packet type %d received", pkt->type);
+ return -EINVAL;
+ }
+
+ if (pkt->error != PKT_ERROR_NONE) {
+ SNDERR("Error %d while configuring device", pkt->error);
+ return -pkt->error;
+ }
+
+ return 0;
}
+#endif
static int bluetooth_playback_start(snd_pcm_ioplug_t *io)
{
@@ -222,6 +296,9 @@
DBG("%p", io);
+#if 0
+ bluetooth_state(data, STATE_STREAMING);
+#endif
data->stopped = 0;
if (data->hw_thread)
@@ -238,6 +315,9 @@
DBG("%p", io);
+#if 0
+ bluetooth_state(data, STATE_CONNECTED);
+#endif
data->stopped = 1;
return 0;
@@ -254,11 +334,11 @@
{
struct bluetooth_a2dp *a2dp = &data->a2dp;
- if (data->sock >= 0)
- close(data->sock);
+ if (data->server.fd >= 0)
+ close(data->server.fd);
- if (data->stream_fd >= 0)
- close(data->stream_fd);
+ if (data->stream.fd >= 0)
+ close(data->stream.fd);
if (data->hw_thread) {
pthread_cancel(data->hw_thread);
@@ -316,19 +396,19 @@
uint32_t period_count = io->buffer_size / io->period_size;
int opt_name, err;
- DBG("fd=%d period_count=%d", data->stream_fd, period_count);
+ DBG("fd=%d period_count=%d", data->stream.fd, period_count);
opt_name = (io->stream == SND_PCM_STREAM_PLAYBACK) ?
SCO_TXBUFS : SCO_RXBUFS;
- if (setsockopt(data->stream_fd, SOL_SCO, opt_name, &period_count,
+ if (setsockopt(data->stream.fd, SOL_SCO, opt_name, &period_count,
sizeof(period_count)) == 0)
return 0;
opt_name = (io->stream == SND_PCM_STREAM_PLAYBACK) ?
SO_SNDBUF : SO_RCVBUF;
- if (setsockopt(data->stream_fd, SOL_SCO, opt_name, &period_count,
+ if (setsockopt(data->stream.fd, SOL_SCO, opt_name, &period_count,
sizeof(period_count)) == 0)
return 0;
@@ -348,12 +428,12 @@
int opt_name, err;
struct timeval t = { 0, period_count };
- DBG("fd=%d period_count=%d", data->stream_fd, period_count);
+ DBG("fd=%d period_count=%d", data->stream.fd, period_count);
opt_name = (io->stream == SND_PCM_STREAM_PLAYBACK) ?
SO_SNDTIMEO : SO_RCVTIMEO;
- if (setsockopt(data->stream_fd, SOL_SOCKET, opt_name, &t,
+ if (setsockopt(data->stream.fd, SOL_SOCKET, opt_name, &t,
sizeof(t)) == 0)
return 0;
@@ -374,7 +454,7 @@
if (space < 1)
return 0;
- pfd[0].fd = data->stream_fd;
+ pfd[0].fd = data->stream.fd;
pfd[0].events = POLLIN;
pfd[0].revents = 0;
@@ -452,7 +532,7 @@
frame_size = areas->step / 8;
- nrecv = recv(data->stream_fd, data->buffer, cfg.pkt_len,
+ nrecv = recv(data->stream.fd, data->buffer, cfg.pkt_len,
MSG_WAITALL | (io->nonblock ? MSG_DONTWAIT : 0));
if (nrecv < 0) {
@@ -532,7 +612,7 @@
goto done;
}
- rsend = send(data->stream_fd, data->buffer, cfg.pkt_len,
+ rsend = send(data->stream.fd, data->buffer, cfg.pkt_len,
io->nonblock ? MSG_DONTWAIT : 0);
if (rsend > 0) {
/* Reset count pointer */
@@ -576,7 +656,7 @@
header->timestamp = htonl(a2dp->nsamples);
header->ssrc = htonl(1);
- ret = send(data->stream_fd, a2dp->buffer, a2dp->count, MSG_DONTWAIT);
+ ret = send(data->stream.fd, a2dp->buffer, a2dp->count, MSG_DONTWAIT);
if (ret == -1)
ret = -errno;
@@ -847,44 +927,35 @@
static int bluetooth_recvmsg_fd(struct bluetooth_data *data)
{
- char cmsg_b[CMSG_SPACE(sizeof(int))];
- struct ipc_packet pkt;
+ char cmsg_b[CMSG_SPACE(sizeof(int))], m;
int err, ret;
- struct iovec iov = {
- .iov_base = &pkt,
- .iov_len = sizeof(pkt)
- };
- struct msghdr msgh = {
- .msg_name = 0,
- .msg_namelen = 0,
- .msg_iov = &iov,
- .msg_iovlen = 1,
- .msg_control = &cmsg_b,
- .msg_controllen = CMSG_LEN(sizeof(int)),
- .msg_flags = 0
- };
+ struct iovec iov = { &m, sizeof(m) };
+ struct msghdr msgh;
+ struct cmsghdr *cmsg;
+
+ memset(&msgh, 0, sizeof(msgh));
+ msgh.msg_iov = &iov;
+ msgh.msg_iovlen = 1;
+ msgh.msg_control = &cmsg_b;
+ msgh.msg_controllen = CMSG_LEN(sizeof(int));
- ret = recvmsg(data->sock, &msgh, 0);
+ ret = recvmsg(data->server.fd, &msgh, 0);
if (ret < 0) {
err = errno;
SNDERR("Unable to receive fd: %s (%d)", strerror(err), err);
return -err;
}
- if (pkt.type == PKT_TYPE_CFG_RSP) {
- struct cmsghdr *cmsg;
- /* Receive auxiliary data in msgh */
- for (cmsg = CMSG_FIRSTHDR(&msgh); cmsg != NULL;
- cmsg = CMSG_NXTHDR(&msgh,cmsg)) {
- if (cmsg->cmsg_level == SOL_SOCKET
+ /* Receive auxiliary data in msgh */
+ for (cmsg = CMSG_FIRSTHDR(&msgh); cmsg != NULL;
+ cmsg = CMSG_NXTHDR(&msgh, cmsg)) {
+ if (cmsg->cmsg_level == SOL_SOCKET
&& cmsg->cmsg_type == SCM_RIGHTS) {
- data->stream_fd = (*(int *) CMSG_DATA(cmsg));
- DBG("stream_fd=%d", data->stream_fd);
- return 0;
- }
+ data->stream.fd = (*(int *) CMSG_DATA(cmsg));
+ DBG("stream_fd=%d", data->stream.fd);
+ return 0;
}
- } else
- SNDERR("Unexpected packet type %d received", pkt.type);
+ }
return -EINVAL;
}
@@ -1081,7 +1152,7 @@
if (ret < 0)
return -ret;
- ret = send(data->sock, pkt, sizeof(*pkt) + pkt->length, 0);
+ ret = send(data->server.fd, pkt, sizeof(*pkt) + pkt->length, 0);
if (ret < 0)
return -errno;
else if (ret == 0)
@@ -1091,7 +1162,7 @@
memset(buf, 0, sizeof(buf));
- ret = recv(data->sock, buf, sizeof(*pkt) + sizeof(*cfg), 0);
+ ret = recv(data->server.fd, buf, sizeof(*pkt) + sizeof(*cfg), 0);
if (ret < 0)
return -errno;
else if (ret == 0)
@@ -1112,7 +1183,7 @@
if (cfg->codec != CFG_CODEC_SBC)
goto done;
- ret = recv(data->sock, sbc, sizeof(*sbc), 0);
+ ret = recv(data->server.fd, sbc, sizeof(*sbc), 0);
if (ret < 0)
return -errno;
else if (ret == 0)
@@ -1133,7 +1204,7 @@
DBG("Device configuration:");
DBG("\n\tfd=%d\n\tfd_opt=%u\n\tpkt_len=%u\n\tsample_size=%u\n\trate=%u",
- data->stream_fd, data->cfg.fd_opt, data->cfg.pkt_len,
+ data->stream.fd, data->cfg.fd_opt, data->cfg.pkt_len,
data->cfg.sample_size, data->cfg.rate);
if (data->cfg.codec == CFG_CODEC_SBC) {
@@ -1142,18 +1213,18 @@
return ret;
}
- if (data->stream_fd == -1) {
- SNDERR("Error while configuring device: could not acquire audio socket");
- return -EINVAL;
- }
-
ret = bluetooth_recvmsg_fd(data);
if (ret < 0)
return ret;
+ if (data->stream.fd == -1) {
+ SNDERR("Error while configuring device: could not acquire audio socket");
+ return -EINVAL;
+ }
+
/* It is possible there is some outstanding
data in the pipe - we have to empty it */
- while (recv(data->stream_fd, data->buffer, data->cfg.pkt_len,
+ while (recv(data->stream.fd, data->buffer, data->cfg.pkt_len,
MSG_DONTWAIT) > 0);
memset(data->buffer, 0, sizeof(data->buffer));
@@ -1174,7 +1245,8 @@
memset(data, 0, sizeof(struct bluetooth_data));
- data->sock = -1;
+ data->server.fd = -1;
+ data->stream.fd = -1;
sk = socket(PF_LOCAL, SOCK_STREAM, 0);
if (sk < 0) {
@@ -1191,7 +1263,8 @@
return -err;
}
- data->sock = sk;
+ data->server.fd = sk;
+ data->server.events = POLLIN;
data->pipefd[0] = -1;
data->pipefd[1] = -1;
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/audio/unix.c new/bluez-utils-3.19/audio/unix.c
--- old/bluez-utils-3.18/audio/unix.c 2007-09-02 18:26:32.000000000 +0200
+++ new/bluez-utils-3.19/audio/unix.c 2007-09-16 09:57:36.000000000 +0200
@@ -122,24 +122,18 @@
and the sendmsg() system call with the cmsg_type field of a "struct cmsghdr" set
to SCM_RIGHTS and the data being an integer value equal to the handle of the
file descriptor to be passed.*/
-static int unix_sendmsg_fd(int sock, int fd, struct ipc_packet *pkt)
+static int unix_sendmsg_fd(int sock, int fd)
{
- char cmsg_b[CMSG_SPACE(sizeof(int))];
+ char cmsg_b[CMSG_SPACE(sizeof(int))], m = 'm';
struct cmsghdr *cmsg;
- struct iovec iov = {
- .iov_base = pkt,
- .iov_len = sizeof(struct ipc_packet)
- };
+ struct iovec iov = { &m, sizeof(m) };
+ struct msghdr msgh;
- struct msghdr msgh = {
- .msg_name = 0,
- .msg_namelen = 0,
- .msg_iov = &iov,
- .msg_iovlen = 1,
- .msg_control = &cmsg_b,
- .msg_controllen = CMSG_LEN(sizeof(int)),
- .msg_flags = 0
- };
+ memset(&msgh, 0, sizeof(msgh));
+ msgh.msg_iov = &iov;
+ msgh.msg_iovlen = 1;
+ msgh.msg_control = &cmsg_b;
+ msgh.msg_controllen = CMSG_LEN(sizeof(int));
cmsg = CMSG_FIRSTHDR(&msgh);
cmsg->cmsg_level = SOL_SOCKET;
@@ -237,7 +231,7 @@
debug("%d bytes sent", len);
if (fd != -1) {
- len = unix_sendmsg_fd(sock, fd, pkt);
+ len = unix_sendmsg_fd(sock, fd);
if (len < 0)
error("Error %s(%d)", strerror(errno), errno);
debug("%d bytes sent", len);
@@ -347,9 +341,23 @@
cfg->fd_opt = CFG_FD_OPT_WRITE;
sbc_cap = (void *) codec_cap;
- cfg->mode = sbc_cap->channel_mode;
cfg->sample_size = 2;
+ switch (sbc_cap->channel_mode) {
+ case A2DP_CHANNEL_MODE_MONO:
+ cfg->mode = CFG_MODE_MONO;
+ break;
+ case A2DP_CHANNEL_MODE_DUAL_CHANNEL:
+ cfg->mode = CFG_MODE_DUAL_CHANNEL;
+ break;
+ case A2DP_CHANNEL_MODE_STEREO:
+ cfg->mode = CFG_MODE_STEREO;
+ break;
+ case A2DP_CHANNEL_MODE_JOINT_STEREO:
+ cfg->mode = CFG_MODE_JOINT_STEREO;
+ break;
+ }
+
switch (sbc_cap->frequency) {
case A2DP_SAMPLING_FREQ_16000:
cfg->rate = 16000;
@@ -623,6 +631,27 @@
{
}
+static int reply_state(int sock, struct ipc_packet *pkt)
+{
+ struct ipc_data_state *state = (struct ipc_data_state *) pkt->data;
+ int len;
+
+ info("status=%u", state->state);
+
+ pkt->type = PKT_TYPE_STATE_RSP;
+ pkt->length = sizeof(struct ipc_data_state);
+ pkt->error = PKT_ERROR_NONE;
+
+ len = sizeof(struct ipc_packet) + sizeof(struct ipc_data_state);
+ len = send(sock, pkt, len, 0);
+ if (len < 0)
+ error("Error %s(%d)", strerror(errno), errno);
+
+ debug("%d bytes sent", len);
+
+ return 0;
+}
+
static void state_event(struct unix_client *client,
struct ipc_packet *pkt, int len)
{
@@ -634,9 +663,9 @@
device_set_state(dev, state->state);
else
state->state = device_get_state(dev);
-
- unix_send_state(client->sock, pkt);
#endif
+
+ reply_state(client->sock, pkt);
}
static gboolean client_cb(GIOChannel *chan, GIOCondition cond, gpointer data)
@@ -798,25 +827,3 @@
unix_sock = -1;
}
-#if 0
-static int unix_send_state(int sock, struct ipc_packet *pkt)
-{
- struct ipc_data_state *state = (struct ipc_data_state *) pkt->data;
- int len;
-
- info("status=%u", state->state);
-
- pkt->type = PKT_TYPE_STATE_RSP;
- pkt->length = sizeof(struct ipc_data_state);
- pkt->error = PKT_ERROR_NONE;
-
- len = sizeof(struct ipc_packet) + sizeof(struct ipc_data_state);
- len = send(sock, pkt, len, 0);
- if (len < 0)
- error("Error %s(%d)", strerror(errno), errno);
-
- debug("%d bytes sent", len);
-
- return 0;
-}
-#endif
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/ChangeLog new/bluez-utils-3.19/ChangeLog
--- old/bluez-utils-3.18/ChangeLog 2007-09-02 18:40:57.000000000 +0200
+++ new/bluez-utils-3.19/ChangeLog 2007-09-16 09:57:28.000000000 +0200
@@ -1,3 +1,14 @@
+ver 3.19:
+ Limit range of bitpool announced while in ACP side.
+ Use poll instead of usleep to wait for worker thread.
+ Use default event mask from the specification.
+ Add HID proxy support for Logitech diNovo Edge dongle.
+ Add refresh option to re-request device names.
+ Show correct connection link type.
+
+ Note:
+ This version needs at least bluez-libs-3.19
+
ver 3.18:
Implement proper locking for headsets.
Fix various A2DP SEP locking issues.
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/common/hal-libhal.c new/bluez-utils-3.19/common/hal-libhal.c
--- old/bluez-utils-3.18/common/hal-libhal.c 2007-03-27 12:20:41.000000000 +0200
+++ new/bluez-utils-3.19/common/hal-libhal.c 2007-09-16 09:57:36.000000000 +0200
@@ -25,6 +25,7 @@
#include
#endif
+#include
#include
#include
@@ -122,12 +123,15 @@
" </method>\n",
&err) == FALSE) {
error("Failed to claim to interface: ", err.message);
+ dbus_error_free(&err);
}
if (libhal_device_commit_to_gdl(hal_ctx, dev, udi, NULL) == FALSE) {
error("Failed to create HAL device");
}
+ free(dev);
+
return 0;
}
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/configure new/bluez-utils-3.19/configure
--- old/bluez-utils-3.18/configure 2007-09-02 18:41:30.000000000 +0200
+++ new/bluez-utils-3.19/configure 2007-09-16 10:10:14.000000000 +0200
@@ -945,6 +945,8 @@
HID2HCI_FALSE
DFUTOOL_TRUE
DFUTOOL_FALSE
+DFUBABEL_TRUE
+DFUBABEL_FALSE
LIBOBJS
LTLIBOBJS'
ac_subst_files=''
@@ -1598,6 +1600,7 @@
--enable-avctrl install Audio/Video control utility
--enable-hid2hci install HID mode switching utility
--enable-dfutool install DFU firmware upgrade utility
+ --enable-dfubabel install Babel DFU mode switching utility
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@@ -2411,7 +2414,7 @@
# Define the identity of the package.
PACKAGE=bluez-utils
- VERSION=3.18
+ VERSION=3.19
cat >>confdefs.h <<_ACEOF
@@ -4897,7 +4900,7 @@
;;
*-*-irix6*)
# Find out which ABI we are using.
- echo '#line 4900 "configure"' > conftest.$ac_ext
+ echo '#line 4903 "configure"' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
@@ -6656,11 +6659,11 @@
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:6659: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:6662: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:6663: \$? = $ac_status" >&5
+ echo "$as_me:6666: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -6924,11 +6927,11 @@
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:6927: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:6930: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
- echo "$as_me:6931: \$? = $ac_status" >&5
+ echo "$as_me:6934: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings other than the usual output.
@@ -7028,11 +7031,11 @@
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
- (eval echo "\"\$as_me:7031: $lt_compile\"" >&5)
+ (eval echo "\"\$as_me:7034: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
- echo "$as_me:7035: \$? = $ac_status" >&5
+ echo "$as_me:7038: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@@ -8493,7 +8496,7 @@
libsuff=
case "$host_cpu" in
x86_64*|s390x*|powerpc64*)
- echo '#line 8496 "configure"' > conftest.$ac_ext
+ echo '#line 8499 "configure"' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
@@ -9357,7 +9360,7 @@
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext < conftest.$ac_ext <&2;}
{ (exit 1); exit 1; }; }
fi
+if test -z "${DFUBABEL_TRUE}" && test -z "${DFUBABEL_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"DFUBABEL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"DFUBABEL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
: ${CONFIG_STATUS=./config.status}
ac_clean_files_save=$ac_clean_files
@@ -13368,11 +13396,13 @@
HID2HCI_FALSE!$HID2HCI_FALSE$ac_delim
DFUTOOL_TRUE!$DFUTOOL_TRUE$ac_delim
DFUTOOL_FALSE!$DFUTOOL_FALSE$ac_delim
+DFUBABEL_TRUE!$DFUBABEL_TRUE$ac_delim
+DFUBABEL_FALSE!$DFUBABEL_FALSE$ac_delim
LIBOBJS!$LIBOBJS$ac_delim
LTLIBOBJS!$LTLIBOBJS$ac_delim
_ACEOF
- if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 87; then
+ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 89; then
break
elif $ac_last_try; then
{ { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/configure.in new/bluez-utils-3.19/configure.in
--- old/bluez-utils-3.18/configure.in 2007-09-02 18:40:57.000000000 +0200
+++ new/bluez-utils-3.19/configure.in 2007-09-16 09:57:28.000000000 +0200
@@ -1,7 +1,7 @@
AC_PREREQ(2.50)
AC_INIT()
-AM_INIT_AUTOMAKE(bluez-utils, 3.18)
+AM_INIT_AUTOMAKE(bluez-utils, 3.19)
AM_CONFIG_HEADER(config.h)
AM_MAINTAINER_MODE
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/hcid/device.c new/bluez-utils-3.19/hcid/device.c
--- old/bluez-utils-3.18/hcid/device.c 2007-08-28 17:59:37.000000000 +0200
+++ new/bluez-utils-3.19/hcid/device.c 2007-09-16 09:57:36.000000000 +0200
@@ -232,7 +232,7 @@
struct hci_dev *dev;
struct hci_version ver;
uint8_t features[8], inqmode;
- uint8_t events[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00 };
+ uint8_t events[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00 };
char name[249];
int dd, err;
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/network/bridge.c new/bluez-utils-3.19/network/bridge.c
--- old/bluez-utils-3.18/network/bridge.c 2007-09-02 18:26:35.000000000 +0200
+++ new/bluez-utils-3.19/network/bridge.c 2007-09-16 09:57:37.000000000 +0200
@@ -41,10 +41,12 @@
int bridge_init(void)
{
+#if 0
struct stat st;
if (stat("/sys/module/bridge", &st) < 0)
return -EOPNOTSUPP;
+#endif
bridge_socket = socket(AF_INET, SOCK_STREAM, 0);
if (bridge_socket < 0)
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/network/Makefile.am new/bluez-utils-3.19/network/Makefile.am
--- old/bluez-utils-3.18/network/Makefile.am 2007-05-09 08:40:47.000000000 +0200
+++ new/bluez-utils-3.19/network/Makefile.am 2007-09-16 09:57:37.000000000 +0200
@@ -23,6 +23,6 @@
INCLUDES = -I$(top_srcdir)/common
-EXTRA_DIST = network.service network-api.txt test-network
+EXTRA_DIST = network.service network.conf network-api.txt test-network
MAINTAINERCLEANFILES = Makefile.in
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/network/Makefile.in new/bluez-utils-3.19/network/Makefile.in
--- old/bluez-utils-3.18/network/Makefile.in 2007-09-02 18:41:25.000000000 +0200
+++ new/bluez-utils-3.19/network/Makefile.in 2007-09-16 10:10:09.000000000 +0200
@@ -227,7 +227,7 @@
AM_CFLAGS = @BLUEZ_CFLAGS@ @DBUS_CFLAGS@ @HAL_CFLAGS@ @GLIB_CFLAGS@
INCLUDES = -I$(top_srcdir)/common
-EXTRA_DIST = network.service network-api.txt test-network
+EXTRA_DIST = network.service network.conf network-api.txt test-network
MAINTAINERCLEANFILES = Makefile.in
all: all-am
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/network/manager.c new/bluez-utils-3.19/network/manager.c
--- old/bluez-utils-3.18/network/manager.c 2007-08-30 14:25:58.000000000 +0200
+++ new/bluez-utils-3.19/network/manager.c 2007-09-16 09:57:37.000000000 +0200
@@ -264,8 +264,8 @@
d = sdp_data_get(rec, SDP_ATTR_SVCNAME_PRIMARY);
if (d) {
- snprintf(name + len, MAX_NAME_SIZE - len, "(%.*s)",
- d->unitSize, d->val.str);
+ snprintf(name + len, MAX_NAME_SIZE - len,
+ len ? " (%.*s)" : "%.*s", d->unitSize, d->val.str);
}
/* Extract service description from record */
@@ -766,11 +766,6 @@
&dst, id, name, ptr) == 0) {
char *rpath = g_strdup(path);
connection_paths = g_slist_append(connection_paths, rpath);
- dbus_connection_emit_signal(connection, NETWORK_PATH,
- NETWORK_MANAGER_INTERFACE,
- "ConnectionCreated",
- DBUS_TYPE_STRING, &rpath,
- DBUS_TYPE_INVALID);
}
g_free(name);
@@ -780,7 +775,7 @@
{
char filename[PATH_MAX + 1];
char *pattern;
- struct stat s;
+ struct stat st;
GSList *list;
bdaddr_t src;
bdaddr_t default_src;
@@ -790,26 +785,32 @@
str2ba(adapter, &src);
+ if (stat(filename, &st) < 0)
+ return;
+
+ if (!(st.st_mode & __S_IFREG))
+ return;
+
+ textfile_foreach(filename, parse_stored_connection, &src);
+
+ /* Check default connection for current default adapter */
bacpy(&default_src, BDADDR_ANY);
- dev_id = hci_get_route(NULL);
+ dev_id = hci_get_route(&default_src);
if (dev_id < 0)
- hci_devba(dev_id, &default_src);
+ return;
- if (stat (filename, &s) == 0 && (s.st_mode & __S_IFREG)) {
- textfile_foreach(filename, parse_stored_connection, &src);
- pattern = textfile_get(filename, "default");
+ hci_devba(dev_id, &default_src);
+ if (bacmp(&default_src, &src) != 0)
+ return;
- list = find_connection_pattern(connection, pattern);
- if (list != NULL)
- default_index = g_slist_position(connection_paths, list);
- else if (bacmp(&src, &default_src) == 0) {
- list = g_slist_last(connection_paths);
- if (list == NULL)
- return;
- default_index = g_slist_position(connection_paths, list);
- connection_store(connection, list->data, TRUE);
- }
- }
+ pattern = textfile_get(filename, "default");
+ if (!pattern)
+ return;
+
+ list = find_connection_pattern(connection, pattern);
+ if (!list)
+ return;
+ default_index = g_slist_position(connection_paths, list);
}
static void register_server(uint16_t id)
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/network/network.conf new/bluez-utils-3.19/network/network.conf
--- old/bluez-utils-3.18/network/network.conf 1970-01-01 01:00:00.000000000 +0100
+++ new/bluez-utils-3.19/network/network.conf 2007-09-14 12:21:07.000000000 +0200
@@ -0,0 +1,2 @@
+# Configuration file for the network service
+
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/tools/dfubabel.1 new/bluez-utils-3.19/tools/dfubabel.1
--- old/bluez-utils-3.18/tools/dfubabel.1 1970-01-01 01:00:00.000000000 +0100
+++ new/bluez-utils-3.19/tools/dfubabel.1 2007-09-07 21:38:57.000000000 +0200
@@ -0,0 +1,38 @@
+.\"
+.\" 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+.\"
+.\"
+.TH DFUBABEL 8 "JUNE 6, 2005" "" ""
+
+.SH NAME
+dfubabel \- Babel DFU mode switching utility
+.SH SYNOPSIS
+.BR "dfubabel
+[
+.I options
+]
+.SH DESCRIPTION
+.B dfubabel
+is used to switch Babel devices into DFU mode.
+.SH OPTIONS
+.TP
+.BI -h
+Gives a list of possible options.
+.TP
+.BI -q
+Don't display any messages.
+.SH AUTHOR
+Written by Marcel Holtmann .
+.br
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/tools/dfubabel.c new/bluez-utils-3.19/tools/dfubabel.c
--- old/bluez-utils-3.18/tools/dfubabel.c 1970-01-01 01:00:00.000000000 +0100
+++ new/bluez-utils-3.19/tools/dfubabel.c 2007-09-07 21:38:57.000000000 +0200
@@ -0,0 +1,211 @@
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2004-2007 Marcel Holtmann
+ *
+ *
+ * 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
+#endif
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+#ifdef NEED_USB_GET_BUSSES
+static inline struct usb_bus *usb_get_busses(void)
+{
+ return usb_busses;
+}
+#endif
+
+struct device_info;
+
+struct device_id {
+ uint16_t vendor;
+ uint16_t product;
+ int (*func)(struct device_info *dev, int argc, char *argv[]);
+};
+
+struct device_info {
+ struct usb_device *dev;
+ struct device_id *id;
+};
+
+static int switch_babel(struct device_info *devinfo, int argc, char *argv[])
+{
+ char buf[3];
+ struct usb_dev_handle *udev;
+ int err;
+
+ memset(buf, 0, sizeof(buf));
+
+ buf[0] = 0x00;
+ buf[1] = 0x06;
+ buf[2] = 0x00;
+
+ udev = usb_open(devinfo->dev);
+ if (!udev)
+ return -errno;
+
+ if (usb_claim_interface(udev, 0) < 0) {
+ err = -errno;
+ usb_close(udev);
+ return err;
+ }
+
+ err = usb_bulk_write(udev, 0x02, buf, sizeof(buf), 10000);
+
+ if (err == 0) {
+ err = -1;
+ errno = EALREADY;
+ } else {
+ if (errno == ETIMEDOUT)
+ err = 0;
+ }
+
+ usb_release_interface(udev, 0);
+ usb_close(udev);
+
+ return err;
+}
+
+static struct device_id device_list[] = {
+ { 0x0a12, 0x0042, switch_babel },
+ { -1 }
+};
+
+static struct device_id *match_device(uint16_t vendor, uint16_t product)
+{
+ int i;
+
+ for (i = 0; device_list[i].func; i++) {
+ if (vendor == device_list[i].vendor &&
+ product == device_list[i].product)
+ return &device_list[i];
+ }
+
+ return NULL;
+}
+
+static int find_devices(struct device_info *devinfo, size_t size)
+{
+ struct usb_bus *bus;
+ struct usb_device *dev;
+ struct device_id *id;
+ int count = 0;
+
+ usb_find_busses();
+ usb_find_devices();
+
+ for (bus = usb_get_busses(); bus; bus = bus->next)
+ for (dev = bus->devices; dev; dev = dev->next) {
+ id = match_device(dev->descriptor.idVendor,
+ dev->descriptor.idProduct);
+ if (!id)
+ continue;
+
+ if (count < size) {
+ devinfo[count].dev = dev;
+ devinfo[count].id = id;
+ count++;
+ }
+ }
+
+ return count;
+}
+
+static void usage(void)
+{
+ printf("dfubabel - Babel DFU mode switching utility\n\n");
+
+ printf("Usage:\n"
+ "\tdfubabel [options]\n"
+ "\n");
+
+ printf("Options:\n"
+ "\t-h, --help Display help\n"
+ "\t-q, --quiet Don't display any messages\n"
+ "\n");
+}
+
+static struct option main_options[] = {
+ { "help", 0, 0, 'h' },
+ { "quiet", 0, 0, 'q' },
+ { 0, 0, 0, 0 }
+};
+
+int main(int argc, char *argv[])
+{
+ struct device_info dev[16];
+ int i, opt, num, quiet = 0;
+
+ while ((opt = getopt_long(argc, argv, "+qh", main_options, NULL)) != -1) {
+ switch (opt) {
+ case 'q':
+ quiet = 1;
+ break;
+ case 'h':
+ usage();
+ exit(0);
+ default:
+ exit(0);
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+ optind = 0;
+
+ usb_init();
+
+ num = find_devices(dev, sizeof(dev) / sizeof(dev[0]));
+ if (num <= 0) {
+ if (!quiet)
+ fprintf(stderr, "No Babel devices found\n");
+ exit(1);
+ }
+
+ for (i = 0; i < num; i++) {
+ struct device_id *id = dev[i].id;
+ int err;
+
+ if (!quiet)
+ printf("Switching device %04x:%04x ",
+ id->vendor, id->product);
+ fflush(stdout);
+
+ err = id->func(&dev[i], argc, argv);
+ if (err < 0) {
+ if (!quiet)
+ printf("failed (%s)\n", strerror(-err));
+ } else {
+ if (!quiet)
+ printf("was successful\n");
+ }
+ }
+
+ return 0;
+}
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/tools/hcitool.c new/bluez-utils-3.19/tools/hcitool.c
--- old/bluez-utils-3.18/tools/hcitool.c 2007-06-16 13:53:50.000000000 +0200
+++ new/bluez-utils-3.19/tools/hcitool.c 2007-09-16 09:57:40.000000000 +0200
@@ -63,6 +63,20 @@
return 0;
}
+static char *type2str(uint8_t type)
+{
+ switch (type) {
+ case SCO_LINK:
+ return "SCO";
+ case ACL_LINK:
+ return "ACL";
+ case ESCO_LINK:
+ return "eSCO";
+ default:
+ return "Unknown";
+ }
+}
+
static int conn_list(int s, int dev_id, long arg)
{
struct hci_conn_list_req *cl;
@@ -90,8 +104,7 @@
char addr[18];
ba2str(&ci->bdaddr, addr);
printf("\t%s %s %s handle %d state %d lm %s\n",
- ci->out ? "<" : ">",
- ci->type == ACL_LINK ? "ACL" : "SCO",
+ ci->out ? "<" : ">", type2str(ci->type),
addr, ci->handle, ci->state,
hci_lmtostr(ci->link_mode));
}
@@ -471,6 +484,7 @@
{ "numrsp", 1, 0, 'n' },
{ "iac", 1, 0, 'i' },
{ "flush", 0, 0, 'f' },
+ { "refresh", 0, 0, 'r' },
{ "class", 0, 0, 'C' },
{ "info", 0, 0, 'I' },
{ "oui", 0, 0, 'O' },
@@ -481,7 +495,7 @@
static char *scan_help =
"Usage:\n"
- "\tscan [--length=N] [--numrsp=N] [--iac=lap] [--flush] [--class] [--info] [--oui]\n";
+ "\tscan [--length=N] [--numrsp=N] [--iac=lap] [--flush] [--class] [--info] [--oui] [--refresh]\n";
static void cmd_scan(int dev_id, int argc, char **argv)
{
@@ -494,7 +508,7 @@
struct hci_version version;
struct hci_dev_info di;
struct hci_conn_info_req *cr;
- int extcls = 0, extinf = 0, extoui = 0;
+ int refresh = 0, extcls = 0, extinf = 0, extoui = 0;
int i, n, l, opt, dd, cc, nc;
length = 8; /* ~10 seconds */
@@ -530,6 +544,10 @@
flags |= IREQ_CACHE_FLUSH;
break;
+ case 'r':
+ refresh = 1;
+ break;
+
case 'C':
extcls = 1;
break;
@@ -585,12 +603,15 @@
printf("\n");
for (i = 0; i < num_rsp; i++) {
- memset(name, 0, sizeof(name));
- tmp = get_device_name(&di.bdaddr, &(info+i)->bdaddr);
- if (tmp) {
- strncpy(name, tmp, 249);
- free(tmp);
- nc = 1;
+ if (!refresh) {
+ memset(name, 0, sizeof(name));
+ tmp = get_device_name(&di.bdaddr, &(info+i)->bdaddr);
+ if (tmp) {
+ strncpy(name, tmp, 249);
+ free(tmp);
+ nc = 1;
+ } else
+ nc = 0;
} else
nc = 0;
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/tools/hid2hci.c new/bluez-utils-3.19/tools/hid2hci.c
--- old/bluez-utils-3.18/tools/hid2hci.c 2007-02-18 04:34:51.000000000 +0100
+++ new/bluez-utils-3.19/tools/hid2hci.c 2007-09-16 09:57:40.000000000 +0200
@@ -227,6 +227,8 @@
{ HCI, 0x046d, 0xc70b, switch_logitech }, /* Logitech diNovo Laser keyboard */
{ HCI, 0x046d, 0xc70c, switch_logitech }, /* Logitech diNovo Laser mouse */
{ HCI, 0x046d, 0xc70e, switch_logitech }, /* Logitech diNovo keyboard */
+ { HCI, 0x046d, 0xc713, switch_logitech }, /* Logitech diNovo Edge */
+ { HCI, 0x046d, 0xc714, switch_logitech }, /* Logitech diNovo Edge */
{ -1 }
};
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/tools/Makefile.am new/bluez-utils-3.19/tools/Makefile.am
--- old/bluez-utils-3.18/tools/Makefile.am 2007-05-15 10:06:19.000000000 +0200
+++ new/bluez-utils-3.19/tools/Makefile.am 2007-09-16 09:57:40.000000000 +0200
@@ -31,9 +31,17 @@
dfutool_manfiles =
endif
+if DFUBABEL
+dfubabel_programs = dfubabel
+dfubabel_manfiles = dfubabel.1
+else
+dfubabel_programs =
+dfubabel_manfiles =
+endif
+
sbin_PROGRAMS = hciattach hciconfig $(bccmd_programs) $(avctrl_programs) $(hid2hci_programs)
-bin_PROGRAMS = hcitool l2ping sdptool ciptool $(dfutool_programs)
+bin_PROGRAMS = hcitool l2ping sdptool ciptool $(dfutool_programs) $(dfubabel_programs)
noinst_PROGRAMS = hcisecfilter ppporc
@@ -76,16 +84,22 @@
dfutool_LDADD = @USB_LIBS@
endif
+if DFUBABEL
+dfubabel_SOURCES = dfubabel.c
+dfubabel_LDADD = @USB_LIBS@
+endif
+
AM_CFLAGS = @BLUEZ_CFLAGS@ @USB_CFLAGS@
INCLUDES = -I$(top_srcdir)/common
if MANPAGES
man_MANS = hciattach.8 hciconfig.8 hcitool.1 l2ping.1 sdptool.1 ciptool.1 \
- $(bccmd_manfiles) $(avctrl_manfiles) $(hid2hci_manfiles) $(dfutool_manfiles)
+ $(bccmd_manfiles) $(avctrl_manfiles) $(hid2hci_manfiles) \
+ $(dfutool_manfiles) $(dfubabel_manfiles)
endif
EXTRA_DIST = hciattach.8 hciconfig.8 hcitool.1 l2ping.1 sdptool.1 ciptool.1 \
- bccmd.8 avctrl.8 hid2hci.8 dfutool.1 example.psr
+ bccmd.8 avctrl.8 hid2hci.8 dfutool.1 dfubabel.1 example.psr
MAINTAINERCLEANFILES = Makefile.in
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/bluez-utils-3.18/tools/Makefile.in new/bluez-utils-3.19/tools/Makefile.in
--- old/bluez-utils-3.18/tools/Makefile.in 2007-09-02 18:41:28.000000000 +0200
+++ new/bluez-utils-3.19/tools/Makefile.in 2007-09-16 10:10:11.000000000 +0200
@@ -32,10 +32,10 @@
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
-sbin_PROGRAMS = hciattach$(EXEEXT) hciconfig$(EXEEXT) $(am__EXEEXT_2) \
- $(am__EXEEXT_3) $(am__EXEEXT_4)
+sbin_PROGRAMS = hciattach$(EXEEXT) hciconfig$(EXEEXT) $(am__EXEEXT_3) \
+ $(am__EXEEXT_4) $(am__EXEEXT_5)
bin_PROGRAMS = hcitool$(EXEEXT) l2ping$(EXEEXT) sdptool$(EXEEXT) \
- ciptool$(EXEEXT) $(am__EXEEXT_1)
+ ciptool$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2)
noinst_PROGRAMS = hcisecfilter$(EXEEXT) ppporc$(EXEEXT)
@BCCMD_TRUE@@USB_TRUE@am__append_1 = csr_usb.c
@BCCMD_TRUE@@USB_TRUE@am__append_2 = @USB_LIBS@
@@ -50,12 +50,13 @@
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
@DFUTOOL_TRUE@am__EXEEXT_1 = dfutool$(EXEEXT)
+@DFUBABEL_TRUE@am__EXEEXT_2 = dfubabel$(EXEEXT)
am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" \
"$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man8dir)"
binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-@BCCMD_TRUE@am__EXEEXT_2 = bccmd$(EXEEXT)
-@AVCTRL_TRUE@am__EXEEXT_3 = avctrl$(EXEEXT)
-@HID2HCI_TRUE@am__EXEEXT_4 = hid2hci$(EXEEXT)
+@BCCMD_TRUE@am__EXEEXT_3 = bccmd$(EXEEXT)
+@AVCTRL_TRUE@am__EXEEXT_4 = avctrl$(EXEEXT)
+@HID2HCI_TRUE@am__EXEEXT_5 = hid2hci$(EXEEXT)
sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) $(sbin_PROGRAMS)
avctrl_SOURCES = avctrl.c
@@ -74,6 +75,10 @@
ciptool_SOURCES = ciptool.c
ciptool_OBJECTS = ciptool.$(OBJEXT)
ciptool_DEPENDENCIES =
+am__dfubabel_SOURCES_DIST = dfubabel.c
+@DFUBABEL_TRUE@am_dfubabel_OBJECTS = dfubabel.$(OBJEXT)
+dfubabel_OBJECTS = $(am_dfubabel_OBJECTS)
+dfubabel_DEPENDENCIES =
am__dfutool_SOURCES_DIST = dfutool.c dfu.h dfu.c
@DFUTOOL_TRUE@am_dfutool_OBJECTS = dfutool.$(OBJEXT) dfu.$(OBJEXT)
dfutool_OBJECTS = $(am_dfutool_OBJECTS)
@@ -114,13 +119,14 @@
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
-SOURCES = avctrl.c $(bccmd_SOURCES) ciptool.c $(dfutool_SOURCES) \
+SOURCES = avctrl.c $(bccmd_SOURCES) ciptool.c $(dfubabel_SOURCES) \
+ $(dfutool_SOURCES) $(hciattach_SOURCES) $(hciconfig_SOURCES) \
+ hcisecfilter.c $(hcitool_SOURCES) hid2hci.c l2ping.c ppporc.c \
+ sdptool.c
+DIST_SOURCES = avctrl.c $(am__bccmd_SOURCES_DIST) ciptool.c \
+ $(am__dfubabel_SOURCES_DIST) $(am__dfutool_SOURCES_DIST) \
$(hciattach_SOURCES) $(hciconfig_SOURCES) hcisecfilter.c \
$(hcitool_SOURCES) hid2hci.c l2ping.c ppporc.c sdptool.c
-DIST_SOURCES = avctrl.c $(am__bccmd_SOURCES_DIST) ciptool.c \
- $(am__dfutool_SOURCES_DIST) $(hciattach_SOURCES) \
- $(hciconfig_SOURCES) hcisecfilter.c $(hcitool_SOURCES) \
- hid2hci.c l2ping.c ppporc.c sdptool.c
man1dir = $(mandir)/man1
man8dir = $(mandir)/man8
NROFF = nroff
@@ -272,6 +278,10 @@
@DFUTOOL_TRUE@dfutool_programs = dfutool
@DFUTOOL_FALSE@dfutool_manfiles =
@DFUTOOL_TRUE@dfutool_manfiles = dfutool.1
+@DFUBABEL_FALSE@dfubabel_programs =
+@DFUBABEL_TRUE@dfubabel_programs = dfubabel
+@DFUBABEL_FALSE@dfubabel_manfiles =
+@DFUBABEL_TRUE@dfubabel_manfiles = dfubabel.1
hciattach_SOURCES = hciattach.c hciattach_st.c
hciattach_LDADD = @BLUEZ_LIBS@
hciconfig_SOURCES = hciconfig.c csr.h csr.c
@@ -290,13 +300,16 @@
@HID2HCI_TRUE@hid2hci_LDADD = @USB_LIBS@
@DFUTOOL_TRUE@dfutool_SOURCES = dfutool.c dfu.h dfu.c
@DFUTOOL_TRUE@dfutool_LDADD = @USB_LIBS@
+@DFUBABEL_TRUE@dfubabel_SOURCES = dfubabel.c
+@DFUBABEL_TRUE@dfubabel_LDADD = @USB_LIBS@
AM_CFLAGS = @BLUEZ_CFLAGS@ @USB_CFLAGS@
INCLUDES = -I$(top_srcdir)/common
@MANPAGES_TRUE@man_MANS = hciattach.8 hciconfig.8 hcitool.1 l2ping.1 sdptool.1 ciptool.1 \
-@MANPAGES_TRUE@ $(bccmd_manfiles) $(avctrl_manfiles) $(hid2hci_manfiles) $(dfutool_manfiles)
+@MANPAGES_TRUE@ $(bccmd_manfiles) $(avctrl_manfiles) $(hid2hci_manfiles) \
+@MANPAGES_TRUE@ $(dfutool_manfiles) $(dfubabel_manfiles)
EXTRA_DIST = hciattach.8 hciconfig.8 hcitool.1 l2ping.1 sdptool.1 ciptool.1 \
- bccmd.8 avctrl.8 hid2hci.8 dfutool.1 example.psr
+ bccmd.8 avctrl.8 hid2hci.8 dfutool.1 dfubabel.1 example.psr
MAINTAINERCLEANFILES = Makefile.in
all: all-am
@@ -404,6 +417,9 @@
ciptool$(EXEEXT): $(ciptool_OBJECTS) $(ciptool_DEPENDENCIES)
@rm -f ciptool$(EXEEXT)
$(LINK) $(ciptool_OBJECTS) $(ciptool_LDADD) $(LIBS)
+dfubabel$(EXEEXT): $(dfubabel_OBJECTS) $(dfubabel_DEPENDENCIES)
+ @rm -f dfubabel$(EXEEXT)
+ $(LINK) $(dfubabel_OBJECTS) $(dfubabel_LDADD) $(LIBS)
dfutool$(EXEEXT): $(dfutool_OBJECTS) $(dfutool_DEPENDENCIES)
@rm -f dfutool$(EXEEXT)
$(LINK) $(dfutool_OBJECTS) $(dfutool_LDADD) $(LIBS)
@@ -448,6 +464,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csr_hci.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csr_usb.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dfu.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dfubabel.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dfutool.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hciattach.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hciattach_st.Po@am__quote@
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
---------------------------------------------------------------------
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org