config: Get configurations that are provisioned
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Tue, 10 Jul 2012 15:13:47 +0000 (18:13 +0300)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 13 Jul 2012 09:38:48 +0000 (06:38 -0300)
We need the list of provisioned services so that
all the hidden ones can be scanned.

Makefile.am
include/provision.h [new file with mode: 0644]
src/config.c

index 9d713ae..ca0cf0b 100644 (file)
@@ -7,7 +7,7 @@ include_HEADERS = include/types.h include/log.h include/plugin.h \
                        include/notifier.h include/service.h \
                        include/resolver.h include/ipconfig.h \
                        include/device.h include/network.h include/inet.h \
-                       include/storage.h
+                       include/storage.h include/provision.h
 
 nodist_include_HEADERS = include/version.h
 
diff --git a/include/provision.h b/include/provision.h
new file mode 100644 (file)
index 0000000..f154d4f
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ *
+ *  Connection Manager
+ *
+ *  Copyright (C) 2012  Intel Corporation. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifndef __CONNMAN_PROVISION_H
+#define __CONNMAN_PROVISION_H
+
+#include <connman/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * SECTION:provision
+ * @title: Provisioned configuration premitives
+ * @short_description: Functions for provision configuration handling
+ */
+
+struct connman_config_entry {
+       char *ident;
+       char *name;
+       void *ssid;
+       unsigned int ssid_len;
+       connman_bool_t hidden;
+};
+
+struct connman_config_entry **connman_config_get_entries(void);
+void connman_config_free_entries(struct connman_config_entry **entries);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __CONNMAN_PROVISION_H */
index de43933..c7ab1d6 100644 (file)
@@ -31,6 +31,7 @@
 #include <sys/inotify.h>
 #include <glib.h>
 
+#include <connman/provision.h>
 #include "connman.h"
 
 struct connman_config_service {
@@ -947,3 +948,83 @@ int __connman_config_provision_service_ident(struct connman_service *service,
 
        return ret;
 }
+
+struct connman_config_entry **connman_config_get_entries(void)
+{
+       GHashTableIter iter_file, iter_config;
+       gpointer value, key;
+       struct connman_config_entry **entries = NULL;
+       int i = 0, count;
+
+       g_hash_table_iter_init(&iter_file, config_table);
+       while (g_hash_table_iter_next(&iter_file, &key, &value) == TRUE) {
+               struct connman_config *config_file = value;
+
+               count = g_hash_table_size(config_file->service_table);
+
+               entries = g_try_realloc(entries, (i + count + 1) *
+                                       sizeof(struct connman_config_entry *));
+               if (entries == NULL)
+                       return NULL;
+
+               g_hash_table_iter_init(&iter_config,
+                                               config_file->service_table);
+               while (g_hash_table_iter_next(&iter_config, &key,
+                                                       &value) == TRUE) {
+                       struct connman_config_service *config = value;
+
+                       entries[i] = g_try_new0(struct connman_config_entry,
+                                               1);
+                       if (entries[i] == NULL)
+                               goto cleanup;
+
+                       entries[i]->ident = g_strdup(config->ident);
+                       entries[i]->name = g_strdup(config->name);
+                       entries[i]->ssid = g_try_malloc0(config->ssid_len + 1);
+                       if (entries[i]->ssid == NULL)
+                               goto cleanup;
+
+                       memcpy(entries[i]->ssid, config->ssid,
+                                                       config->ssid_len);
+                       entries[i]->ssid_len = config->ssid_len;
+                       entries[i]->hidden = config->hidden;
+
+                       i++;
+               }
+       }
+
+       if (entries != NULL) {
+               entries = g_try_realloc(entries, (i + 1) *
+                                       sizeof(struct connman_config_entry *));
+               if (entries == NULL)
+                       return NULL;
+
+               entries[i] = NULL;
+
+               DBG("%d provisioned AP found", i);
+       }
+
+       return entries;
+
+cleanup:
+       connman_config_free_entries(entries);
+       return NULL;
+}
+
+void connman_config_free_entries(struct connman_config_entry **entries)
+{
+       int i;
+
+       if (entries == NULL)
+               return;
+
+       for (i = 0; entries[i]; i++) {
+               g_free(entries[i]->ident);
+               g_free(entries[i]->name);
+               g_free(entries[i]->ssid);
+               g_free(entries[i]);
+       }
+
+       g_free(entries);
+       return;
+}