X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fmain.c;h=000847d6692319e55989900a5cf93f44026dff25;hb=c4f2302710ca4e779555759418bac3babc2d953e;hp=1f30cb483af89108bc9459fc4e36f34e8b083d4c;hpb=986cc2bccd53c801a9c15a0e1367dd1d63f2ca30;p=connman diff --git a/src/main.c b/src/main.c index 1f30cb4..000847d 100644 --- a/src/main.c +++ b/src/main.c @@ -2,7 +2,7 @@ * * Connection Manager * - * Copyright (C) 2007 Intel Corporation. All rights reserved. + * Copyright (C) 2007-2008 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 @@ -27,10 +27,10 @@ #include #include #include -#include #include #include #include +#include #include @@ -43,87 +43,118 @@ static void sig_term(int sig) g_main_loop_quit(main_loop); } -static void usage(void) +static void disconnect_callback(DBusConnection *conn, void *user_data) { - printf("Connection Manager version %s\n\n", VERSION); + DBG("D-Bus disconnect"); - 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"); + g_main_loop_quit(main_loop); } -static struct option options[] = { - { "nodaemon", 0, 0, 'n' }, - { "compat", 0, 0, 'c' }, - { "help", 0, 0, 'h' }, - { } +static gchar *option_device = NULL; +static gboolean option_detach = TRUE; +static gboolean option_compat = FALSE; +static gboolean option_debug = FALSE; + +static GOptionEntry options[] = { + { "device", 'i', 0, G_OPTION_ARG_STRING, &option_device, + "Specify network device/interface", "DEV" }, + { "nodaemon", 'n', G_OPTION_FLAG_REVERSE, + G_OPTION_ARG_NONE, &option_detach, + "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" }, + { NULL }, }; int main(int argc, char *argv[]) { + GOptionContext *context; + GError *error = NULL; DBusConnection *conn; + DBusError err; struct sigaction sa; - int log_option = LOG_NDELAY | LOG_PID; - int opt, detach = 1, compat = 0; - - while ((opt = getopt_long(argc, argv, "+nch", options, NULL)) != EOF) { - switch(opt) { - case 'n': - detach = 0; - break; - case 'c': - compat = 1; - break; - case 'h': - default: - usage(); - exit(0); - } + +#ifdef NEED_THREADS + if (g_thread_supported() == FALSE) + g_thread_init(NULL); +#endif + + context = g_option_context_new(NULL); + g_option_context_add_main_entries(context, options, NULL); + + if (g_option_context_parse(context, &argc, &argv, &error) == FALSE) { + if (error != NULL) { + g_printerr("%s\n", error->message); + g_error_free(error); + } else + g_printerr("An unknown error occurred\n"); + exit(1); } - argc -= optind; - argv += optind; - optind = 0; + g_option_context_free(context); - if (detach) { + if (option_detach == TRUE) { if (daemon(0, 0)) { perror("Can't start daemon"); exit(1); } - } else - log_option |= LOG_PERROR; - - openlog("connmand", log_option, LOG_DAEMON); + } 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); +#ifdef NEED_THREADS + if (dbus_threads_init_default() == FALSE) { + fprintf(stderr, "Can't init usage of threads\n"); + exit(1); + } +#endif + + 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); } - if (compat) { - if (g_dbus_request_name(conn, NM_SERVICE) == FALSE) - compat = 0; + g_dbus_set_disconnect_function(conn, disconnect_callback, NULL, NULL); + + if (option_compat == TRUE) { + if (g_dbus_request_name(conn, NM_SERVICE, NULL) == FALSE) { + fprintf(stderr, "Can't register compat service\n"); + option_compat = FALSE; + } } - __connman_manager_init(conn, compat); + __connman_log_init(option_detach, option_debug); - __connman_plugin_init(); + __connman_storage_init(); + + __connman_element_init(conn, option_device); + + __connman_agent_init(conn); + + __connman_manager_init(conn, option_compat); + + __connman_profile_init(conn); __connman_rtnl_init(); - __connman_iface_init(conn); + __connman_plugin_init(); + + g_free(option_device); memset(&sa, 0, sizeof(sa)); sa.sa_handler = sig_term; @@ -132,21 +163,29 @@ int main(int argc, char *argv[]) g_main_loop_run(main_loop); - __connman_iface_cleanup(); + __connman_plugin_cleanup(); __connman_rtnl_cleanup(); - __connman_plugin_cleanup(); + __connman_profile_cleanup(); __connman_manager_cleanup(); - g_dbus_cleanup_connection(conn); + __connman_agent_cleanup(); + + __connman_element_cleanup(); + + __connman_storage_cleanup(); + + __connman_log_cleanup(); + + dbus_connection_unref(conn); g_main_loop_unref(main_loop); - rmdir(STATEDIR); + rmdir(STORAGEDIR); - closelog(); + rmdir(STATEDIR); return 0; }