5 * Copyright (C) 2007-2013 Intel Corporation. All rights reserved.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
32 #include <sys/signalfd.h>
38 #include <sys/resource.h>
44 #define CONF_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]) - 1)
46 #define DEFAULT_INPUT_REQUEST_TIMEOUT (120 * 1000)
47 #define DEFAULT_BROWSER_LAUNCH_TIMEOUT (300 * 1000)
49 #define MAINFILE "main.conf"
50 #define CONFIGMAINFILE CONFIGDIR "/" MAINFILE
52 static char *default_auto_connect[] = {
59 static char *default_favorite_techs[] = {
64 static char *default_blacklist[] = {
76 char **pref_timeservers;
77 unsigned int *auto_connect;
78 unsigned int *favorite_techs;
79 unsigned int *preferred_techs;
80 unsigned int *always_connected_techs;
81 char **fallback_nameservers;
82 unsigned int timeout_inputreq;
83 unsigned int timeout_browserlaunch;
84 char **blacklisted_interfaces;
85 bool allow_hostname_updates;
86 bool allow_domainname_updates;
88 char **tethering_technologies;
89 bool persistent_tethering_mode;
91 char *vendor_class_id;
92 bool enable_online_check;
93 bool auto_connect_roaming_services;
95 bool use_gateways_as_timeservers;
97 char **cellular_interfaces;
98 bool tizen_tv_extension;
101 } connman_settings = {
103 .pref_timeservers = NULL,
104 .auto_connect = NULL,
105 .favorite_techs = NULL,
106 .preferred_techs = NULL,
107 .always_connected_techs = NULL,
108 .fallback_nameservers = NULL,
109 .timeout_inputreq = DEFAULT_INPUT_REQUEST_TIMEOUT,
110 .timeout_browserlaunch = DEFAULT_BROWSER_LAUNCH_TIMEOUT,
111 .blacklisted_interfaces = NULL,
112 .allow_hostname_updates = true,
113 .allow_domainname_updates = true,
114 .single_tech = false,
115 .tethering_technologies = NULL,
116 .persistent_tethering_mode = false,
117 .enable_6to4 = false,
118 .vendor_class_id = NULL,
119 .enable_online_check = true,
120 .auto_connect_roaming_services = false,
122 .use_gateways_as_timeservers = false,
123 #if defined TIZEN_EXT
124 .cellular_interfaces = NULL,
125 .tizen_tv_extension = false,
130 #define CONF_BG_SCAN "BackgroundScanning"
131 #define CONF_PREF_TIMESERVERS "FallbackTimeservers"
132 #define CONF_AUTO_CONNECT_TECHS "DefaultAutoConnectTechnologies"
133 #define CONF_FAVORITE_TECHS "DefaultFavoriteTechnologies"
134 #define CONF_ALWAYS_CONNECTED_TECHS "AlwaysConnectedTechnologies"
135 #define CONF_PREFERRED_TECHS "PreferredTechnologies"
136 #define CONF_FALLBACK_NAMESERVERS "FallbackNameservers"
137 #define CONF_TIMEOUT_INPUTREQ "InputRequestTimeout"
138 #define CONF_TIMEOUT_BROWSERLAUNCH "BrowserLaunchTimeout"
139 #define CONF_BLACKLISTED_INTERFACES "NetworkInterfaceBlacklist"
140 #define CONF_ALLOW_HOSTNAME_UPDATES "AllowHostnameUpdates"
141 #define CONF_ALLOW_DOMAINNAME_UPDATES "AllowDomainnameUpdates"
142 #define CONF_SINGLE_TECH "SingleConnectedTechnology"
143 #define CONF_TETHERING_TECHNOLOGIES "TetheringTechnologies"
144 #define CONF_PERSISTENT_TETHERING_MODE "PersistentTetheringMode"
145 #define CONF_ENABLE_6TO4 "Enable6to4"
146 #define CONF_VENDOR_CLASS_ID "VendorClassID"
147 #define CONF_ENABLE_ONLINE_CHECK "EnableOnlineCheck"
148 #define CONF_AUTO_CONNECT_ROAMING_SERVICES "AutoConnectRoamingServices"
149 #define CONF_ACD "AddressConflictDetection"
150 #define CONF_USE_GATEWAYS_AS_TIMESERVERS "UseGatewaysAsTimeservers"
151 #if defined TIZEN_EXT
152 #define CONF_CELLULAR_INTERFACE "NetworkCellularInterfaceList"
153 #define CONF_TIZEN_TV_EXT "TizenTVExtension"
154 #define CONF_ENABLE_AUTO_IP "EnableAutoIp"
157 static const char *supported_options[] = {
159 CONF_PREF_TIMESERVERS,
160 CONF_AUTO_CONNECT_TECHS,
161 CONF_ALWAYS_CONNECTED_TECHS,
162 CONF_PREFERRED_TECHS,
163 CONF_FALLBACK_NAMESERVERS,
164 CONF_TIMEOUT_INPUTREQ,
165 CONF_TIMEOUT_BROWSERLAUNCH,
166 CONF_BLACKLISTED_INTERFACES,
167 CONF_ALLOW_HOSTNAME_UPDATES,
168 CONF_ALLOW_DOMAINNAME_UPDATES,
170 CONF_TETHERING_TECHNOLOGIES,
171 CONF_PERSISTENT_TETHERING_MODE,
173 CONF_VENDOR_CLASS_ID,
174 CONF_ENABLE_ONLINE_CHECK,
175 CONF_AUTO_CONNECT_ROAMING_SERVICES,
177 CONF_USE_GATEWAYS_AS_TIMESERVERS,
178 #if defined TIZEN_EXT
179 CONF_CELLULAR_INTERFACE,
185 static GKeyFile *load_config(const char *file)
190 keyfile = g_key_file_new();
192 g_key_file_set_list_separator(keyfile, ',');
194 if (!g_key_file_load_from_file(keyfile, file, 0, &err)) {
195 if (err->code != G_FILE_ERROR_NOENT) {
196 connman_error("Parsing %s failed: %s", file,
201 g_key_file_free(keyfile);
208 static uint *parse_service_types(char **str_list, gsize len)
210 unsigned int *type_list;
212 enum connman_service_type type;
214 type_list = g_try_new0(unsigned int, len + 1);
220 while (str_list[i]) {
221 type = __connman_service_string2type(str_list[i]);
223 if (type != CONNMAN_SERVICE_TYPE_UNKNOWN) {
230 type_list[j] = CONNMAN_SERVICE_TYPE_UNKNOWN;
235 static char **parse_fallback_nameservers(char **nameservers, gsize len)
240 servers = g_try_new0(char *, len + 1);
246 while (nameservers[i]) {
247 if (connman_inet_check_ipaddress(nameservers[i]) > 0) {
248 servers[j] = g_strdup(nameservers[i]);
257 static void check_config(GKeyFile *config)
265 keys = g_key_file_get_groups(config, NULL);
267 for (j = 0; keys && keys[j]; j++) {
268 if (g_strcmp0(keys[j], "General") != 0)
269 connman_warn("Unknown group %s in %s",
275 keys = g_key_file_get_keys(config, "General", NULL, NULL);
277 for (j = 0; keys && keys[j]; j++) {
282 for (i = 0; supported_options[i]; i++) {
283 if (g_strcmp0(keys[j], supported_options[i]) == 0) {
288 if (!found && !supported_options[i])
289 connman_warn("Unknown option %s in %s",
296 #if defined TIZEN_EXT
297 static void check_Tizen_configuration(GKeyFile *config)
299 GError *error = NULL;
300 char **cellular_interfaces;
304 cellular_interfaces = g_key_file_get_string_list(config, "General",
305 CONF_CELLULAR_INTERFACE, &len, &error);
308 connman_settings.cellular_interfaces = cellular_interfaces;
310 g_clear_error(&error);
312 boolean = __connman_config_get_bool(config, "General",
313 CONF_TIZEN_TV_EXT, &error);
315 connman_settings.tizen_tv_extension = boolean;
317 g_clear_error(&error);
319 boolean = __connman_config_get_bool(config, "General",
320 CONF_ENABLE_AUTO_IP, &error);
322 connman_settings.auto_ip = boolean;
324 g_clear_error(&error);
327 static void set_nofile_inc(void)
332 rlim.rlim_cur = 8192;
333 rlim.rlim_max = 8192;
335 err = setrlimit(RLIMIT_NOFILE, &rlim);
337 DBG("fail to increase FILENO err(%d)", err);
343 static void parse_config(GKeyFile *config)
345 GError *error = NULL;
351 char *vendor_class_id;
356 connman_settings.auto_connect =
357 parse_service_types(default_auto_connect, CONF_ARRAY_SIZE(default_auto_connect));
358 connman_settings.favorite_techs =
359 parse_service_types(default_favorite_techs, CONF_ARRAY_SIZE(default_favorite_techs));
360 connman_settings.blacklisted_interfaces =
361 g_strdupv(default_blacklist);
365 DBG("parsing %s", MAINFILE);
367 boolean = g_key_file_get_boolean(config, "General",
368 CONF_BG_SCAN, &error);
370 connman_settings.bg_scan = boolean;
372 g_clear_error(&error);
374 timeservers = __connman_config_get_string_list(config, "General",
375 CONF_PREF_TIMESERVERS, NULL, &error);
377 connman_settings.pref_timeservers = timeservers;
379 g_clear_error(&error);
381 str_list = __connman_config_get_string_list(config, "General",
382 CONF_AUTO_CONNECT_TECHS, &len, &error);
385 connman_settings.auto_connect =
386 parse_service_types(str_list, len);
388 connman_settings.auto_connect =
389 parse_service_types(default_auto_connect, CONF_ARRAY_SIZE(default_auto_connect));
391 g_clear_error(&error);
393 str_list = __connman_config_get_string_list(config, "General",
394 CONF_FAVORITE_TECHS, &len, &error);
397 connman_settings.favorite_techs =
398 parse_service_types(str_list, len);
400 connman_settings.favorite_techs =
401 parse_service_types(default_favorite_techs, CONF_ARRAY_SIZE(default_favorite_techs));
403 g_strfreev(str_list);
405 g_clear_error(&error);
407 str_list = __connman_config_get_string_list(config, "General",
408 CONF_PREFERRED_TECHS, &len, &error);
411 connman_settings.preferred_techs =
412 parse_service_types(str_list, len);
414 g_strfreev(str_list);
416 g_clear_error(&error);
418 str_list = __connman_config_get_string_list(config, "General",
419 CONF_ALWAYS_CONNECTED_TECHS, &len, &error);
422 connman_settings.always_connected_techs =
423 parse_service_types(str_list, len);
425 g_strfreev(str_list);
427 g_clear_error(&error);
429 str_list = __connman_config_get_string_list(config, "General",
430 CONF_FALLBACK_NAMESERVERS, &len, &error);
433 connman_settings.fallback_nameservers =
434 parse_fallback_nameservers(str_list, len);
436 g_strfreev(str_list);
438 g_clear_error(&error);
440 timeout = g_key_file_get_integer(config, "General",
441 CONF_TIMEOUT_INPUTREQ, &error);
442 if (!error && timeout >= 0)
443 connman_settings.timeout_inputreq = timeout * 1000;
445 g_clear_error(&error);
447 timeout = g_key_file_get_integer(config, "General",
448 CONF_TIMEOUT_BROWSERLAUNCH, &error);
449 if (!error && timeout >= 0)
450 connman_settings.timeout_browserlaunch = timeout * 1000;
452 g_clear_error(&error);
454 interfaces = __connman_config_get_string_list(config, "General",
455 CONF_BLACKLISTED_INTERFACES, &len, &error);
458 connman_settings.blacklisted_interfaces = interfaces;
460 connman_settings.blacklisted_interfaces =
461 g_strdupv(default_blacklist);
463 g_clear_error(&error);
465 boolean = __connman_config_get_bool(config, "General",
466 CONF_ALLOW_HOSTNAME_UPDATES,
469 connman_settings.allow_hostname_updates = boolean;
471 g_clear_error(&error);
473 boolean = __connman_config_get_bool(config, "General",
474 CONF_ALLOW_DOMAINNAME_UPDATES,
477 connman_settings.allow_domainname_updates = boolean;
479 g_clear_error(&error);
481 boolean = __connman_config_get_bool(config, "General",
482 CONF_SINGLE_TECH, &error);
484 connman_settings.single_tech = boolean;
486 g_clear_error(&error);
488 tethering = __connman_config_get_string_list(config, "General",
489 CONF_TETHERING_TECHNOLOGIES, &len, &error);
492 connman_settings.tethering_technologies = tethering;
494 g_clear_error(&error);
496 boolean = __connman_config_get_bool(config, "General",
497 CONF_PERSISTENT_TETHERING_MODE,
500 connman_settings.persistent_tethering_mode = boolean;
502 g_clear_error(&error);
504 boolean = __connman_config_get_bool(config, "General",
505 CONF_ENABLE_6TO4, &error);
507 connman_settings.enable_6to4 = boolean;
509 g_clear_error(&error);
511 vendor_class_id = __connman_config_get_string(config, "General",
512 CONF_VENDOR_CLASS_ID, &error);
514 connman_settings.vendor_class_id = vendor_class_id;
516 g_clear_error(&error);
518 boolean = __connman_config_get_bool(config, "General",
519 CONF_ENABLE_ONLINE_CHECK, &error);
521 connman_settings.enable_online_check = boolean;
523 connman_info("Online check disabled by main config.");
526 g_clear_error(&error);
528 boolean = __connman_config_get_bool(config, "General",
529 CONF_AUTO_CONNECT_ROAMING_SERVICES, &error);
531 connman_settings.auto_connect_roaming_services = boolean;
533 g_clear_error(&error);
535 boolean = __connman_config_get_bool(config, "General", CONF_ACD, &error);
537 connman_settings.acd = boolean;
539 g_clear_error(&error);
541 boolean = __connman_config_get_bool(config, "General",
542 CONF_USE_GATEWAYS_AS_TIMESERVERS, &error);
544 connman_settings.use_gateways_as_timeservers = boolean;
546 g_clear_error(&error);
548 #if defined TIZEN_EXT
549 check_Tizen_configuration(config);
553 static int config_init(const char *file)
557 #if defined TIZEN_EXT
560 config = load_config(file);
561 check_config(config);
562 parse_config(config);
564 g_key_file_free(config);
569 static GMainLoop *main_loop = NULL;
571 static unsigned int __terminated = 0;
573 static gboolean signal_handler(GIOChannel *channel, GIOCondition cond,
576 struct signalfd_siginfo si;
580 if (cond & (G_IO_NVAL | G_IO_ERR | G_IO_HUP))
583 fd = g_io_channel_unix_get_fd(channel);
585 result = read(fd, &si, sizeof(si));
586 if (result != sizeof(si))
589 switch (si.ssi_signo) {
592 if (__terminated == 0) {
593 connman_info("Terminating");
594 g_main_loop_quit(main_loop);
604 static guint setup_signalfd(void)
612 sigaddset(&mask, SIGINT);
613 sigaddset(&mask, SIGTERM);
615 if (sigprocmask(SIG_BLOCK, &mask, NULL) < 0) {
616 perror("Failed to set signal mask");
620 fd = signalfd(-1, &mask, 0);
622 perror("Failed to create signal descriptor");
626 channel = g_io_channel_unix_new(fd);
628 g_io_channel_set_close_on_unref(channel, TRUE);
629 g_io_channel_set_encoding(channel, NULL, NULL);
630 g_io_channel_set_buffered(channel, FALSE);
632 source = g_io_add_watch(channel,
633 G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
634 signal_handler, NULL);
636 g_io_channel_unref(channel);
641 static void disconnect_callback(DBusConnection *conn, void *user_data)
643 connman_error("D-Bus disconnect");
645 g_main_loop_quit(main_loop);
648 static gchar *option_config = NULL;
649 static gchar *option_debug = NULL;
650 static gchar *option_device = NULL;
651 static gchar *option_plugin = NULL;
652 static gchar *option_nodevice = NULL;
653 static gchar *option_noplugin = NULL;
654 static gchar *option_wifi = NULL;
655 static gboolean option_detach = TRUE;
656 static gboolean option_dnsproxy = TRUE;
657 static gboolean option_backtrace = TRUE;
658 static gboolean option_version = FALSE;
660 static bool parse_debug(const char *key, const char *value,
661 gpointer user_data, GError **error)
665 char *prev = option_debug;
667 option_debug = g_strconcat(prev, ",", value, NULL);
670 option_debug = g_strdup(value);
673 g_free(option_debug);
674 option_debug = g_strdup("*");
680 static bool parse_noplugin(const char *key, const char *value,
681 gpointer user_data, GError **error)
683 if (option_noplugin) {
684 char *prev = option_noplugin;
686 option_noplugin = g_strconcat(prev, ",", value, NULL);
689 option_noplugin = g_strdup(value);
695 static GOptionEntry options[] = {
696 { "config", 'c', 0, G_OPTION_ARG_STRING, &option_config,
697 "Load the specified configuration file "
698 "instead of " CONFIGMAINFILE, "FILE" },
699 { "debug", 'd', G_OPTION_FLAG_OPTIONAL_ARG,
700 G_OPTION_ARG_CALLBACK, parse_debug,
701 "Specify debug options to enable", "DEBUG" },
702 { "device", 'i', 0, G_OPTION_ARG_STRING, &option_device,
703 "Specify networking devices or interfaces", "DEV,..." },
704 { "nodevice", 'I', 0, G_OPTION_ARG_STRING, &option_nodevice,
705 "Specify networking interfaces to ignore", "DEV,..." },
706 { "plugin", 'p', 0, G_OPTION_ARG_STRING, &option_plugin,
707 "Specify plugins to load", "NAME,..." },
708 { "noplugin", 'P', 0, G_OPTION_ARG_CALLBACK, &parse_noplugin,
709 "Specify plugins not to load", "NAME,..." },
710 { "wifi", 'W', 0, G_OPTION_ARG_STRING, &option_wifi,
711 "Specify driver for WiFi/Supplicant", "NAME" },
712 { "nodaemon", 'n', G_OPTION_FLAG_REVERSE,
713 G_OPTION_ARG_NONE, &option_detach,
714 "Don't fork daemon to background" },
715 { "nodnsproxy", 'r', G_OPTION_FLAG_REVERSE,
716 G_OPTION_ARG_NONE, &option_dnsproxy,
717 "Don't support DNS resolving" },
718 { "nobacktrace", 0, G_OPTION_FLAG_REVERSE,
719 G_OPTION_ARG_NONE, &option_backtrace,
720 "Don't print out backtrace information" },
721 { "version", 'v', 0, G_OPTION_ARG_NONE, &option_version,
722 "Show version information and exit" },
726 const char *connman_option_get_string(const char *key)
728 if (g_str_equal(key, CONF_VENDOR_CLASS_ID))
729 return connman_settings.vendor_class_id;
731 if (g_strcmp0(key, "wifi") == 0) {
733 return "nl80211,wext";
741 bool connman_setting_get_bool(const char *key)
743 if (g_str_equal(key, CONF_BG_SCAN))
744 return connman_settings.bg_scan;
746 if (g_str_equal(key, CONF_ALLOW_HOSTNAME_UPDATES))
747 return connman_settings.allow_hostname_updates;
749 if (g_str_equal(key, CONF_ALLOW_DOMAINNAME_UPDATES))
750 return connman_settings.allow_domainname_updates;
752 if (g_str_equal(key, CONF_SINGLE_TECH))
753 return connman_settings.single_tech;
755 if (g_str_equal(key, CONF_PERSISTENT_TETHERING_MODE))
756 return connman_settings.persistent_tethering_mode;
758 if (g_str_equal(key, CONF_ENABLE_6TO4))
759 return connman_settings.enable_6to4;
761 if (g_str_equal(key, CONF_ENABLE_ONLINE_CHECK))
762 return connman_settings.enable_online_check;
764 if (g_str_equal(key, CONF_AUTO_CONNECT_ROAMING_SERVICES))
765 return connman_settings.auto_connect_roaming_services;
767 if (g_str_equal(key, CONF_ACD))
768 return connman_settings.acd;
770 if (g_str_equal(key, CONF_USE_GATEWAYS_AS_TIMESERVERS))
771 return connman_settings.use_gateways_as_timeservers;
773 #if defined TIZEN_EXT
774 if (g_str_equal(key, CONF_ENABLE_AUTO_IP))
775 return connman_settings.auto_ip;
781 char **connman_setting_get_string_list(const char *key)
783 if (g_str_equal(key, CONF_PREF_TIMESERVERS))
784 return connman_settings.pref_timeservers;
786 if (g_str_equal(key, CONF_FALLBACK_NAMESERVERS))
787 return connman_settings.fallback_nameservers;
789 if (g_str_equal(key, CONF_BLACKLISTED_INTERFACES))
790 return connman_settings.blacklisted_interfaces;
792 if (g_str_equal(key, CONF_TETHERING_TECHNOLOGIES))
793 return connman_settings.tethering_technologies;
795 #if defined TIZEN_EXT
796 if (g_str_equal(key, CONF_CELLULAR_INTERFACE))
797 return connman_settings.cellular_interfaces;
803 unsigned int *connman_setting_get_uint_list(const char *key)
805 if (g_str_equal(key, CONF_AUTO_CONNECT_TECHS))
806 return connman_settings.auto_connect;
808 if (g_str_equal(key, CONF_FAVORITE_TECHS))
809 return connman_settings.favorite_techs;
811 if (g_str_equal(key, CONF_PREFERRED_TECHS))
812 return connman_settings.preferred_techs;
814 if (g_str_equal(key, CONF_ALWAYS_CONNECTED_TECHS))
815 return connman_settings.always_connected_techs;
820 unsigned int connman_timeout_input_request(void)
822 return connman_settings.timeout_inputreq;
825 unsigned int connman_timeout_browser_launch(void)
827 return connman_settings.timeout_browserlaunch;
830 int main(int argc, char *argv[])
832 GOptionContext *context;
833 GError *error = NULL;
834 DBusConnection *conn;
838 context = g_option_context_new(NULL);
839 g_option_context_add_main_entries(context, options, NULL);
841 if (!g_option_context_parse(context, &argc, &argv, &error)) {
843 g_printerr("%s\n", error->message);
846 g_printerr("An unknown error occurred\n");
850 g_option_context_free(context);
852 if (option_version) {
853 printf("%s\n", VERSION);
859 perror("Can't start daemon");
864 if (mkdir(STORAGEDIR, S_IRUSR | S_IWUSR | S_IXUSR |
865 S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0) {
867 perror("Failed to create storage directory");
872 main_loop = g_main_loop_new(NULL, FALSE);
874 signal = setup_signalfd();
876 dbus_error_init(&err);
878 conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, CONNMAN_SERVICE, &err);
880 if (dbus_error_is_set(&err)) {
881 fprintf(stderr, "%s\n", err.message);
882 dbus_error_free(&err);
884 fprintf(stderr, "Can't register with system bus\n");
888 g_dbus_set_disconnect_function(conn, disconnect_callback, NULL, NULL);
890 __connman_log_init(argv[0], option_debug, option_detach,
891 option_backtrace, "Connection Manager", VERSION);
893 __connman_dbus_init(conn);
896 config_init(CONFIGMAINFILE);
898 config_init(option_config);
900 __connman_util_init();
901 __connman_inotify_init();
902 __connman_technology_init();
903 __connman_notifier_init();
904 __connman_agent_init();
905 __connman_service_init();
906 __connman_peer_service_init();
907 __connman_peer_init();
908 #if defined TIZEN_EXT_WIFI_MESH
909 __connman_mesh_init();
910 #endif /* TIZEN_EXT_WIFI_MESH */
911 __connman_provider_init();
912 __connman_network_init();
913 __connman_config_init();
914 __connman_device_init(option_device, option_nodevice);
916 __connman_ippool_init();
917 __connman_firewall_init();
918 __connman_nat_init();
919 __connman_tethering_init();
920 __connman_counter_init();
921 __connman_manager_init();
922 __connman_stats_init();
923 __connman_clock_init();
925 __connman_ipconfig_init();
926 __connman_rtnl_init();
927 __connman_task_init();
928 __connman_proxy_init();
929 __connman_detect_init();
930 __connman_session_init();
931 __connman_timeserver_init();
932 __connman_connection_init();
934 __connman_plugin_init(option_plugin, option_noplugin);
936 __connman_resolver_init(option_dnsproxy);
937 __connman_rtnl_start();
938 __connman_dhcp_init();
939 __connman_dhcpv6_init();
940 __connman_wpad_init();
941 __connman_wispr_init();
942 #if !defined TIZEN_EXT
943 __connman_rfkill_init();
944 __connman_machine_init();
947 g_free(option_config);
948 g_free(option_device);
949 g_free(option_plugin);
950 g_free(option_nodevice);
951 g_free(option_noplugin);
953 g_main_loop_run(main_loop);
955 g_source_remove(signal);
957 #if !defined TIZEN_EXT
958 __connman_machine_cleanup();
959 __connman_rfkill_cleanup();
961 __connman_wispr_cleanup();
962 __connman_wpad_cleanup();
963 __connman_dhcpv6_cleanup();
964 __connman_session_cleanup();
965 __connman_plugin_cleanup();
966 __connman_provider_cleanup();
967 __connman_connection_cleanup();
968 __connman_timeserver_cleanup();
969 __connman_detect_cleanup();
970 __connman_proxy_cleanup();
971 __connman_task_cleanup();
972 __connman_rtnl_cleanup();
973 __connman_resolver_cleanup();
975 __connman_clock_cleanup();
976 __connman_stats_cleanup();
977 __connman_config_cleanup();
978 __connman_manager_cleanup();
979 __connman_counter_cleanup();
980 __connman_tethering_cleanup();
981 __connman_nat_cleanup();
982 __connman_firewall_cleanup();
983 __connman_peer_service_cleanup();
984 __connman_peer_cleanup();
985 #if defined TIZEN_EXT_WIFI_MESH
986 __connman_mesh_cleanup();
987 #endif /* TIZEN_EXT_WIFI_MESH */
988 __connman_ippool_cleanup();
989 __connman_device_cleanup();
990 __connman_network_cleanup();
991 __connman_dhcp_cleanup();
992 __connman_service_cleanup();
993 __connman_agent_cleanup();
994 __connman_ipconfig_cleanup();
995 __connman_notifier_cleanup();
996 __connman_technology_cleanup();
997 __connman_inotify_cleanup();
999 __connman_util_cleanup();
1000 __connman_dbus_cleanup();
1002 __connman_log_cleanup(option_backtrace);
1004 dbus_connection_unref(conn);
1006 g_main_loop_unref(main_loop);
1008 if (connman_settings.pref_timeservers)
1009 g_strfreev(connman_settings.pref_timeservers);
1011 g_free(connman_settings.auto_connect);
1012 g_free(connman_settings.favorite_techs);
1013 g_free(connman_settings.preferred_techs);
1014 g_strfreev(connman_settings.fallback_nameservers);
1015 g_strfreev(connman_settings.blacklisted_interfaces);
1016 g_strfreev(connman_settings.tethering_technologies);
1018 g_free(option_debug);
1019 g_free(option_wifi);