From 5eaec1228065876e49d988188f3057916fb7e9fa Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 31 Mar 2011 10:02:32 +0200 Subject: [PATCH] service: Add __connman_service_connect_session() --- src/connman.h | 2 ++ src/service.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/connman.h b/src/connman.h index 893475d..c16059c 100644 --- a/src/connman.h +++ b/src/connman.h @@ -520,6 +520,8 @@ int __connman_service_disconnect(struct connman_service *service); int __connman_service_disconnect_all(void); int __connman_service_create_and_connect(DBusMessage *msg); void __connman_service_auto_connect(void); +int __connman_service_session_connect(GSequence *service_list, + struct connman_service **service); const char *__connman_service_type2string(enum connman_service_type type); diff --git a/src/service.c b/src/service.c index 63b5df9..91e0a61 100644 --- a/src/service.c +++ b/src/service.c @@ -2562,6 +2562,57 @@ void __connman_service_auto_connect(void) } } +static connman_bool_t session_is_ignore(struct connman_service *service) +{ + if (combine_state(service->state_ipv4, service->state_ipv6) == + CONNMAN_SERVICE_STATE_FAILURE) + return TRUE; + + return FALSE; +} + +int __connman_service_session_connect(GSequence *list, + struct connman_service **ret_service) +{ + struct connman_service *service; + GSequenceIter *iter; + + DBG("list %p", list); + + iter = g_sequence_get_begin_iter(list); + + while (g_sequence_iter_is_end(iter) == FALSE) { + service = g_sequence_get(iter); + + if (service->pending != NULL) + return -EINPROGRESS; + + if (is_connected(service) == TRUE) + return -EISCONN; + + if (is_connecting(service) == TRUE) + return -EALREADY; + + if (session_is_ignore(service) == FALSE && + combine_state(service->state_ipv4, + service->state_ipv6) == + CONNMAN_SERVICE_STATE_IDLE) + break; + + service = NULL; + + iter = g_sequence_iter_next(iter); + } + + if (service == NULL) + return -EINVAL; + + + *ret_service = service; + + return __connman_service_connect(service); +} + static void remove_timeout(struct connman_service *service) { if (service->timeout > 0) { -- 2.7.4