diff options
author | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2007-05-09 22:38:56 +0000 |
---|---|---|
committer | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2007-05-09 22:38:56 +0000 |
commit | d997f1912250982b6b7e4eae7516245c9be291b7 (patch) | |
tree | 194d8c9bceda3d6c147ef03a240dfcfbd87bb0f0 | |
parent | 86477ad9060c5456a394af462e17247ee51779ed (diff) |
serial: handle connection refused error and others SO_ERROR properly
-rw-r--r-- | serial/manager.c | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/serial/manager.c b/serial/manager.c index 90637123..0c2baba9 100644 --- a/serial/manager.c +++ b/serial/manager.c @@ -401,14 +401,7 @@ static gboolean rfcomm_connect_cb(GIOChannel *chan, char node_name[16]; const char *pname = node_name; struct rfcomm_dev_req req; - int sk, ret, err, fd; - socklen_t len; - - if (cond & (G_IO_ERR | G_IO_HUP)) { - error("Hangup or error on rfcomm socket"); - err_connection_canceled(pc->conn, pc->msg); - goto fail; - } + int sk, err, fd; if (pc->canceled) { err_connection_canceled(pc->conn, pc->msg); @@ -417,17 +410,28 @@ static gboolean rfcomm_connect_cb(GIOChannel *chan, sk = g_io_channel_unix_get_fd(chan); - len = sizeof(ret); - if (getsockopt(sk, SOL_SOCKET, SO_ERROR, &ret, &len) < 0) { - err = errno; - error("getsockopt(SO_ERROR): %s (%d)", strerror(err), err); - err_connection_failed(pc->conn, pc->msg, strerror(err)); - goto fail; - } + if (cond & (G_IO_ERR | G_IO_HUP)) { + socklen_t len; + int ret; + + len = sizeof(ret); + if (getsockopt(sk, SOL_SOCKET, SO_ERROR, &ret, &len) < 0) { + err = errno; + error("getsockopt(SO_ERROR): %s (%d)", + strerror(err), err); + err_connection_failed(pc->conn, + pc->msg, strerror(err)); + goto fail; + } - if (ret != 0) { - error("connect(): %s (%d)", strerror(ret), ret); - err_connection_failed(pc->conn, pc->msg, strerror(ret)); + if (ret != 0) { + error("connect(): %s (%d)", strerror(ret), ret); + err_connection_failed(pc->conn, pc->msg, strerror(ret)); + goto fail; + } + + error("Hangup on rfcomm socket"); + err_connection_canceled(pc->conn, pc->msg); goto fail; } |