Add logging infrastructure
[connman] / src / main.c
index 76af50a..a4962b2 100644 (file)
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <unistd.h>
 #include <string.h>
 #include <signal.h>
+#include <getopt.h>
+#include <sys/stat.h>
 
 #include <gdbus.h>
 
@@ -39,20 +42,101 @@ static void sig_term(int sig)
        g_main_loop_quit(main_loop);
 }
 
+static void usage(void)
+{
+       printf("Connection Manager version %s\n\n", VERSION);
+
+       printf("Usage:\n"
+               "\tconnmand [options]\n"
+               "\n");
+
+       printf("Options:\n"
+               "\t-c, --compat         Enable Network Manager compatibility\n"
+               "\t-n, --nodaemon       Don't fork daemon to background\n"
+               "\t-h, --help           Display help\n"
+               "\n");
+}
+
+static struct option options[] = {
+       { "nodaemon", 0, 0, 'n' },
+       { "compat",   0, 0, 'c' },
+       { "debug",    0, 0, 'd' },
+       { "help",     0, 0, 'h' },
+       { }
+};
+
 int main(int argc, char *argv[])
 {
        DBusConnection *conn;
+       DBusError err;
        struct sigaction sa;
+       int opt, detach = 1, compat = 0, debug = 0;
+
+       while ((opt = getopt_long(argc, argv, "+ncdh", options, NULL)) != EOF) {
+               switch (opt) {
+               case 'n':
+                       detach = 0;
+                       break;
+               case 'c':
+                       compat = 1;
+                       break;
+               case 'd':
+                       debug = 1;
+                       break;
+               case 'h':
+               default:
+                       usage();
+                       exit(0);
+               }
+       }
+
+       argc -= optind;
+       argv += optind;
+       optind = 0;
+
+       if (detach) {
+               if (daemon(0, 0)) {
+                       perror("Can't start daemon");
+                       exit(1);
+               }
+       }
+
+       mkdir(STATEDIR, S_IRUSR | S_IWUSR | S_IXUSR |
+                       S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
+
+       mkdir(STORAGEDIR, S_IRUSR | S_IWUSR | S_IXUSR |
+                       S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
 
        main_loop = g_main_loop_new(NULL, FALSE);
 
-       conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, CONNMAN_SERVICE);
+       dbus_error_init(&err);
+
+       conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, CONNMAN_SERVICE, &err);
        if (conn == NULL) {
-               fprintf(stderr, "Can't register with system bus\n");
+               if (dbus_error_is_set(&err) == TRUE) {
+                       fprintf(stderr, "%s\n", err.message);
+                       dbus_error_free(&err);
+               } else
+                       fprintf(stderr, "Can't register with system bus\n");
                exit(1);
        }
 
-       g_dbus_register_object(conn, CONNMAN_MANAGER_PATH, NULL, NULL);
+       if (compat) {
+               if (g_dbus_request_name(conn, NM_SERVICE, NULL) == FALSE)
+                       compat = 0;
+       }
+
+       __connman_log_init(detach, debug);
+
+       __connman_agent_init(conn);
+
+       __connman_manager_init(conn, compat);
+
+       __connman_plugin_init();
+
+       __connman_rtnl_init();
+
+       __connman_iface_init(conn);
 
        memset(&sa, 0, sizeof(sa));
        sa.sa_handler = sig_term;
@@ -61,11 +145,25 @@ int main(int argc, char *argv[])
 
        g_main_loop_run(main_loop);
 
-       g_dbus_unregister_object(conn, CONNMAN_MANAGER_PATH);
+       __connman_iface_cleanup();
+
+       __connman_rtnl_cleanup();
+
+       __connman_plugin_cleanup();
+
+       __connman_manager_cleanup();
+
+       __connman_agent_cleanup();
+
+       __connman_log_cleanup();
 
        g_dbus_cleanup_connection(conn);
 
        g_main_loop_unref(main_loop);
 
+       rmdir(STORAGEDIR);
+
+       rmdir(STATEDIR);
+
        return 0;
 }