Add initial bits and pieces for Tethering support
[platform/upstream/connman.git] / src / main.c
index df0309a..a01f2fe 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2009  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2010  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 <gdbus.h>
 
+#ifdef HAVE_CAPNG
+#include <cap-ng.h>
+#endif
+
 #include "connman.h"
 
 static GMainLoop *main_loop = NULL;
 
 static void sig_term(int sig)
 {
-       g_main_loop_quit(main_loop);
-}
+       connman_info("Terminating");
 
-static void sig_debug(int sig)
-{
-       __connman_toggle_debug();
+       g_main_loop_quit(main_loop);
 }
 
 static void disconnect_callback(DBusConnection *conn, void *user_data)
 {
-       DBG("D-Bus disconnect");
+       connman_error("D-Bus disconnect");
 
        g_main_loop_quit(main_loop);
 }
 
+static gchar *option_debug = NULL;
 static gchar *option_device = NULL;
 static gchar *option_plugin = NULL;
 static gchar *option_nodevice = NULL;
@@ -62,11 +64,24 @@ static gchar *option_noplugin = NULL;
 static gchar *option_wifi = NULL;
 static gboolean option_detach = TRUE;
 static gboolean option_compat = FALSE;
-static gboolean option_debug = FALSE;
 static gboolean option_selftest = FALSE;
 static gboolean option_version = FALSE;
 
+static gboolean parse_debug(const char *key, const char *value,
+                                       gpointer user_data, GError **error)
+{
+       if (value)
+               option_debug = g_strdup(value);
+       else
+               option_debug = g_strdup("*");
+
+       return TRUE;
+}
+
 static GOptionEntry options[] = {
+       { "debug", 'd', G_OPTION_FLAG_OPTIONAL_ARG,
+                               G_OPTION_ARG_CALLBACK, parse_debug,
+                               "Specify debug options to enable", "DEBUG" },
        { "device", 'i', 0, G_OPTION_ARG_STRING, &option_device,
                        "Specify networking device or interface", "DEV" },
        { "nodevice", 'I', 0, G_OPTION_ARG_STRING, &option_nodevice,
@@ -82,8 +97,6 @@ static GOptionEntry options[] = {
                                "Don't fork daemon to background" },
        { "compat", 'c', 0, G_OPTION_ARG_NONE, &option_compat,
                                "Enable Network Manager compatibility" },
-       { "debug", 'd', 0, G_OPTION_ARG_NONE, &option_debug,
-                               "Enable debug information output" },
        { "selftest", 't', 0, G_OPTION_ARG_NONE, &option_selftest,
                                "Run self testing routines" },
        { "version", 'v', 0, G_OPTION_ARG_NONE, &option_version,
@@ -95,7 +108,7 @@ const char *connman_option_get_string(const char *key)
 {
        if (g_strcmp0(key, "wifi") == 0) {
                if (option_wifi == NULL)
-                       return "nl80211,wext";
+                       return "wext";
                else
                        return option_wifi;
        }
@@ -110,6 +123,11 @@ int main(int argc, char *argv[])
        DBusConnection *conn;
        DBusError err;
        struct sigaction sa;
+       mode_t old_umask;
+
+#ifdef HAVE_CAPNG
+       /* Drop capabilities */
+#endif
 
 #ifdef NEED_THREADS
        if (g_thread_supported() == FALSE)
@@ -154,6 +172,8 @@ int main(int argc, char *argv[])
                        perror("Failed to create storage directory");
        }
 
+       old_umask = umask(077);
+
        main_loop = g_main_loop_new(NULL, FALSE);
 
 #ifdef NEED_THREADS
@@ -184,7 +204,7 @@ int main(int argc, char *argv[])
                }
        }
 
-       __connman_log_init(option_detach, option_debug);
+       __connman_log_init(option_debug, option_detach);
 
        if (option_selftest == TRUE) {
                if (__connman_selftest() < 0) {
@@ -196,15 +216,22 @@ int main(int argc, char *argv[])
        __connman_dbus_init(conn);
 
        __connman_storage_init();
-       __connman_element_init(conn, option_device, option_nodevice);
+       __connman_element_init(option_device, option_nodevice);
 
-       __connman_agent_init(conn);
-       __connman_manager_init(conn, option_compat);
-       __connman_profile_init(conn);
+       __connman_agent_init();
+       __connman_tethering_init();
+       __connman_counter_init();
+       __connman_manager_init(option_compat);
+       __connman_profile_init();
+       __connman_config_init();
 
        __connman_resolver_init();
+       __connman_ipconfig_init();
        __connman_rtnl_init();
        __connman_udev_init();
+       __connman_task_init();
+       __connman_session_init();
+       __connman_timeserver_init();
 
        __connman_plugin_init(option_plugin, option_noplugin);
 
@@ -220,22 +247,26 @@ int main(int argc, char *argv[])
        sigaction(SIGINT, &sa, NULL);
        sigaction(SIGTERM, &sa, NULL);
 
-       sa.sa_handler = sig_debug;
-       sigaction(SIGUSR2, &sa, NULL);
-
        g_main_loop_run(main_loop);
 
        __connman_element_stop();
 
        __connman_plugin_cleanup();
 
+       __connman_timeserver_cleanup();
+       __connman_session_cleanup();
+       __connman_task_cleanup();
        __connman_udev_cleanup();
        __connman_rtnl_cleanup();
+       __connman_ipconfig_cleanup();
        __connman_resolver_cleanup();
 
+       __connman_config_cleanup();
        __connman_profile_cleanup();
        __connman_manager_cleanup();
+       __connman_counter_cleanup();
        __connman_agent_cleanup();
+       __connman_tethering_cleanup();
 
        __connman_element_cleanup();
        __connman_storage_cleanup();
@@ -249,9 +280,5 @@ selftest:
 
        g_main_loop_unref(main_loop);
 
-       rmdir(STORAGEDIR);
-
-       rmdir(STATEDIR);
-
        return 0;
 }