summaryrefslogtreecommitdiffstats
path: root/hcid/dbus-adapter.c
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2006-09-27 16:25:11 +0000
committerJohan Hedberg <johan.hedberg@nokia.com>2006-09-27 16:25:11 +0000
commit255528bec9a5ffdd81ce509f2166a3a405b958d3 (patch)
tree4f0f3944f4d5f26525f8618647d3e1c453b4dc1e /hcid/dbus-adapter.c
parent247635fe3905e4cc084a167c6db6e53dd7b0554d (diff)
Return correct error reply for CreateBonding when using security mode 3
Diffstat (limited to 'hcid/dbus-adapter.c')
-rw-r--r--hcid/dbus-adapter.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c
index 53b65144..b7425a1a 100644
--- a/hcid/dbus-adapter.c
+++ b/hcid/dbus-adapter.c
@@ -1786,6 +1786,19 @@ failed:
return -1;
}
+static void reply_authentication_failure(struct bonding_request_info *bonding)
+{
+ DBusMessage *reply;
+ int status;
+
+ status = bonding->hci_status ?
+ bonding->hci_status : HCI_AUTHENTICATION_FAILURE;
+
+ reply = new_authentication_return(bonding->rq, status);
+ if (reply)
+ send_reply_and_unref(bonding->conn, reply);
+}
+
static gboolean create_bonding_conn_complete(GIOChannel *io, GIOCondition cond,
struct hci_dbus_data *pdata)
{
@@ -1811,10 +1824,12 @@ static gboolean create_bonding_conn_complete(GIOChannel *io, GIOCondition cond,
if (cond & (G_IO_HUP | G_IO_ERR)) {
debug("Hangup or error on bonding IO channel");
- if (!pdata->bonding->connected)
+
+ if (!pdata->bonding->auth_active)
error_connection_attempt_failed(pdata->bonding->conn, pdata->bonding->rq, ENETDOWN);
else
- error_authentication_failed(pdata->bonding->conn, pdata->bonding->rq);
+ reply_authentication_failure(pdata->bonding);
+
goto failed;
}
@@ -1828,12 +1843,13 @@ static gboolean create_bonding_conn_complete(GIOChannel *io, GIOCondition cond,
}
if (ret != 0) {
- error_connection_attempt_failed(pdata->bonding->conn, pdata->bonding->rq, ret);
+ if (pdata->bonding->auth_active)
+ reply_authentication_failure(pdata->bonding);
+ else
+ error_connection_attempt_failed(pdata->bonding->conn, pdata->bonding->rq, ret);
goto failed;
}
- pdata->bonding->connected = 1;
-
len = sizeof(cinfo);
if (getsockopt(sk, SOL_L2CAP, L2CAP_CONNINFO, &cinfo, &len) < 0) {
error("Can't get connection info: %s (%d)", strerror(errno), errno);
@@ -1879,6 +1895,8 @@ static gboolean create_bonding_conn_complete(GIOChannel *io, GIOCondition cond,
hci_close_dev(dd);
+ pdata->bonding->auth_active = 1;
+
pdata->bonding->io_id = g_io_add_watch(io, G_IO_NVAL | G_IO_HUP | G_IO_ERR,
(GIOFunc) create_bonding_conn_complete,
pdata);