*
* Connection Manager
*
- * Copyright (C) 2007-2010 Intel Corporation. All rights reserved.
+ * Copyright (C) 2007-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
#include <getopt.h>
#include <sys/stat.h>
#include <net/if.h>
+#include <netdb.h>
#include <gdbus.h>
-#ifdef HAVE_CAPNG
-#include <cap-ng.h>
-#endif
-
#include "connman.h"
static struct {
connman_bool_t bg_scan;
char **pref_timeservers;
unsigned int *auto_connect;
+ unsigned int *preferred_techs;
+ char **fallback_nameservers;
} connman_settings = {
.bg_scan = TRUE,
.pref_timeservers = NULL,
.auto_connect = NULL,
+ .preferred_techs = NULL,
+ .fallback_nameservers = NULL,
};
static GKeyFile *load_config(const char *file)
return type_list;
}
+static char **parse_fallback_nameservers(char **nameservers, gsize len)
+{
+ char **servers;
+ int i, j;
+ struct addrinfo hints;
+ struct addrinfo *addr;
+
+ servers = g_try_new0(char *, len + 1);
+ if (servers == NULL)
+ return NULL;
+
+ i = 0;
+ j = 0;
+ while (nameservers[i] != NULL) {
+ memset(&hints, 0, sizeof(struct addrinfo));
+ hints.ai_flags = AI_NUMERICHOST;
+ addr = NULL;
+ if (getaddrinfo(nameservers[i], NULL, &hints, &addr) == 0) {
+ servers[j] = g_strdup(nameservers[i]);
+ j += 1;
+ }
+
+ freeaddrinfo(addr);
+ i += 1;
+ }
+
+ return servers;
+}
+
static void parse_config(GKeyFile *config)
{
GError *error = NULL;
"wifi",
"ethernet",
"cellular",
+ NULL
};
- if (config == NULL)
+ if (config == NULL) {
+ connman_settings.auto_connect =
+ parse_service_types(default_auto_connect, 3);
return;
+ }
DBG("parsing main.conf");
g_strfreev(str_list);
g_clear_error(&error);
+
+ str_list = g_key_file_get_string_list(config, "General",
+ "PreferredTechnologies", &len, &error);
+
+ if (error == NULL)
+ connman_settings.preferred_techs =
+ parse_service_types(str_list, len);
+
+ g_strfreev(str_list);
+
+ g_clear_error(&error);
+
+ str_list = g_key_file_get_string_list(config, "General",
+ "FallbackNameservers", &len, &error);
+
+ if (error == NULL)
+ connman_settings.fallback_nameservers =
+ parse_fallback_nameservers(str_list, len);
+
+ g_strfreev(str_list);
+
+ g_clear_error(&error);
}
static GMainLoop *main_loop = NULL;
if (g_str_equal(key, "FallbackTimeservers") == TRUE)
return connman_settings.pref_timeservers;
+ if (g_str_equal(key, "FallbackNameservers") == TRUE)
+ return connman_settings.fallback_nameservers;
+
return NULL;
}
if (g_str_equal(key, "DefaultAutoConnectTechnologies") == TRUE)
return connman_settings.auto_connect;
+ if (g_str_equal(key, "PreferredTechnologies") == TRUE)
+ return connman_settings.preferred_techs;
+
return NULL;
}
GKeyFile *config;
guint signal;
-#ifdef HAVE_CAPNG
- /* Drop capabilities */
-#endif
-
#ifdef NEED_THREADS
if (g_thread_supported() == FALSE)
g_thread_init(NULL);
__connman_dbus_init(conn);
config = load_config(CONFIGDIR "/main.conf");
-
parse_config(config);
+ if (config != NULL)
+ g_key_file_free(config);
__connman_storage_migrate();
__connman_technology_init();
g_main_loop_unref(main_loop);
- if (config)
- g_key_file_free(config);
-
if (connman_settings.pref_timeservers != NULL)
g_strfreev(connman_settings.pref_timeservers);
g_free(connman_settings.auto_connect);
+ g_free(connman_settings.preferred_techs);
+ g_strfreev(connman_settings.fallback_nameservers);
g_free(option_debug);