summaryrefslogtreecommitdiff
path: root/btio
diff options
context:
space:
mode:
authorPali Rohár <pali@kernel.org>2020-04-22 19:01:04 +0200
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2020-04-22 11:20:20 -0700
commitd20ee8273e61e16c78582344f274254973cdf00f (patch)
tree9852bcdccd12c78db35952488fb2e056b8a5da02 /btio
parentc031b5ed4c1aec2cf1632d14f9ea267df9ac5734 (diff)
downloadbluez-d20ee8273e61e16c78582344f274254973cdf00f.tar.gz
btio: Show destination address in connect error message
When connect() fails it is not possible to retrieve destination address as socket is not bound. So put destination address into error message.
Diffstat (limited to 'btio')
-rw-r--r--btio/btio.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/btio/btio.c b/btio/btio.c
index e7b4db16b..460aaf5be 100644
--- a/btio/btio.c
+++ b/btio/btio.c
@@ -85,6 +85,7 @@ struct connect {
BtIOConnect connect;
gpointer user_data;
GDestroyNotify destroy;
+ bdaddr_t dst;
};
struct accept {
@@ -214,6 +215,7 @@ static gboolean connect_cb(GIOChannel *io, GIOCondition cond,
GError *gerr = NULL;
int err, sk_err, sock;
socklen_t len = sizeof(sk_err);
+ char addr[18];
/* If the user aborted this connect attempt */
if ((cond & G_IO_NVAL) || check_nval(io))
@@ -226,8 +228,11 @@ static gboolean connect_cb(GIOChannel *io, GIOCondition cond,
else
err = -sk_err;
- if (err < 0)
- ERROR_FAILED(&gerr, "connect error", -err);
+ if (err < 0) {
+ ba2str(&conn->dst, addr);
+ g_set_error(&gerr, BT_IO_ERROR, err,
+ "connect to %s: %s (%d)", addr, strerror(-err), -err);
+ }
conn->connect(io, gerr, conn->user_data);
@@ -286,7 +291,7 @@ static void server_add(GIOChannel *io, BtIOConnect connect,
(GDestroyNotify) server_remove);
}
-static void connect_add(GIOChannel *io, BtIOConnect connect,
+static void connect_add(GIOChannel *io, BtIOConnect connect, bdaddr_t dst,
gpointer user_data, GDestroyNotify destroy)
{
struct connect *conn;
@@ -296,6 +301,7 @@ static void connect_add(GIOChannel *io, BtIOConnect connect,
conn->connect = connect;
conn->user_data = user_data;
conn->destroy = destroy;
+ conn->dst = dst;
cond = G_IO_OUT | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
g_io_add_watch_full(io, G_PRIORITY_DEFAULT, cond, connect_cb, conn,
@@ -1671,6 +1677,7 @@ GIOChannel *bt_io_connect(BtIOConnect connect, gpointer user_data,
struct set_opts opts;
int err, sock;
gboolean ret;
+ char addr[18];
va_start(args, opt1);
ret = parse_set_opts(&opts, gerr, opt1, args);
@@ -1710,12 +1717,15 @@ GIOChannel *bt_io_connect(BtIOConnect connect, gpointer user_data,
}
if (err < 0) {
- ERROR_FAILED(gerr, "connect", -err);
+ ba2str(&opts.dst, addr);
+ g_set_error(gerr, BT_IO_ERROR, err,
+ "connect to %s: %s (%d)", addr, strerror(-err),
+ -err);
g_io_channel_unref(io);
return NULL;
}
- connect_add(io, connect, user_data, destroy);
+ connect_add(io, connect, opts.dst, user_data, destroy);
return io;
}