Imported Upstream version 1.35
[platform/upstream/connman.git] / src / technology.c
index 55303a0..d2f0ae2 100644 (file)
@@ -211,22 +211,27 @@ static void tethering_changed(struct connman_technology *technology)
        technology_save(technology);
 }
 
-void connman_technology_tethering_notify(struct connman_technology *technology,
+int connman_technology_tethering_notify(struct connman_technology *technology,
                                                        bool enabled)
 {
+       int err;
+
        DBG("technology %p enabled %u", technology, enabled);
 
        if (technology->tethering == enabled)
-               return;
+               return -EALREADY;
 
-       technology->tethering = enabled;
+       if (enabled) {
+               err = __connman_tethering_set_enabled();
+               if (err < 0)
+                       return err;
+       } else
+               __connman_tethering_set_disabled();
 
+       technology->tethering = enabled;
        tethering_changed(technology);
 
-       if (enabled)
-               __connman_tethering_set_enabled();
-       else
-               __connman_tethering_set_disabled();
+       return 0;
 }
 
 static int set_tethering(struct connman_technology *technology,
@@ -265,10 +270,8 @@ static int set_tethering(struct connman_technology *technology,
                if (result == -EINPROGRESS)
                        continue;
 
-               if (err == -EINPROGRESS || err == 0) {
+               if (err == -EINPROGRESS || err == 0)
                        result = err;
-                       continue;
-               }
        }
 
        return result;
@@ -444,15 +447,31 @@ bool __connman_technology_get_offlinemode(void)
 static void connman_technology_save_offlinemode(void)
 {
        GKeyFile *keyfile;
+       GError *error = NULL;
+       bool offlinemode;
 
        keyfile = __connman_storage_load_global();
-       if (!keyfile)
+
+       if (!keyfile) {
                keyfile = g_key_file_new();
+               g_key_file_set_boolean(keyfile, "global",
+                                       "OfflineMode", global_offlinemode);
 
-       g_key_file_set_boolean(keyfile, "global",
+               __connman_storage_save_global(keyfile);
+       }
+       else {
+               offlinemode = g_key_file_get_boolean(keyfile, "global",
+                                               "OfflineMode", &error);
+
+               if (error || offlinemode != global_offlinemode) {
+                       g_key_file_set_boolean(keyfile, "global",
                                        "OfflineMode", global_offlinemode);
+                       if (error)
+                               g_clear_error(&error);
 
-       __connman_storage_save_global(keyfile);
+                       __connman_storage_save_global(keyfile);
+               }
+       }
 
        g_key_file_free(keyfile);
 
@@ -841,7 +860,7 @@ static DBusMessage *set_property(DBusConnection *conn,
        struct connman_technology *technology = data;
        DBusMessageIter iter, value;
        const char *name;
-       int type;
+       int type, err;
 
        DBG("conn %p", conn);
 
@@ -923,7 +942,9 @@ static DBusMessage *set_property(DBusConnection *conn,
                if (technology->type != CONNMAN_SERVICE_TYPE_WIFI)
                        return __connman_error_not_supported(msg);
 
-               if (strlen(str) < 8 || strlen(str) > 63)
+               err = __connman_service_check_passphrase(CONNMAN_SERVICE_SECURITY_PSK,
+                                                       str);
+               if (err < 0)
                        return __connman_error_passphrase_required(msg);
 
                if (g_strcmp0(technology->tethering_passphrase, str) != 0) {
@@ -1056,6 +1077,10 @@ static DBusMessage *scan(DBusConnection *conn, DBusMessage *msg, void *data)
        DBG("technology %p request from %s", technology,
                        dbus_message_get_sender(msg));
 
+       if (technology->type == CONNMAN_SERVICE_TYPE_P2P &&
+                               !technology->enabled)
+               return __connman_error_permission_denied(msg);
+
        dbus_message_ref(msg);
        technology->scan_pending =
                g_slist_prepend(technology->scan_pending, msg);
@@ -1145,6 +1170,13 @@ static void technology_put(struct connman_technology *technology)
 
        g_slist_free(technology->device_list);
 
+    if (technology->pending_reply) {
+        dbus_message_unref(technology->pending_reply);
+        technology->pending_reply = NULL;
+        g_source_remove(technology->pending_timeout);
+        technology->pending_timeout = 0;
+    }
+
        g_free(technology->path);
        g_free(technology->regdom);
        g_free(technology->tethering_ident);