Return-Path: From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ] core/profile: Fix calling service_accept Date: Mon, 24 Oct 2016 19:32:57 +0300 Message-Id: <1477326777-26717-1-git-send-email-luiz.dentz@gmail.com> Sender: linux-bluetooth-owner@vger.kernel.org List-ID: From: Luiz Augusto von Dentz service_accept shall only be used with profiles that implement .accept callback, to set connecting state directly use service_set_connecting which does not require .accept to be implemented. --- src/profile.c | 2 +- src/service.c | 19 +++++++++++++++++++ src/service.h | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/profile.c b/src/profile.c index c81a9f9..7c5318c 100644 --- a/src/profile.c +++ b/src/profile.c @@ -1047,7 +1047,7 @@ static void ext_connect(GIOChannel *io, GError *err, gpointer user_data) conn); } - if (conn->service && service_accept(conn->service) < 0) + if (conn->service && service_set_connecting(conn->service) < 0) goto drop; if (send_new_connection(ext, conn)) diff --git a/src/service.c b/src/service.c index 20a41d0..207ffae 100644 --- a/src/service.c +++ b/src/service.c @@ -214,6 +214,25 @@ done: return 0; } +int service_set_connecting(struct btd_service *service) +{ + switch (service->state) { + case BTD_SERVICE_STATE_UNAVAILABLE: + return -EINVAL; + case BTD_SERVICE_STATE_DISCONNECTED: + break; + case BTD_SERVICE_STATE_CONNECTING: + case BTD_SERVICE_STATE_CONNECTED: + return 0; + case BTD_SERVICE_STATE_DISCONNECTING: + return -EBUSY; + } + + change_state(service, BTD_SERVICE_STATE_CONNECTING, 0); + + return 0; +} + int btd_service_connect(struct btd_service *service) { struct btd_profile *profile = service->profile; diff --git a/src/service.h b/src/service.h index c1f97f6..6f1edfb 100644 --- a/src/service.h +++ b/src/service.h @@ -49,6 +49,7 @@ int service_probe(struct btd_service *service); void service_remove(struct btd_service *service); int service_accept(struct btd_service *service); +int service_set_connecting(struct btd_service *service); /* Connection control API */ int btd_service_connect(struct btd_service *service); -- 2.7.4