summaryrefslogtreecommitdiff
path: root/btio
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2014-04-02 14:03:12 +0300
committerJohan Hedberg <johan.hedberg@intel.com>2014-04-02 14:06:53 +0300
commit8dec0f65b4b2c29729959feabc053c38e6922efc (patch)
treecfa09d5e0b95939475f47c6a2ba54252f9ae1ff4 /btio
parent56f443387e0201b7e46474d863d1cc91b6d74ecb (diff)
downloadbluez-8dec0f65b4b2c29729959feabc053c38e6922efc.tar.gz
btio: Do RFCOMM peer address lookup only when really necessary
Diffstat (limited to 'btio')
-rw-r--r--btio/btio.c34
1 files changed, 30 insertions, 4 deletions
diff --git a/btio/btio.c b/btio/btio.c
index 6e73180fa..7cacaf054 100644
--- a/btio/btio.c
+++ b/btio/btio.c
@@ -1196,13 +1196,13 @@ static gboolean rfcomm_get(int sock, GError **err, BtIOOption opt1,
{
BtIOOption opt = opt1;
struct sockaddr_rc src, dst;
+ gboolean have_dst = FALSE;
int flags;
socklen_t len;
uint8_t dev_class[3];
uint16_t handle;
- if (!get_peers(sock, (struct sockaddr *) &src,
- (struct sockaddr *) &dst, sizeof(src), err))
+ if (!get_src(sock, &src, sizeof(src), err))
return FALSE;
while (opt != BT_IO_OPT_INVALID) {
@@ -1214,9 +1214,19 @@ static gboolean rfcomm_get(int sock, GError **err, BtIOOption opt1,
bacpy(va_arg(args, bdaddr_t *), &src.rc_bdaddr);
break;
case BT_IO_OPT_DEST:
+ if (!have_dst)
+ have_dst = get_dst(sock, &dst, sizeof(dst),
+ err);
+ if (!have_dst)
+ return FALSE;
ba2str(&dst.rc_bdaddr, va_arg(args, char *));
break;
case BT_IO_OPT_DEST_BDADDR:
+ if (!have_dst)
+ have_dst = get_dst(sock, &dst, sizeof(dst),
+ err);
+ if (!have_dst)
+ return FALSE;
bacpy(va_arg(args, bdaddr_t *), &dst.rc_bdaddr);
break;
case BT_IO_OPT_DEFER_TIMEOUT:
@@ -1234,13 +1244,29 @@ static gboolean rfcomm_get(int sock, GError **err, BtIOOption opt1,
return FALSE;
break;
case BT_IO_OPT_CHANNEL:
- *(va_arg(args, uint8_t *)) = src.rc_channel ?
- src.rc_channel : dst.rc_channel;
+ if (src.rc_channel) {
+ *(va_arg(args, uint8_t *)) = src.rc_channel;
+ break;
+ }
+
+ if (!have_dst)
+ have_dst = get_dst(sock, &dst, sizeof(dst),
+ err);
+ if (!have_dst)
+ return FALSE;
+
+ *(va_arg(args, uint8_t *)) = dst.rc_channel;
break;
case BT_IO_OPT_SOURCE_CHANNEL:
*(va_arg(args, uint8_t *)) = src.rc_channel;
break;
case BT_IO_OPT_DEST_CHANNEL:
+ if (!have_dst)
+ have_dst = get_dst(sock, &dst, sizeof(dst),
+ err);
+ if (!have_dst)
+ return FALSE;
+
*(va_arg(args, uint8_t *)) = dst.rc_channel;
break;
case BT_IO_OPT_MASTER: