We need the list of provisioned services so that
all the hidden ones can be scanned.
---
 Makefile.am         |    2 +-
 include/provision.h |   52 +++++++++++++++++++++++++++++++++
 src/config.c        |   81 +++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 134 insertions(+), 1 deletion(-)
 create mode 100644 include/provision.h

diff --git a/Makefile.am b/Makefile.am
index 9d713ae..ca0cf0b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -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
index 0000000..f154d4f
--- /dev/null
+++ b/include/provision.h
@@ -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 */
diff --git a/src/config.c b/src/config.c
index de43933..c7ab1d6 100644
--- a/src/config.c
+++ b/src/config.c
@@ -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;
+}
-- 
1.7.9.5

_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to