diff mbox series

[v2,1/2] btio: Show destination address in connect error message

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

Commit Message

Pali Rohár April 22, 2020, 5:01 p.m. UTC
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(-)

Comments

Luiz Augusto von Dentz April 22, 2020, 5:57 p.m. UTC | #1
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);
Luiz Augusto von Dentz April 22, 2020, 6:30 p.m. UTC | #2
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 mbox series

Patch

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;
 }