diff -ur obex-data-server-0.4.5/src/ods-bluez.c obex-data-server-0.4.5-mod/src/ods-bluez.c --- obex-data-server-0.4.5/src/ods-bluez.c 2009-10-21 16:10:19.000000000 +0200 +++ obex-data-server-0.4.5-mod/src/ods-bluez.c 2011-11-24 03:58:31.959403003 +0100 @@ -98,9 +98,10 @@ return FALSE; } -static void -rfcomm_connect (OdsBluezCancellable *cb_data, gint channel) +static int +rfcomm_connect (gpointer in) { + OdsBluezCancellable *cb_data = in; OdsBluezFunc cb = cb_data->cb; GError *error = NULL; struct sockaddr_rc addr; @@ -130,7 +131,7 @@ memset (&addr, 0, sizeof(addr)); /* destination address */ addr.rc_family = AF_BLUETOOTH; - addr.rc_channel = channel; + addr.rc_channel = cb_data->channel; bacpy (&addr.rc_bdaddr, &cb_data->target_address); /* Use non-blocking connect */ @@ -157,7 +158,7 @@ client_socket_connect_cb (io_channel, G_IO_OUT, cb_data); } g_io_channel_unref (io_channel); - return; + return FALSE; err: if (io_channel) @@ -167,6 +168,7 @@ cb (-1, cb_data->channel, cb_data->imagingdata, error, cb_data->cb_data); ods_bluez_cancellable_free (cb_data); g_clear_error (&error); + return FALSE; } @@ -218,12 +220,16 @@ } } + sdp_close (cb_data->session); + cb_data->session = NULL; + if (protos) { sdp_list_foreach (protos, (sdp_list_func_t)sdp_list_free, 0); sdp_list_free (protos, 0); } - rfcomm_connect (cb_data, channel); + cb_data->channel = channel; + g_timeout_add (2000, rfcomm_connect, cb_data); return; err: @@ -464,7 +470,7 @@ } else { /* skip SDP requests and connect to specified RFCOMM channel */ cb_data->channel = channel; - rfcomm_connect (cb_data, channel); + rfcomm_connect (cb_data); } return cb_data; @@ -573,7 +579,6 @@ return; recs->rec_count--; if (recs->rec_count < 1) { - sdp_close (recs->session); g_hash_table_remove (sdp_session_list, device); } }