Fail immediately enabling/disabling unregistered technology
authorForest Bond <forest@alittletooquiet.net>
Wed, 12 May 2010 00:56:06 +0000 (20:56 -0400)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 12 May 2010 01:09:31 +0000 (03:09 +0200)
Previously, calling EnableTechnology or DisableTechnology with an
unregistered technology type caused the call to fail silently and
eventually timeout.  With this patch, a "Not Registered" error is
returned immediately instead.

src/connman.h
src/manager.c
src/notifier.c

index 16ded2d..f3a3050 100644 (file)
@@ -464,6 +464,7 @@ void __connman_notifier_disconnect(enum connman_service_type type);
 void __connman_notifier_offlinemode(connman_bool_t enabled);
 void __connman_notifier_default_changed(struct connman_service *service);
 
+connman_bool_t __connman_notifier_is_registered(enum connman_service_type type);
 connman_bool_t __connman_notifier_is_enabled(enum connman_service_type type);
 unsigned int __connman_notifier_count_connected(void);
 const char *__connman_notifier_get_state(void);
index da0ee53..6561a78 100644 (file)
@@ -345,6 +345,9 @@ static DBusMessage *enable_technology(DBusConnection *conn,
        else
                return __connman_error_invalid_arguments(msg);
 
+       if (__connman_notifier_is_registered(type) == FALSE)
+               return __connman_error_not_registered(msg);
+
        if (__connman_notifier_is_enabled(type) == TRUE)
                return __connman_error_already_enabled(msg);
 
@@ -390,6 +393,9 @@ static DBusMessage *disable_technology(DBusConnection *conn,
        else
                return __connman_error_invalid_arguments(msg);
 
+       if (__connman_notifier_is_registered(type) == FALSE)
+               return __connman_error_not_registered(msg);
+
        if (__connman_notifier_is_enabled(type) == FALSE)
                return __connman_error_already_disabled(msg);
 
index 2777783..95794ac 100644 (file)
@@ -401,10 +401,8 @@ void __connman_notifier_offlinemode(connman_bool_t enabled)
        }
 }
 
-connman_bool_t __connman_notifier_is_enabled(enum connman_service_type type)
+static connman_bool_t technology_supported(enum connman_service_type type)
 {
-       DBG("type %d", type);
-
        switch (type) {
        case CONNMAN_SERVICE_TYPE_UNKNOWN:
        case CONNMAN_SERVICE_TYPE_SYSTEM:
@@ -419,6 +417,29 @@ connman_bool_t __connman_notifier_is_enabled(enum connman_service_type type)
                break;
        }
 
+       return TRUE;
+}
+
+connman_bool_t __connman_notifier_is_registered(enum connman_service_type type)
+{
+       DBG("type %d", type);
+
+       if (technology_supported(type) == FALSE)
+               return FALSE;
+
+       if (g_atomic_int_get(&registered[type]) > 0)
+               return TRUE;
+
+       return FALSE;
+}
+
+connman_bool_t __connman_notifier_is_enabled(enum connman_service_type type)
+{
+       DBG("type %d", type);
+
+       if (technology_supported(type) == FALSE)
+               return FALSE;
+
        if (g_atomic_int_get(&enabled[type]) > 0)
                return TRUE;