Message ID | 20200422170105.29685-1-pali@kernel.org (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Luiz Von Dentz |
Headers | show |
Series | [v2,1/2] btio: Show destination address in connect error message | expand |
Hi Pali, On Wed, Apr 22, 2020 at 10:06 AM Pali Rohár <pali@kernel.org> wrote: > > When connect() fails it is not possible to retrieve destination address as > socket is not bound. So put destination address into error message. > --- > btio/btio.c | 19 ++++++++++++++----- > 1 file changed, 14 insertions(+), 5 deletions(-) > > diff --git a/btio/btio.c b/btio/btio.c > index e7b4db16b..3ea73faea 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,14 @@ 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; > } > -- > 2.20.1 WARNING:LONG_LINE: line over 80 characters #67: FILE: btio/btio.c:1722: + "connect to %s: %s (%d)", addr, strerror(-err), -err);
Hi Pali, On Wed, Apr 22, 2020 at 10:57 AM Luiz Augusto von Dentz <luiz.dentz@gmail.com> wrote: > > Hi Pali, > > On Wed, Apr 22, 2020 at 10:06 AM Pali Rohár <pali@kernel.org> wrote: > > > > When connect() fails it is not possible to retrieve destination address as > > socket is not bound. So put destination address into error message. > > --- > > btio/btio.c | 19 ++++++++++++++----- > > 1 file changed, 14 insertions(+), 5 deletions(-) > > > > diff --git a/btio/btio.c b/btio/btio.c > > index e7b4db16b..3ea73faea 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,14 @@ 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; > > } > > -- > > 2.20.1 > > WARNING:LONG_LINE: line over 80 characters > #67: FILE: btio/btio.c:1722: > + "connect to %s: %s (%d)", addr, strerror(-err), -err); I went ahead and applied.
diff --git a/btio/btio.c b/btio/btio.c index e7b4db16b..3ea73faea 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,14 @@ 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; }