Merge tag 'upstream/1.41' into tizen
[platform/upstream/connman.git] / src / main.c
1 /*
2  *
3  *  Connection Manager
4  *
5  *  Copyright (C) 2007-2013  Intel Corporation. All rights reserved.
6  *
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.
10  *
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.
15  *
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
19  *
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <errno.h>
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <unistd.h>
30 #include <string.h>
31 #include <signal.h>
32 #include <sys/signalfd.h>
33 #include <getopt.h>
34 #include <sys/stat.h>
35 #include <net/if.h>
36 #include <netdb.h>
37 #include <sys/time.h>
38 #include <sys/resource.h>
39
40 #include <gdbus.h>
41
42 #include "connman.h"
43
44 #define CONF_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]) - 1)
45
46 #define DEFAULT_INPUT_REQUEST_TIMEOUT (120 * 1000)
47 #define DEFAULT_BROWSER_LAUNCH_TIMEOUT (300 * 1000)
48
49 #define DEFAULT_ONLINE_CHECK_IPV4_URL "http://ipv4.connman.net/online/status.html"
50 #define DEFAULT_ONLINE_CHECK_IPV6_URL "http://ipv6.connman.net/online/status.html"
51
52 /*
53  * We set the integer to 1 sec so that we have a chance to get
54  * necessary IPv6 router advertisement messages that might have
55  * DNS data etc.
56  */
57 #define DEFAULT_ONLINE_CHECK_INITIAL_INTERVAL 1
58 #define DEFAULT_ONLINE_CHECK_MAX_INTERVAL 12
59
60 #if defined TIZEN_EXT
61 #define DEFAULT_WIFI_INTERFACE "wlan0"
62 #define CONTAINER_FILE "/run/systemd/container"
63 #endif
64
65 #define MAINFILE "main.conf"
66 #define CONFIGMAINFILE CONFIGDIR "/" MAINFILE
67
68 static char *default_auto_connect[] = {
69         "wifi",
70         "ethernet",
71         "cellular",
72         NULL
73 };
74
75 static char *default_favorite_techs[] = {
76         "ethernet",
77         NULL
78 };
79
80 static char *default_blacklist[] = {
81         "vmnet",
82         "vboxnet",
83         "virbr",
84         "ifb",
85         "ve-",
86         "vb-",
87         NULL
88 };
89
90 static struct {
91         bool bg_scan;
92         char **pref_timeservers;
93         unsigned int *auto_connect;
94         unsigned int *favorite_techs;
95         unsigned int *preferred_techs;
96         unsigned int *always_connected_techs;
97         char **fallback_nameservers;
98         unsigned int timeout_inputreq;
99         unsigned int timeout_browserlaunch;
100         char **blacklisted_interfaces;
101         bool allow_hostname_updates;
102         bool allow_domainname_updates;
103         bool single_tech;
104         char **tethering_technologies;
105         bool persistent_tethering_mode;
106         bool enable_6to4;
107         char *vendor_class_id;
108         bool enable_online_check;
109         bool enable_online_to_ready_transition;
110         char *online_check_ipv4_url;
111         char *online_check_ipv6_url;
112         unsigned int online_check_initial_interval;
113         unsigned int online_check_max_interval;
114         bool auto_connect_roaming_services;
115         bool acd;
116         bool use_gateways_as_timeservers;
117 #if defined TIZEN_EXT
118         char **cellular_interfaces;
119         bool tizen_tv_extension;
120         bool auto_ip;
121         char *global_nameserver;
122         bool supplicant_debug;
123         char *def_wifi_ifname;
124         bool file_log;
125         bool dlog_log;
126         bool simple_log;
127         bool wifi_roam_scan;
128         bool wifi_roam;
129 #endif
130 } connman_settings  = {
131         .bg_scan = true,
132         .pref_timeservers = NULL,
133         .auto_connect = NULL,
134         .favorite_techs = NULL,
135         .preferred_techs = NULL,
136         .always_connected_techs = NULL,
137         .fallback_nameservers = NULL,
138         .timeout_inputreq = DEFAULT_INPUT_REQUEST_TIMEOUT,
139         .timeout_browserlaunch = DEFAULT_BROWSER_LAUNCH_TIMEOUT,
140         .blacklisted_interfaces = NULL,
141         .allow_hostname_updates = true,
142         .allow_domainname_updates = true,
143         .single_tech = false,
144         .tethering_technologies = NULL,
145         .persistent_tethering_mode = false,
146         .enable_6to4 = false,
147         .vendor_class_id = NULL,
148         .enable_online_check = true,
149         .enable_online_to_ready_transition = false,
150         .online_check_ipv4_url = NULL,
151         .online_check_ipv6_url = NULL,
152         .online_check_initial_interval = DEFAULT_ONLINE_CHECK_INITIAL_INTERVAL,
153         .online_check_max_interval = DEFAULT_ONLINE_CHECK_MAX_INTERVAL,
154         .auto_connect_roaming_services = false,
155         .acd = false,
156         .use_gateways_as_timeservers = false,
157 #if defined TIZEN_EXT
158         .cellular_interfaces = NULL,
159         .tizen_tv_extension = false,
160         .auto_ip = true,
161         .global_nameserver = NULL,
162         .supplicant_debug = false,
163         .def_wifi_ifname = DEFAULT_WIFI_INTERFACE,
164         .file_log = true,
165         .dlog_log = true,
166         .simple_log = true,
167         .wifi_roam_scan = false,
168         .wifi_roam = false,
169 #endif
170 };
171
172 #if defined TIZEN_EXT
173 static struct {
174         /* BSSID */
175         char *ins_preferred_freq_bssid;
176         bool ins_last_connected_bssid;
177         bool ins_assoc_reject;
178         bool ins_signal_bssid;
179         unsigned int ins_preferred_freq_bssid_score;
180         unsigned int ins_last_connected_bssid_score;
181         unsigned int ins_assoc_reject_score;
182         /* SSID */
183         bool ins_last_user_selection;
184         unsigned int ins_last_user_selection_time;
185         bool ins_last_connected;
186         char *ins_preferred_freq;
187         char **ins_security_priority;
188         unsigned int ins_security_priority_count;
189         bool ins_signal;
190         bool ins_internet;
191         unsigned int ins_last_user_selection_score;
192         unsigned int ins_last_connected_score;
193         unsigned int ins_preferred_freq_score;
194         unsigned int ins_security_priority_score;
195         unsigned int ins_internet_score;
196         /* Common */
197         int ins_signal_level3_5ghz;
198         int ins_signal_level3_24ghz;
199 } connman_ins_settings = {
200         /* BSSID */
201         .ins_preferred_freq_bssid = NULL,
202         .ins_last_connected_bssid = true,
203         .ins_assoc_reject = true,
204         .ins_signal_bssid = true,
205         .ins_preferred_freq_bssid_score = 20,
206         .ins_last_connected_bssid_score = 20,
207         .ins_assoc_reject_score = 10,
208         /* SSID */
209         .ins_last_user_selection = true,
210         .ins_last_user_selection_time = 480,
211         .ins_last_connected = true,
212         .ins_preferred_freq = NULL,
213         .ins_security_priority = NULL,
214         .ins_security_priority_count = 0,
215         .ins_signal = true,
216         .ins_internet = true,
217         .ins_last_user_selection_score = 30,
218         .ins_last_connected_score = 30,
219         .ins_preferred_freq_score = 60,
220         .ins_security_priority_score = 5,
221         .ins_internet_score = 30,
222         /* Common */
223         .ins_signal_level3_5ghz = -76,
224         .ins_signal_level3_24ghz = -74,
225 };
226 #endif
227
228 #define CONF_BG_SCAN                    "BackgroundScanning"
229 #define CONF_PREF_TIMESERVERS           "FallbackTimeservers"
230 #define CONF_AUTO_CONNECT_TECHS         "DefaultAutoConnectTechnologies"
231 #define CONF_FAVORITE_TECHS             "DefaultFavoriteTechnologies"
232 #define CONF_ALWAYS_CONNECTED_TECHS     "AlwaysConnectedTechnologies"
233 #define CONF_PREFERRED_TECHS            "PreferredTechnologies"
234 #define CONF_FALLBACK_NAMESERVERS       "FallbackNameservers"
235 #define CONF_TIMEOUT_INPUTREQ           "InputRequestTimeout"
236 #define CONF_TIMEOUT_BROWSERLAUNCH      "BrowserLaunchTimeout"
237 #define CONF_BLACKLISTED_INTERFACES     "NetworkInterfaceBlacklist"
238 #define CONF_ALLOW_HOSTNAME_UPDATES     "AllowHostnameUpdates"
239 #define CONF_ALLOW_DOMAINNAME_UPDATES   "AllowDomainnameUpdates"
240 #define CONF_SINGLE_TECH                "SingleConnectedTechnology"
241 #define CONF_TETHERING_TECHNOLOGIES      "TetheringTechnologies"
242 #define CONF_PERSISTENT_TETHERING_MODE  "PersistentTetheringMode"
243 #define CONF_ENABLE_6TO4                "Enable6to4"
244 #define CONF_VENDOR_CLASS_ID            "VendorClassID"
245 #define CONF_ENABLE_ONLINE_CHECK        "EnableOnlineCheck"
246 #define CONF_ENABLE_ONLINE_TO_READY_TRANSITION "EnableOnlineToReadyTransition"
247 #define CONF_ONLINE_CHECK_IPV4_URL      "OnlineCheckIPv4URL"
248 #define CONF_ONLINE_CHECK_IPV6_URL      "OnlineCheckIPv6URL"
249 #define CONF_ONLINE_CHECK_INITIAL_INTERVAL "OnlineCheckInitialInterval"
250 #define CONF_ONLINE_CHECK_MAX_INTERVAL     "OnlineCheckMaxInterval"
251 #define CONF_AUTO_CONNECT_ROAMING_SERVICES "AutoConnectRoamingServices"
252 #define CONF_ACD                        "AddressConflictDetection"
253 #define CONF_USE_GATEWAYS_AS_TIMESERVERS "UseGatewaysAsTimeservers"
254 #if defined TIZEN_EXT
255 #define CONF_CELLULAR_INTERFACE         "NetworkCellularInterfaceList"
256 #define CONF_TIZEN_TV_EXT                       "TizenTVExtension"
257 #define CONF_ENABLE_AUTO_IP                     "EnableAutoIp"
258 #define CONF_GLOBAL_NAMESERVER          "GlobalNameserver"
259 #define CONF_CONNMAN_SUPPLICANT_DEBUG   "ConnmanSupplicantDebug"
260 #define CONF_CONNMAN_WIFI_DEF_IFNAME    "DefaultWifiInterface"
261 #define CONF_CONNMAN_FILE_LOG           "FileLogging"
262 #define CONF_CONNMAN_DLOG_LOG           "DlogLogging"
263 #define CONF_CONNMAN_SIMPLIFIED_LOG     "SimplifiedLog"
264 #define CONF_CONNMAN_WIFI_ROAM_SCAN     "WifiRoamingScan"
265 #define CONF_CONNMAN_WIFI_ROAM          "WifiRoaming"
266 #endif
267
268 #if defined TIZEN_EXT
269 /* BSSID */
270 #define CONF_INS_PREFERRED_FREQ_BSSID        "INSPreferredFreqBSSID"
271 #define CONF_INS_PREFERRED_FREQ_BSSID_SCORE  "INSPreferredFreqBSSIDScore"
272 #define CONF_INS_LAST_CONNECTED_BSSID        "INSLastConnectedBSSID"
273 #define CONF_INS_LAST_CONNECTED_BSSID_SCORE  "INSLastConnectedBSSIDScore"
274 #define CONF_INS_ASSOC_REJECT                "INSAssocReject"
275 #define CONF_INS_ASSOC_REJECT_SCORE          "INSAssocRejectScore"
276 #define CONF_INS_SIGNAL_BSSID                "INSSignalBSSID"
277 /* SSID */
278 #define CONF_INS_LAST_USER_SELECTION         "INSLastUserSelection"
279 #define CONF_INS_LAST_USER_SELECTION_TIME    "INSLastUserSelectionTime"
280 #define CONF_INS_LAST_USER_SELECTION_SCORE   "INSLastUserSelectionScore"
281 #define CONF_INS_LAST_CONNECTED              "INSLastConnected"
282 #define CONF_INS_LAST_CONNECTED_SCORE        "INSLastConnectedScore"
283 #define CONF_INS_PREFERRED_FREQ              "INSPreferredFreq"
284 #define CONF_INS_PREFERRED_FREQ_SCORE        "INSPreferredFreqScore"
285 #define CONF_INS_SECURITY_PRIORITY           "INSSecurityPriority"
286 #define CONF_INS_SECURITY_PRIORITY_COUNT     "INSSecurityPriorityCount"
287 #define CONF_INS_SECURITY_PRIORITY_SCORE     "INSSecurityPriorityScore"
288 #define CONF_INS_SIGNAL                      "INSSignal"
289 #define CONF_INS_INTERNET                    "INSInternet"
290 #define CONF_INS_INTERNET_SCORE              "INSInternetScore"
291 /* Common */
292 #define CONF_INS_SIGNAL_LEVEL3_5GHZ          "INSSignalLevel3_5GHz"
293 #define CONF_INS_SIGNAL_LEVEL3_24GHZ         "INSSignalLevel3_24GHz"
294 #endif
295
296 static const char *supported_options[] = {
297         CONF_BG_SCAN,
298         CONF_PREF_TIMESERVERS,
299         CONF_AUTO_CONNECT_TECHS,
300         CONF_FAVORITE_TECHS,
301         CONF_ALWAYS_CONNECTED_TECHS,
302         CONF_PREFERRED_TECHS,
303         CONF_FALLBACK_NAMESERVERS,
304         CONF_TIMEOUT_INPUTREQ,
305         CONF_TIMEOUT_BROWSERLAUNCH,
306         CONF_BLACKLISTED_INTERFACES,
307         CONF_ALLOW_HOSTNAME_UPDATES,
308         CONF_ALLOW_DOMAINNAME_UPDATES,
309         CONF_SINGLE_TECH,
310         CONF_TETHERING_TECHNOLOGIES,
311         CONF_PERSISTENT_TETHERING_MODE,
312         CONF_ENABLE_6TO4,
313         CONF_VENDOR_CLASS_ID,
314         CONF_ENABLE_ONLINE_CHECK,
315         CONF_ENABLE_ONLINE_TO_READY_TRANSITION,
316         CONF_ONLINE_CHECK_IPV4_URL,
317         CONF_ONLINE_CHECK_IPV6_URL,
318         CONF_ONLINE_CHECK_INITIAL_INTERVAL,
319         CONF_ONLINE_CHECK_MAX_INTERVAL,
320         CONF_AUTO_CONNECT_ROAMING_SERVICES,
321         CONF_ACD,
322         CONF_USE_GATEWAYS_AS_TIMESERVERS,
323 #if defined TIZEN_EXT
324         CONF_CELLULAR_INTERFACE,
325         CONF_TIZEN_TV_EXT,
326         CONF_ENABLE_AUTO_IP,
327         CONF_GLOBAL_NAMESERVER,
328         CONF_CONNMAN_SUPPLICANT_DEBUG,
329         CONF_CONNMAN_WIFI_DEF_IFNAME,
330         CONF_CONNMAN_FILE_LOG,
331         CONF_CONNMAN_DLOG_LOG,
332         CONF_CONNMAN_SIMPLIFIED_LOG,
333         CONF_CONNMAN_WIFI_ROAM_SCAN,
334         CONF_CONNMAN_WIFI_ROAM,
335 #endif
336         NULL
337 };
338
339 #if defined TIZEN_EXT
340 static const char *supported_ins_options[] = {
341         /* BSSID */
342         CONF_INS_PREFERRED_FREQ_BSSID,
343         CONF_INS_PREFERRED_FREQ_BSSID_SCORE,
344         CONF_INS_LAST_CONNECTED_BSSID,
345         CONF_INS_LAST_CONNECTED_BSSID_SCORE,
346         CONF_INS_ASSOC_REJECT,
347         CONF_INS_ASSOC_REJECT_SCORE,
348         CONF_INS_SIGNAL_BSSID,
349         /* SSID */
350         CONF_INS_LAST_USER_SELECTION,
351         CONF_INS_LAST_USER_SELECTION_TIME,
352         CONF_INS_LAST_USER_SELECTION_SCORE,
353         CONF_INS_LAST_CONNECTED,
354         CONF_INS_LAST_CONNECTED_SCORE,
355         CONF_INS_PREFERRED_FREQ,
356         CONF_INS_PREFERRED_FREQ_SCORE,
357         CONF_INS_SECURITY_PRIORITY,
358         CONF_INS_SECURITY_PRIORITY_COUNT,
359         CONF_INS_SECURITY_PRIORITY_SCORE,
360         CONF_INS_SIGNAL,
361         CONF_INS_INTERNET,
362         CONF_INS_INTERNET_SCORE,
363         /* Common */
364         CONF_INS_SIGNAL_LEVEL3_5GHZ,
365         CONF_INS_SIGNAL_LEVEL3_24GHZ,
366         NULL
367 };
368 #endif
369
370 static GKeyFile *load_config(const char *file)
371 {
372         GError *err = NULL;
373         GKeyFile *keyfile;
374
375         keyfile = g_key_file_new();
376
377         g_key_file_set_list_separator(keyfile, ',');
378
379         if (!g_key_file_load_from_file(keyfile, file, 0, &err)) {
380                 if (err->code != G_FILE_ERROR_NOENT) {
381                         connman_error("Parsing %s failed: %s", file,
382                                                                 err->message);
383                 }
384
385                 g_error_free(err);
386                 g_key_file_free(keyfile);
387                 return NULL;
388         }
389
390         return keyfile;
391 }
392
393 static uint *parse_service_types(char **str_list, gsize len)
394 {
395         unsigned int *type_list;
396         int i, j;
397         enum connman_service_type type;
398
399         type_list = g_try_new0(unsigned int, len + 1);
400         if (!type_list)
401                 return NULL;
402
403         i = 0;
404         j = 0;
405         while (str_list[i]) {
406                 type = __connman_service_string2type(str_list[i]);
407
408                 if (type != CONNMAN_SERVICE_TYPE_UNKNOWN) {
409                         type_list[j] = type;
410                         j += 1;
411                 }
412                 i += 1;
413         }
414
415         type_list[j] = CONNMAN_SERVICE_TYPE_UNKNOWN;
416
417         return type_list;
418 }
419
420 static char **parse_fallback_nameservers(char **nameservers, gsize len)
421 {
422         char **servers;
423         int i, j;
424
425         servers = g_try_new0(char *, len + 1);
426         if (!servers)
427                 return NULL;
428
429         i = 0;
430         j = 0;
431         while (nameservers[i]) {
432                 if (connman_inet_check_ipaddress(nameservers[i]) > 0) {
433                         servers[j] = g_strdup(nameservers[i]);
434                         j += 1;
435                 }
436                 i += 1;
437         }
438
439         return servers;
440 }
441
442 static void check_config(GKeyFile *config)
443 {
444         char **keys;
445         int j;
446
447         if (!config)
448                 return;
449
450         keys = g_key_file_get_groups(config, NULL);
451
452         for (j = 0; keys && keys[j]; j++) {
453 #if defined TIZEN_EXT
454                 if (g_strcmp0(keys[j], "General") != 0 &&
455                         g_strcmp0(keys[j], "INS") != 0)
456 #else
457                 if (g_strcmp0(keys[j], "General") != 0)
458 #endif
459                         connman_warn("Unknown group %s in %s",
460                                                 keys[j], MAINFILE);
461         }
462
463         g_strfreev(keys);
464
465         keys = g_key_file_get_keys(config, "General", NULL, NULL);
466
467         for (j = 0; keys && keys[j]; j++) {
468                 bool found;
469                 int i;
470
471                 found = false;
472                 for (i = 0; supported_options[i]; i++) {
473                         if (g_strcmp0(keys[j], supported_options[i]) == 0) {
474                                 found = true;
475                                 break;
476                         }
477                 }
478                 if (!found && !supported_options[i])
479                         connman_warn("Unknown option %s in %s",
480                                                 keys[j], MAINFILE);
481         }
482
483         g_strfreev(keys);
484
485 #if defined TIZEN_EXT
486         keys = g_key_file_get_keys(config, "INS", NULL, NULL);
487
488         for (j = 0; keys && keys[j]; j++) {
489                 bool found;
490                 int i;
491
492                 found = false;
493                 for (i = 0; supported_ins_options[i]; i++) {
494                         if (g_strcmp0(keys[j], supported_ins_options[i]) == 0) {
495                                 found = true;
496                                 break;
497                         }
498                 }
499                 if (!found && !supported_ins_options[i])
500                         connman_warn("Unknown option %s in %s",
501                                                 keys[j], MAINFILE);
502         }
503
504         g_strfreev(keys);
505 #endif
506 }
507
508 #if defined TIZEN_EXT
509 static void check_Tizen_INS_configuration(GKeyFile *config)
510 {
511         GError *error = NULL;
512         char *ins_preferred_freq_bssid;
513         char *ins_preferred_freq;
514         char **ins_security_priority;
515         bool boolean;
516         int integer;
517         gsize len;
518
519         ins_preferred_freq_bssid = __connman_config_get_string(config, "INS",
520                                         CONF_INS_PREFERRED_FREQ_BSSID, &error);
521         if (!error)
522                 connman_ins_settings.ins_preferred_freq_bssid = ins_preferred_freq_bssid;
523
524         g_clear_error(&error);
525
526         integer = g_key_file_get_integer(config, "INS",
527                         CONF_INS_PREFERRED_FREQ_BSSID_SCORE, &error);
528         if (!error && integer >= 0)
529                 connman_ins_settings.ins_preferred_freq_bssid_score = integer;
530
531         g_clear_error(&error);
532
533         boolean = __connman_config_get_bool(config, "INS",
534                         CONF_INS_LAST_CONNECTED_BSSID, &error);
535         if (!error)
536                 connman_ins_settings.ins_last_connected_bssid = boolean;
537
538         g_clear_error(&error);
539
540         integer = g_key_file_get_integer(config, "INS",
541                         CONF_INS_LAST_CONNECTED_BSSID_SCORE, &error);
542         if (!error && integer >= 0)
543                 connman_ins_settings.ins_last_connected_bssid_score = integer;
544
545         g_clear_error(&error);
546
547         boolean = __connman_config_get_bool(config, "INS",
548                         CONF_INS_ASSOC_REJECT, &error);
549         if (!error)
550                 connman_ins_settings.ins_assoc_reject = boolean;
551
552         g_clear_error(&error);
553
554         integer = g_key_file_get_integer(config, "INS",
555                         CONF_INS_ASSOC_REJECT_SCORE, &error);
556         if (!error && integer >= 0)
557                 connman_ins_settings.ins_assoc_reject_score = integer;
558
559         g_clear_error(&error);
560
561         boolean = __connman_config_get_bool(config, "INS",
562                         CONF_INS_SIGNAL_BSSID, &error);
563         if (!error)
564                 connman_ins_settings.ins_signal_bssid = boolean;
565
566         g_clear_error(&error);
567
568         boolean = __connman_config_get_bool(config, "INS",
569                         CONF_INS_LAST_USER_SELECTION, &error);
570         if (!error)
571                 connman_ins_settings.ins_last_user_selection = boolean;
572
573         g_clear_error(&error);
574
575         integer = g_key_file_get_integer(config, "INS",
576                         CONF_INS_LAST_USER_SELECTION_TIME, &error);
577         if (!error && integer >= 0)
578                 connman_ins_settings.ins_last_user_selection_time = integer;
579
580         g_clear_error(&error);
581
582         integer = g_key_file_get_integer(config, "INS",
583                         CONF_INS_LAST_USER_SELECTION_SCORE, &error);
584         if (!error && integer >= 0)
585                 connman_ins_settings.ins_last_user_selection_score = integer;
586
587         g_clear_error(&error);
588
589         boolean = __connman_config_get_bool(config, "INS",
590                         CONF_INS_LAST_CONNECTED, &error);
591         if (!error)
592                 connman_ins_settings.ins_last_connected = boolean;
593
594         g_clear_error(&error);
595
596         integer = g_key_file_get_integer(config, "INS",
597                         CONF_INS_LAST_CONNECTED_SCORE, &error);
598         if (!error && integer >= 0)
599                 connman_ins_settings.ins_last_connected_score = integer;
600
601         g_clear_error(&error);
602
603         ins_preferred_freq = __connman_config_get_string(config, "INS",
604                                         CONF_INS_PREFERRED_FREQ, &error);
605         if (!error)
606                 connman_ins_settings.ins_preferred_freq = ins_preferred_freq;
607
608         g_clear_error(&error);
609
610         integer = g_key_file_get_integer(config, "INS",
611                         CONF_INS_PREFERRED_FREQ_SCORE, &error);
612         if (!error && integer >= 0)
613                 connman_ins_settings.ins_preferred_freq_score = integer;
614
615         g_clear_error(&error);
616
617         ins_security_priority = g_key_file_get_string_list(config, "INS",
618                         CONF_INS_SECURITY_PRIORITY, &len, &error);
619
620         if (error == NULL) {
621                 connman_ins_settings.ins_security_priority = ins_security_priority;
622                 connman_ins_settings.ins_security_priority_count = len;
623         }
624
625         g_clear_error(&error);
626
627         integer = g_key_file_get_integer(config, "INS",
628                         CONF_INS_SECURITY_PRIORITY_SCORE, &error);
629         if (!error && integer >= 0)
630                 connman_ins_settings.ins_security_priority_score = integer;
631
632         g_clear_error(&error);
633
634         boolean = __connman_config_get_bool(config, "INS",
635                         CONF_INS_SIGNAL, &error);
636         if (!error)
637                 connman_ins_settings.ins_signal = boolean;
638
639         g_clear_error(&error);
640
641         boolean = __connman_config_get_bool(config, "INS",
642                         CONF_INS_INTERNET, &error);
643         if (!error)
644                 connman_ins_settings.ins_internet = boolean;
645
646         g_clear_error(&error);
647
648         integer = g_key_file_get_integer(config, "INS",
649                         CONF_INS_INTERNET_SCORE, &error);
650         if (!error && integer >= 0)
651                 connman_ins_settings.ins_internet_score = integer;
652
653         g_clear_error(&error);
654
655         integer = g_key_file_get_integer(config, "INS",
656                         CONF_INS_SIGNAL_LEVEL3_5GHZ, &error);
657         if (!error)
658                 connman_ins_settings.ins_signal_level3_5ghz = integer;
659
660         g_clear_error(&error);
661
662         integer = g_key_file_get_integer(config, "INS",
663                         CONF_INS_SIGNAL_LEVEL3_24GHZ, &error);
664         if (!error)
665                 connman_ins_settings.ins_signal_level3_24ghz = integer;
666
667         g_clear_error(&error);
668 }
669
670 static void check_Tizen_configuration(GKeyFile *config)
671 {
672         GError *error = NULL;
673         char **cellular_interfaces;
674         char *global_nameserver;
675         char *default_wifi_ifname;
676         bool boolean;
677         gsize len;
678
679         cellular_interfaces = g_key_file_get_string_list(config, "General",
680                         CONF_CELLULAR_INTERFACE, &len, &error);
681
682         if (error == NULL)
683                 connman_settings.cellular_interfaces = cellular_interfaces;
684
685         g_clear_error(&error);
686
687         boolean = __connman_config_get_bool(config, "General",
688                         CONF_TIZEN_TV_EXT, &error);
689         if (!error)
690                 connman_settings.tizen_tv_extension = boolean;
691
692         g_clear_error(&error);
693
694         boolean = __connman_config_get_bool(config, "General",
695                         CONF_ENABLE_AUTO_IP, &error);
696         if (!error)
697                 connman_settings.auto_ip = boolean;
698
699         g_clear_error(&error);
700
701         global_nameserver = __connman_config_get_string(config, "General",
702                                         CONF_GLOBAL_NAMESERVER, &error);
703         if (!error)
704                 connman_settings.global_nameserver = global_nameserver;
705
706         g_clear_error(&error);
707
708         boolean = __connman_config_get_bool(config, "General",
709                         CONF_CONNMAN_SUPPLICANT_DEBUG, &error);
710         if (!error)
711                 connman_settings.supplicant_debug = boolean;
712
713         g_clear_error(&error);
714
715         default_wifi_ifname = __connman_config_get_string(config, "General",
716                         CONF_CONNMAN_WIFI_DEF_IFNAME, &error);
717         if (!error)
718                 connman_settings.def_wifi_ifname = default_wifi_ifname;
719
720         g_clear_error(&error);
721
722         boolean = __connman_config_get_bool(config, "General",
723                         CONF_CONNMAN_FILE_LOG, &error);
724         if (!error)
725                 connman_settings.file_log = boolean;
726
727         g_clear_error(&error);
728
729         boolean = __connman_config_get_bool(config, "General",
730                         CONF_CONNMAN_DLOG_LOG, &error);
731         if (!error)
732                 connman_settings.dlog_log = boolean;
733
734         g_clear_error(&error);
735
736         boolean = __connman_config_get_bool(config, "General",
737                         CONF_CONNMAN_SIMPLIFIED_LOG, &error);
738         if (!error)
739                 connman_settings.simple_log = boolean;
740
741         boolean = __connman_config_get_bool(config, "General",
742                         CONF_CONNMAN_WIFI_ROAM_SCAN, &error);
743         if (!error)
744                 connman_settings.wifi_roam_scan = boolean;
745
746         boolean = __connman_config_get_bool(config, "General",
747                         CONF_CONNMAN_WIFI_ROAM, &error);
748         if (!error)
749                 connman_settings.wifi_roam = boolean;
750
751         g_clear_error(&error);
752
753         check_Tizen_INS_configuration(config);
754 }
755
756 static void set_nofile_inc(void)
757 {
758         int err;
759         struct rlimit rlim;
760
761         rlim.rlim_cur = 8192;
762         rlim.rlim_max = 8192;
763
764         err = setrlimit(RLIMIT_NOFILE, &rlim);
765         if (err)
766                 DBG("fail to increase FILENO err(%d)", err);
767
768         return;
769 }
770 #endif
771
772 static void parse_config(GKeyFile *config)
773 {
774         GError *error = NULL;
775         bool boolean;
776         char **timeservers;
777         char **interfaces;
778         char **str_list;
779         char **tethering;
780         char *string;
781         gsize len;
782         int integer;
783
784         if (!config) {
785                 connman_settings.auto_connect =
786                         parse_service_types(default_auto_connect, CONF_ARRAY_SIZE(default_auto_connect));
787                 connman_settings.favorite_techs =
788                         parse_service_types(default_favorite_techs, CONF_ARRAY_SIZE(default_favorite_techs));
789                 connman_settings.blacklisted_interfaces =
790                         g_strdupv(default_blacklist);
791                 return;
792         }
793
794         DBG("parsing %s", MAINFILE);
795
796         boolean = g_key_file_get_boolean(config, "General",
797                                                 CONF_BG_SCAN, &error);
798         if (!error)
799                 connman_settings.bg_scan = boolean;
800
801         g_clear_error(&error);
802
803         timeservers = __connman_config_get_string_list(config, "General",
804                                         CONF_PREF_TIMESERVERS, NULL, &error);
805         if (!error)
806                 connman_settings.pref_timeservers = timeservers;
807
808         g_clear_error(&error);
809
810         str_list = __connman_config_get_string_list(config, "General",
811                         CONF_AUTO_CONNECT_TECHS, &len, &error);
812
813         if (!error)
814                 connman_settings.auto_connect =
815                         parse_service_types(str_list, len);
816         else
817                 connman_settings.auto_connect =
818                         parse_service_types(default_auto_connect, CONF_ARRAY_SIZE(default_auto_connect));
819
820         g_strfreev(str_list);
821
822         g_clear_error(&error);
823
824         str_list = __connman_config_get_string_list(config, "General",
825                         CONF_FAVORITE_TECHS, &len, &error);
826
827         if (!error)
828                 connman_settings.favorite_techs =
829                         parse_service_types(str_list, len);
830         else
831                 connman_settings.favorite_techs =
832                         parse_service_types(default_favorite_techs, CONF_ARRAY_SIZE(default_favorite_techs));
833
834         g_strfreev(str_list);
835
836         g_clear_error(&error);
837
838         str_list = __connman_config_get_string_list(config, "General",
839                         CONF_PREFERRED_TECHS, &len, &error);
840
841         if (!error)
842                 connman_settings.preferred_techs =
843                         parse_service_types(str_list, len);
844
845         g_strfreev(str_list);
846
847         g_clear_error(&error);
848
849         str_list = __connman_config_get_string_list(config, "General",
850                         CONF_ALWAYS_CONNECTED_TECHS, &len, &error);
851
852         if (!error)
853                 connman_settings.always_connected_techs =
854                         parse_service_types(str_list, len);
855
856         g_strfreev(str_list);
857
858         g_clear_error(&error);
859
860         str_list = __connman_config_get_string_list(config, "General",
861                         CONF_FALLBACK_NAMESERVERS, &len, &error);
862
863         if (!error)
864                 connman_settings.fallback_nameservers =
865                         parse_fallback_nameservers(str_list, len);
866
867         g_strfreev(str_list);
868
869         g_clear_error(&error);
870
871         integer = g_key_file_get_integer(config, "General",
872                         CONF_TIMEOUT_INPUTREQ, &error);
873         if (!error && integer >= 0)
874                 connman_settings.timeout_inputreq = integer * 1000;
875
876         g_clear_error(&error);
877
878         integer = g_key_file_get_integer(config, "General",
879                         CONF_TIMEOUT_BROWSERLAUNCH, &error);
880         if (!error && integer >= 0)
881                 connman_settings.timeout_browserlaunch = integer * 1000;
882
883         g_clear_error(&error);
884
885         interfaces = __connman_config_get_string_list(config, "General",
886                         CONF_BLACKLISTED_INTERFACES, &len, &error);
887
888         if (!error)
889                 connman_settings.blacklisted_interfaces = interfaces;
890         else
891                 connman_settings.blacklisted_interfaces =
892                         g_strdupv(default_blacklist);
893
894         g_clear_error(&error);
895
896         boolean = __connman_config_get_bool(config, "General",
897                                         CONF_ALLOW_HOSTNAME_UPDATES,
898                                         &error);
899         if (!error)
900                 connman_settings.allow_hostname_updates = boolean;
901
902         g_clear_error(&error);
903
904         boolean = __connman_config_get_bool(config, "General",
905                                         CONF_ALLOW_DOMAINNAME_UPDATES,
906                                         &error);
907         if (!error)
908                 connman_settings.allow_domainname_updates = boolean;
909
910         g_clear_error(&error);
911
912         boolean = __connman_config_get_bool(config, "General",
913                         CONF_SINGLE_TECH, &error);
914         if (!error)
915                 connman_settings.single_tech = boolean;
916
917         g_clear_error(&error);
918
919         tethering = __connman_config_get_string_list(config, "General",
920                         CONF_TETHERING_TECHNOLOGIES, &len, &error);
921
922         if (!error)
923                 connman_settings.tethering_technologies = tethering;
924
925         g_clear_error(&error);
926
927         boolean = __connman_config_get_bool(config, "General",
928                                         CONF_PERSISTENT_TETHERING_MODE,
929                                         &error);
930         if (!error)
931                 connman_settings.persistent_tethering_mode = boolean;
932
933         g_clear_error(&error);
934
935         boolean = __connman_config_get_bool(config, "General",
936                                         CONF_ENABLE_6TO4, &error);
937         if (!error)
938                 connman_settings.enable_6to4 = boolean;
939
940         g_clear_error(&error);
941
942         string = __connman_config_get_string(config, "General",
943                                         CONF_VENDOR_CLASS_ID, &error);
944         if (!error)
945                 connman_settings.vendor_class_id = string;
946
947         g_clear_error(&error);
948
949         boolean = __connman_config_get_bool(config, "General",
950                                         CONF_ENABLE_ONLINE_CHECK, &error);
951         if (!error) {
952                 connman_settings.enable_online_check = boolean;
953                 if (!boolean)
954                         connman_info("Online check disabled by main config.");
955         }
956
957         g_clear_error(&error);
958
959         boolean = __connman_config_get_bool(config, "General",
960                         CONF_ENABLE_ONLINE_TO_READY_TRANSITION, &error);
961         if (!error) {
962                 connman_settings.enable_online_to_ready_transition = boolean;
963         }
964
965         g_clear_error(&error);
966
967         string = __connman_config_get_string(config, "General",
968                                         CONF_ONLINE_CHECK_IPV4_URL, &error);
969         if (!error)
970                 connman_settings.online_check_ipv4_url = string;
971         else
972                 connman_settings.online_check_ipv4_url =
973                         g_strdup(DEFAULT_ONLINE_CHECK_IPV4_URL);
974
975         g_clear_error(&error);
976
977         string = __connman_config_get_string(config, "General",
978                                         CONF_ONLINE_CHECK_IPV6_URL, &error);
979         if (!error)
980                 connman_settings.online_check_ipv6_url = string;
981         else
982                 connman_settings.online_check_ipv6_url =
983                         g_strdup(DEFAULT_ONLINE_CHECK_IPV6_URL);
984
985
986         g_clear_error(&error);
987
988         integer = g_key_file_get_integer(config, "General",
989                         CONF_ONLINE_CHECK_INITIAL_INTERVAL, &error);
990         if (!error && integer >= 0)
991                 connman_settings.online_check_initial_interval = integer;
992
993         g_clear_error(&error);
994
995         integer = g_key_file_get_integer(config, "General",
996                         CONF_ONLINE_CHECK_MAX_INTERVAL, &error);
997         if (!error && integer >= 0)
998                 connman_settings.online_check_max_interval = integer;
999
1000         g_clear_error(&error);
1001
1002         if (connman_settings.online_check_initial_interval < 1 ||
1003                 connman_settings.online_check_initial_interval >
1004                 connman_settings.online_check_max_interval) {
1005                 connman_warn("Incorrect online check intervals [%u, %u]",
1006                                 connman_settings.online_check_initial_interval,
1007                                 connman_settings.online_check_max_interval);
1008                 connman_settings.online_check_initial_interval =
1009                         DEFAULT_ONLINE_CHECK_INITIAL_INTERVAL;
1010                 connman_settings.online_check_max_interval =
1011                         DEFAULT_ONLINE_CHECK_MAX_INTERVAL;
1012         }
1013
1014         boolean = __connman_config_get_bool(config, "General",
1015                                 CONF_AUTO_CONNECT_ROAMING_SERVICES, &error);
1016         if (!error)
1017                 connman_settings.auto_connect_roaming_services = boolean;
1018
1019         g_clear_error(&error);
1020
1021         boolean = __connman_config_get_bool(config, "General", CONF_ACD, &error);
1022         if (!error)
1023                 connman_settings.acd = boolean;
1024
1025         g_clear_error(&error);
1026
1027         boolean = __connman_config_get_bool(config, "General",
1028                                 CONF_USE_GATEWAYS_AS_TIMESERVERS, &error);
1029         if (!error)
1030                 connman_settings.use_gateways_as_timeservers = boolean;
1031
1032         g_clear_error(&error);
1033
1034 #if defined TIZEN_EXT
1035         check_Tizen_configuration(config);
1036 #endif
1037 }
1038
1039 static int config_init(const char *file)
1040 {
1041         GKeyFile *config;
1042
1043 #if defined TIZEN_EXT
1044         set_nofile_inc();
1045 #endif
1046         config = load_config(file);
1047         check_config(config);
1048         parse_config(config);
1049         if (config)
1050                 g_key_file_free(config);
1051
1052 #if defined TIZEN_EXT
1053         set_simple_log_option(connman_settings.simple_log);
1054         set_dlog_logging_option(connman_settings.dlog_log);
1055         set_file_logging_option(connman_settings.file_log);
1056 #endif
1057         return 0;
1058 }
1059
1060 static GMainLoop *main_loop = NULL;
1061
1062 static unsigned int __terminated = 0;
1063
1064 static gboolean signal_handler(GIOChannel *channel, GIOCondition cond,
1065                                                         gpointer user_data)
1066 {
1067         struct signalfd_siginfo si;
1068         ssize_t result;
1069         int fd;
1070
1071         if (cond & (G_IO_NVAL | G_IO_ERR | G_IO_HUP))
1072                 return FALSE;
1073
1074         fd = g_io_channel_unix_get_fd(channel);
1075
1076         result = read(fd, &si, sizeof(si));
1077         if (result != sizeof(si))
1078                 return FALSE;
1079
1080         switch (si.ssi_signo) {
1081         case SIGINT:
1082         case SIGTERM:
1083                 if (__terminated == 0) {
1084                         connman_info("Terminating");
1085                         g_main_loop_quit(main_loop);
1086                 }
1087
1088                 __terminated = 1;
1089                 break;
1090         }
1091
1092         return TRUE;
1093 }
1094
1095 static guint setup_signalfd(void)
1096 {
1097         GIOChannel *channel;
1098         guint source;
1099         sigset_t mask;
1100         int fd;
1101
1102         sigemptyset(&mask);
1103         sigaddset(&mask, SIGINT);
1104         sigaddset(&mask, SIGTERM);
1105
1106         if (sigprocmask(SIG_BLOCK, &mask, NULL) < 0) {
1107                 perror("Failed to set signal mask");
1108                 return 0;
1109         }
1110
1111         fd = signalfd(-1, &mask, 0);
1112         if (fd < 0) {
1113                 perror("Failed to create signal descriptor");
1114                 return 0;
1115         }
1116
1117         channel = g_io_channel_unix_new(fd);
1118
1119         g_io_channel_set_close_on_unref(channel, TRUE);
1120         g_io_channel_set_encoding(channel, NULL, NULL);
1121         g_io_channel_set_buffered(channel, FALSE);
1122
1123         source = g_io_add_watch(channel,
1124                                 G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
1125                                 signal_handler, NULL);
1126
1127         g_io_channel_unref(channel);
1128
1129         return source;
1130 }
1131
1132 static void disconnect_callback(DBusConnection *conn, void *user_data)
1133 {
1134         connman_error("D-Bus disconnect");
1135
1136         g_main_loop_quit(main_loop);
1137 }
1138
1139 static gchar *option_config = NULL;
1140 static gchar *option_debug = NULL;
1141 static gchar *option_device = NULL;
1142 static gchar *option_plugin = NULL;
1143 static gchar *option_nodevice = NULL;
1144 static gchar *option_noplugin = NULL;
1145 static gchar *option_wifi = NULL;
1146 static gboolean option_detach = TRUE;
1147 static gboolean option_dnsproxy = TRUE;
1148 static gboolean option_backtrace = TRUE;
1149 static gboolean option_version = FALSE;
1150
1151 static bool parse_debug(const char *key, const char *value,
1152                                         gpointer user_data, GError **error)
1153 {
1154         if (value) {
1155                 if (option_debug) {
1156                         char *prev = option_debug;
1157
1158                         option_debug = g_strconcat(prev, ",", value, NULL);
1159                         g_free(prev);
1160                 } else {
1161                         option_debug = g_strdup(value);
1162                 }
1163         } else {
1164                 g_free(option_debug);
1165                 option_debug = g_strdup("*");
1166         }
1167
1168         return true;
1169 }
1170
1171 static bool parse_noplugin(const char *key, const char *value,
1172                                         gpointer user_data, GError **error)
1173 {
1174         if (option_noplugin) {
1175                 char *prev = option_noplugin;
1176
1177                 option_noplugin = g_strconcat(prev, ",", value, NULL);
1178                 g_free(prev);
1179         } else {
1180                 option_noplugin = g_strdup(value);
1181         }
1182
1183         return true;
1184 }
1185
1186 static GOptionEntry options[] = {
1187         { "config", 'c', 0, G_OPTION_ARG_STRING, &option_config,
1188                                 "Load the specified configuration file "
1189                                 "instead of " CONFIGMAINFILE, "FILE" },
1190         { "debug", 'd', G_OPTION_FLAG_OPTIONAL_ARG,
1191                                 G_OPTION_ARG_CALLBACK, parse_debug,
1192                                 "Specify debug options to enable", "DEBUG" },
1193         { "device", 'i', 0, G_OPTION_ARG_STRING, &option_device,
1194                         "Specify networking devices or interfaces", "DEV,..." },
1195         { "nodevice", 'I', 0, G_OPTION_ARG_STRING, &option_nodevice,
1196                         "Specify networking interfaces to ignore", "DEV,..." },
1197         { "plugin", 'p', 0, G_OPTION_ARG_STRING, &option_plugin,
1198                                 "Specify plugins to load", "NAME,..." },
1199         { "noplugin", 'P', 0, G_OPTION_ARG_CALLBACK, &parse_noplugin,
1200                                 "Specify plugins not to load", "NAME,..." },
1201         { "wifi", 'W', 0, G_OPTION_ARG_STRING, &option_wifi,
1202                                 "Specify driver for WiFi/Supplicant", "NAME" },
1203         { "nodaemon", 'n', G_OPTION_FLAG_REVERSE,
1204                                 G_OPTION_ARG_NONE, &option_detach,
1205                                 "Don't fork daemon to background" },
1206         { "nodnsproxy", 'r', G_OPTION_FLAG_REVERSE,
1207                                 G_OPTION_ARG_NONE, &option_dnsproxy,
1208                                 "Don't support DNS resolving" },
1209         { "nobacktrace", 0, G_OPTION_FLAG_REVERSE,
1210                                 G_OPTION_ARG_NONE, &option_backtrace,
1211                                 "Don't print out backtrace information" },
1212         { "version", 'v', 0, G_OPTION_ARG_NONE, &option_version,
1213                                 "Show version information and exit" },
1214         { NULL },
1215 };
1216
1217 char *connman_setting_get_string(const char *key)
1218 {
1219         if (g_str_equal(key, CONF_VENDOR_CLASS_ID))
1220                 return connman_settings.vendor_class_id;
1221
1222         if (g_str_equal(key, CONF_ONLINE_CHECK_IPV4_URL))
1223                 return connman_settings.online_check_ipv4_url;
1224
1225         if (g_str_equal(key, CONF_ONLINE_CHECK_IPV6_URL))
1226                 return connman_settings.online_check_ipv6_url;
1227
1228         if (g_strcmp0(key, "wifi") == 0) {
1229                 if (!option_wifi)
1230                         return "nl80211,wext";
1231                 else
1232                         return option_wifi;
1233         }
1234
1235 #if defined TIZEN_EXT
1236         if (g_str_equal(key, CONF_GLOBAL_NAMESERVER))
1237                 return connman_settings.global_nameserver;
1238
1239         if (g_str_equal(key, CONF_INS_PREFERRED_FREQ_BSSID))
1240                 return connman_ins_settings.ins_preferred_freq_bssid;
1241
1242         if (g_str_equal(key, CONF_INS_PREFERRED_FREQ))
1243                 return connman_ins_settings.ins_preferred_freq;
1244
1245         if (g_str_equal(key, CONF_CONNMAN_WIFI_DEF_IFNAME))
1246                 return connman_settings.def_wifi_ifname;
1247 #endif
1248         return NULL;
1249 }
1250
1251 bool connman_setting_get_bool(const char *key)
1252 {
1253         if (g_str_equal(key, CONF_BG_SCAN))
1254                 return connman_settings.bg_scan;
1255
1256         if (g_str_equal(key, CONF_ALLOW_HOSTNAME_UPDATES))
1257                 return connman_settings.allow_hostname_updates;
1258
1259         if (g_str_equal(key, CONF_ALLOW_DOMAINNAME_UPDATES))
1260                 return connman_settings.allow_domainname_updates;
1261
1262         if (g_str_equal(key, CONF_SINGLE_TECH))
1263                 return connman_settings.single_tech;
1264
1265         if (g_str_equal(key, CONF_PERSISTENT_TETHERING_MODE))
1266                 return connman_settings.persistent_tethering_mode;
1267
1268         if (g_str_equal(key, CONF_ENABLE_6TO4))
1269                 return connman_settings.enable_6to4;
1270
1271         if (g_str_equal(key, CONF_ENABLE_ONLINE_CHECK))
1272                 return connman_settings.enable_online_check;
1273
1274         if (g_str_equal(key, CONF_ENABLE_ONLINE_TO_READY_TRANSITION))
1275                 return connman_settings.enable_online_to_ready_transition;
1276
1277         if (g_str_equal(key, CONF_AUTO_CONNECT_ROAMING_SERVICES))
1278                 return connman_settings.auto_connect_roaming_services;
1279
1280         if (g_str_equal(key, CONF_ACD))
1281                 return connman_settings.acd;
1282
1283         if (g_str_equal(key, CONF_USE_GATEWAYS_AS_TIMESERVERS))
1284                 return connman_settings.use_gateways_as_timeservers;
1285
1286 #if defined TIZEN_EXT
1287         if (g_str_equal(key, CONF_ENABLE_AUTO_IP))
1288                 return connman_settings.auto_ip;
1289
1290         if (g_str_equal(key, CONF_CONNMAN_SUPPLICANT_DEBUG))
1291                 return connman_settings.supplicant_debug;
1292
1293         if (g_str_equal(key, CONF_CONNMAN_FILE_LOG))
1294                 return connman_settings.file_log;
1295
1296         if (g_str_equal(key, CONF_CONNMAN_DLOG_LOG))
1297                 return connman_settings.dlog_log;
1298
1299         if (g_str_equal(key, CONF_CONNMAN_SIMPLIFIED_LOG))
1300                 return connman_settings.simple_log;
1301
1302         if (g_str_equal(key, CONF_CONNMAN_WIFI_ROAM_SCAN))
1303                 return connman_settings.wifi_roam_scan;
1304
1305         if (g_str_equal(key, CONF_CONNMAN_WIFI_ROAM))
1306                 return connman_settings.wifi_roam;
1307
1308         if (g_str_equal(key, CONF_INS_LAST_CONNECTED_BSSID))
1309                 return connman_ins_settings.ins_last_connected_bssid;
1310
1311         if (g_str_equal(key, CONF_INS_ASSOC_REJECT))
1312                 return connman_ins_settings.ins_assoc_reject;
1313
1314         if (g_str_equal(key, CONF_INS_SIGNAL_BSSID))
1315                 return connman_ins_settings.ins_signal_bssid;
1316
1317         if (g_str_equal(key, CONF_INS_LAST_USER_SELECTION))
1318                 return connman_ins_settings.ins_last_user_selection;
1319
1320         if (g_str_equal(key, CONF_INS_LAST_CONNECTED))
1321                 return connman_ins_settings.ins_last_connected;
1322
1323         if (g_str_equal(key, CONF_INS_SIGNAL))
1324                 return connman_ins_settings.ins_signal;
1325
1326         if (g_str_equal(key, CONF_INS_INTERNET))
1327                 return connman_ins_settings.ins_internet;
1328 #endif
1329
1330         return false;
1331 }
1332
1333 unsigned int connman_setting_get_uint(const char *key)
1334 {
1335         if (g_str_equal(key, CONF_ONLINE_CHECK_INITIAL_INTERVAL))
1336                 return connman_settings.online_check_initial_interval;
1337
1338         if (g_str_equal(key, CONF_ONLINE_CHECK_MAX_INTERVAL))
1339                 return connman_settings.online_check_max_interval;
1340
1341 #if defined TIZEN_EXT
1342         if (g_str_equal(key, CONF_INS_PREFERRED_FREQ_BSSID_SCORE))
1343                 return connman_ins_settings.ins_preferred_freq_bssid_score;
1344
1345         if (g_str_equal(key, CONF_INS_LAST_CONNECTED_BSSID_SCORE))
1346                 return connman_ins_settings.ins_last_connected_bssid_score;
1347
1348         if (g_str_equal(key, CONF_INS_ASSOC_REJECT_SCORE))
1349                 return connman_ins_settings.ins_assoc_reject_score;
1350
1351         if (g_str_equal(key, CONF_INS_LAST_USER_SELECTION_TIME))
1352                 return connman_ins_settings.ins_last_user_selection_time;
1353
1354         if (g_str_equal(key, CONF_INS_SECURITY_PRIORITY_COUNT))
1355                 return connman_ins_settings.ins_security_priority_count;
1356
1357         if (g_str_equal(key, CONF_INS_LAST_USER_SELECTION_SCORE))
1358                 return connman_ins_settings.ins_last_user_selection_score;
1359
1360         if (g_str_equal(key, CONF_INS_LAST_CONNECTED_SCORE))
1361                 return connman_ins_settings.ins_last_connected_score;
1362
1363         if (g_str_equal(key, CONF_INS_PREFERRED_FREQ_SCORE))
1364                 return connman_ins_settings.ins_preferred_freq_score;
1365
1366         if (g_str_equal(key, CONF_INS_SECURITY_PRIORITY_SCORE))
1367                 return connman_ins_settings.ins_security_priority_score;
1368
1369         if (g_str_equal(key, CONF_INS_INTERNET_SCORE))
1370                 return connman_ins_settings.ins_internet_score;
1371 #endif
1372         return 0;
1373 }
1374
1375 #if defined TIZEN_EXT
1376 int connman_setting_get_int(const char *key)
1377 {
1378         if (g_str_equal(key, CONF_INS_SIGNAL_LEVEL3_5GHZ))
1379                 return connman_ins_settings.ins_signal_level3_5ghz;
1380
1381         if (g_str_equal(key, CONF_INS_SIGNAL_LEVEL3_24GHZ))
1382                 return connman_ins_settings.ins_signal_level3_24ghz;
1383
1384         return 0;
1385 }
1386 #endif
1387
1388 char **connman_setting_get_string_list(const char *key)
1389 {
1390         if (g_str_equal(key, CONF_PREF_TIMESERVERS))
1391                 return connman_settings.pref_timeservers;
1392
1393         if (g_str_equal(key, CONF_FALLBACK_NAMESERVERS))
1394                 return connman_settings.fallback_nameservers;
1395
1396         if (g_str_equal(key, CONF_BLACKLISTED_INTERFACES))
1397                 return connman_settings.blacklisted_interfaces;
1398
1399         if (g_str_equal(key, CONF_TETHERING_TECHNOLOGIES))
1400                 return connman_settings.tethering_technologies;
1401
1402 #if defined TIZEN_EXT
1403         if (g_str_equal(key, CONF_CELLULAR_INTERFACE))
1404                 return connman_settings.cellular_interfaces;
1405 #endif
1406
1407 #if defined TIZEN_EXT
1408         if (g_str_equal(key, CONF_INS_SECURITY_PRIORITY))
1409                 return connman_ins_settings.ins_security_priority;
1410 #endif
1411
1412         return NULL;
1413 }
1414
1415 unsigned int *connman_setting_get_uint_list(const char *key)
1416 {
1417         if (g_str_equal(key, CONF_AUTO_CONNECT_TECHS))
1418                 return connman_settings.auto_connect;
1419
1420         if (g_str_equal(key, CONF_FAVORITE_TECHS))
1421                 return connman_settings.favorite_techs;
1422
1423         if (g_str_equal(key, CONF_PREFERRED_TECHS))
1424                 return connman_settings.preferred_techs;
1425
1426         if (g_str_equal(key, CONF_ALWAYS_CONNECTED_TECHS))
1427                 return connman_settings.always_connected_techs;
1428
1429         return NULL;
1430 }
1431
1432 unsigned int connman_timeout_input_request(void)
1433 {
1434         return connman_settings.timeout_inputreq;
1435 }
1436
1437 unsigned int connman_timeout_browser_launch(void)
1438 {
1439         return connman_settings.timeout_browserlaunch;
1440 }
1441
1442 int main(int argc, char *argv[])
1443 {
1444         GOptionContext *context;
1445         GError *error = NULL;
1446         DBusConnection *conn;
1447         DBusError err;
1448         guint signal;
1449
1450         context = g_option_context_new(NULL);
1451         g_option_context_add_main_entries(context, options, NULL);
1452
1453         if (!g_option_context_parse(context, &argc, &argv, &error)) {
1454                 if (error) {
1455                         g_printerr("%s\n", error->message);
1456                         g_error_free(error);
1457                 } else
1458                         g_printerr("An unknown error occurred\n");
1459                 exit(1);
1460         }
1461
1462         g_option_context_free(context);
1463
1464         if (option_version) {
1465                 printf("%s\n", VERSION);
1466                 exit(0);
1467         }
1468
1469         if (option_detach) {
1470                 if (daemon(0, 0)) {
1471                         perror("Can't start daemon");
1472                         exit(1);
1473                 }
1474         }
1475
1476         if (mkdir(STORAGEDIR, S_IRUSR | S_IWUSR | S_IXUSR |
1477                                 S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0) {
1478                 if (errno != EEXIST)
1479                         perror("Failed to create storage directory");
1480         }
1481
1482         umask(0077);
1483
1484         main_loop = g_main_loop_new(NULL, FALSE);
1485
1486         signal = setup_signalfd();
1487
1488         dbus_error_init(&err);
1489
1490         conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, CONNMAN_SERVICE, &err);
1491         if (!conn) {
1492                 if (dbus_error_is_set(&err)) {
1493                         fprintf(stderr, "%s\n", err.message);
1494                         dbus_error_free(&err);
1495                 } else
1496                         fprintf(stderr, "Can't register with system bus\n");
1497                 exit(1);
1498         }
1499
1500         g_dbus_set_disconnect_function(conn, disconnect_callback, NULL, NULL);
1501
1502         __connman_log_init(argv[0], option_debug, option_detach,
1503                         option_backtrace, "Connection Manager", VERSION);
1504
1505         __connman_dbus_init(conn);
1506
1507 #if defined TIZEN_EXT
1508         if (access(CONTAINER_FILE, F_OK) == 0) {
1509                 g_main_loop_run(main_loop);
1510
1511                 g_source_remove(signal);
1512                 dbus_connection_unref(conn);
1513                 g_main_loop_unref(main_loop);
1514
1515                 __connman_dbus_cleanup();
1516                 __connman_log_cleanup(option_backtrace);
1517
1518                 return 0;
1519         }
1520 #endif
1521
1522         if (!option_config)
1523                 config_init(CONFIGMAINFILE);
1524         else
1525                 config_init(option_config);
1526
1527         __connman_util_init();
1528         __connman_inotify_init();
1529         __connman_technology_init();
1530         __connman_notifier_init();
1531         __connman_agent_init();
1532         __connman_service_init();
1533         __connman_peer_service_init();
1534         __connman_peer_init();
1535 #if defined TIZEN_EXT_WIFI_MESH
1536         __connman_mesh_init();
1537 #endif /* TIZEN_EXT_WIFI_MESH */
1538         __connman_provider_init();
1539         __connman_network_init();
1540         __connman_config_init();
1541         __connman_device_init(option_device, option_nodevice);
1542
1543         __connman_ippool_init();
1544         __connman_firewall_init();
1545         __connman_nat_init();
1546         __connman_tethering_init();
1547         __connman_counter_init();
1548         __connman_manager_init();
1549         __connman_stats_init();
1550         __connman_clock_init();
1551
1552         __connman_ipconfig_init();
1553 #if defined TIZEN_EXT
1554         __connman_rtnl_init(GIO_SOCKET_RETRY_COUNT);
1555 #else /* TIZEN_EXT */
1556         __connman_rtnl_init();
1557 #endif /* TIZEN_EXT */
1558         __connman_task_init();
1559         __connman_proxy_init();
1560         __connman_detect_init();
1561         __connman_session_init();
1562         __connman_timeserver_init();
1563         __connman_connection_init();
1564
1565         __connman_plugin_init(option_plugin, option_noplugin);
1566
1567         __connman_resolver_init(option_dnsproxy);
1568         __connman_rtnl_start();
1569         __connman_dhcp_init();
1570         __connman_dhcpv6_init();
1571         __connman_wpad_init();
1572         __connman_wispr_init();
1573 #if !defined TIZEN_EXT
1574         __connman_rfkill_init();
1575         __connman_machine_init();
1576 #endif
1577
1578         g_free(option_config);
1579         g_free(option_device);
1580         g_free(option_plugin);
1581         g_free(option_nodevice);
1582         g_free(option_noplugin);
1583
1584         g_main_loop_run(main_loop);
1585
1586         g_source_remove(signal);
1587
1588 #if !defined TIZEN_EXT
1589         __connman_machine_cleanup();
1590         __connman_rfkill_cleanup();
1591 #endif
1592         __connman_wispr_cleanup();
1593         __connman_wpad_cleanup();
1594         __connman_dhcpv6_cleanup();
1595         __connman_session_cleanup();
1596         __connman_plugin_cleanup();
1597         __connman_provider_cleanup();
1598         __connman_connection_cleanup();
1599         __connman_timeserver_cleanup();
1600         __connman_detect_cleanup();
1601         __connman_proxy_cleanup();
1602         __connman_task_cleanup();
1603         __connman_rtnl_cleanup();
1604         __connman_resolver_cleanup();
1605
1606         __connman_clock_cleanup();
1607         __connman_stats_cleanup();
1608         __connman_config_cleanup();
1609         __connman_manager_cleanup();
1610         __connman_counter_cleanup();
1611         __connman_tethering_cleanup();
1612         __connman_nat_cleanup();
1613         __connman_firewall_cleanup();
1614         __connman_peer_service_cleanup();
1615         __connman_peer_cleanup();
1616 #if defined TIZEN_EXT_WIFI_MESH
1617         __connman_mesh_cleanup();
1618 #endif /* TIZEN_EXT_WIFI_MESH */
1619         __connman_ippool_cleanup();
1620         __connman_device_cleanup();
1621         __connman_network_cleanup();
1622         __connman_dhcp_cleanup();
1623         __connman_service_cleanup();
1624         __connman_agent_cleanup();
1625         __connman_ipconfig_cleanup();
1626         __connman_notifier_cleanup();
1627         __connman_technology_cleanup();
1628         __connman_inotify_cleanup();
1629
1630         __connman_util_cleanup();
1631         __connman_dbus_cleanup();
1632
1633         __connman_log_cleanup(option_backtrace);
1634
1635         dbus_connection_unref(conn);
1636
1637         g_main_loop_unref(main_loop);
1638
1639         if (connman_settings.pref_timeservers)
1640                 g_strfreev(connman_settings.pref_timeservers);
1641
1642         g_free(connman_settings.auto_connect);
1643         g_free(connman_settings.favorite_techs);
1644         g_free(connman_settings.preferred_techs);
1645         g_strfreev(connman_settings.fallback_nameservers);
1646         g_strfreev(connman_settings.blacklisted_interfaces);
1647         g_strfreev(connman_settings.tethering_technologies);
1648         g_free(connman_settings.vendor_class_id);
1649         g_free(connman_settings.online_check_ipv4_url);
1650         g_free(connman_settings.online_check_ipv6_url);
1651
1652 #if defined TIZEN_EXT
1653         g_free(connman_ins_settings.ins_preferred_freq_bssid);
1654         g_free(connman_ins_settings.ins_preferred_freq);
1655         if (connman_ins_settings.ins_security_priority)
1656                 g_strfreev(connman_ins_settings.ins_security_priority);
1657 #endif
1658
1659         g_free(option_debug);
1660         g_free(option_wifi);
1661
1662         return 0;
1663 }