aboutsummaryrefslogtreecommitdiff
path: root/src/adapter.c
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2011-03-31 10:18:45 +0300
committerJohan Hedberg <johan.hedberg@nokia.com>2011-03-31 10:18:45 +0300
commit23fed61b1f3385f6f2d5c98cea8e8536ef5d3be1 (patch)
tree0f27bd171c8b2a6789fad788e0a75aa7113ca92e /src/adapter.c
parent7041b13a4602b1350296a538e9ad0f596cbd1266 (diff)
downloadbluez-23fed61b1f3385f6f2d5c98cea8e8536ef5d3be1.tar.gz
Fix discovery callback usage
The start_discovery function was used both as a GLib callback as well as directly called function that can return a negative integer as error. This will obviously not work since GLib expects a gboolean return (a negative return value would have an undefined result). This patch fixes the issue creating a separate function to be used as the GLib callback.
Diffstat (limited to 'src/adapter.c')
-rw-r--r--src/adapter.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/src/adapter.c b/src/adapter.c
index 1d236ca7..c400bfd7 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -1220,7 +1220,7 @@ static gboolean stop_scanning(gpointer user_data)
static int start_discovery(struct btd_adapter *adapter)
{
- int err, type;
+ int type;
/* Do not start if suspended */
if (adapter->state & STATE_SUSPENDED)
@@ -1228,7 +1228,7 @@ static int start_discovery(struct btd_adapter *adapter)
/* Postpone discovery if still resolving names */
if (adapter->state & STATE_RESOLVNAME)
- return 1;
+ return -EINPROGRESS;
pending_remote_name_cancel(adapter);
@@ -1237,21 +1237,30 @@ static int start_discovery(struct btd_adapter *adapter)
switch (type) {
case DISC_STDINQ:
case DISC_INTERLEAVE:
- err = adapter_ops->start_inquiry(adapter->dev_id,
+ return adapter_ops->start_inquiry(adapter->dev_id,
0x08, FALSE);
- break;
case DISC_PINQ:
- err = adapter_ops->start_inquiry(adapter->dev_id,
+ return adapter_ops->start_inquiry(adapter->dev_id,
0x08, TRUE);
- break;
case DISC_LE:
- err = adapter_ops->start_scanning(adapter->dev_id);
- break;
+ return adapter_ops->start_scanning(adapter->dev_id);
default:
- err = -EINVAL;
+ return -EINVAL;
}
+}
- return err;
+static gboolean discovery_cb(gpointer user_data)
+{
+ struct btd_adapter *adapter = user_data;
+ int err;
+
+ err = start_discovery(adapter);
+ if (err == -EINPROGRESS)
+ return TRUE;
+ else if (err < 0)
+ error("start_discovery: %s (%d)", strerror(-err), -err);
+
+ return FALSE;
}
static DBusMessage *adapter_start_discovery(DBusConnection *conn,
@@ -1282,7 +1291,7 @@ static DBusMessage *adapter_start_discovery(DBusConnection *conn,
adapter->oor_devices = NULL;
err = start_discovery(adapter);
- if (err < 0)
+ if (err < 0 && err != -EINPROGRESS)
return btd_error_failed(msg, strerror(-err));
done:
@@ -2879,8 +2888,7 @@ void adapter_set_state(struct btd_adapter *adapter, int state)
} else if (adapter->disc_sessions && main_opts.discov_interval)
adapter->scheduler_id = g_timeout_add_seconds(
main_opts.discov_interval,
- (GSourceFunc) start_discovery,
- adapter);
+ discovery_cb, adapter);
emit_property_changed(connection, path,
ADAPTER_INTERFACE, "Discovering",