static gboolean setup_bus(DBusConnection *conn, const char *name, DBusError *error) { gboolean result; DBusDispatchStatus status; if (name != NULL) { result = g_dbus_request_name(conn, name, error); if (error != NULL) { if (dbus_error_is_set(error) == TRUE) return FALSE; } if (result == FALSE) return FALSE; } setup_dbus_with_main_loop(conn); status = dbus_connection_get_dispatch_status(conn); queue_dispatch(conn, status); return TRUE; }
static int nmcompat_init(void) { DBG(""); connection = connman_dbus_get_connection(); if (connection == NULL) return -1; if (g_dbus_request_name(connection, NM_SERVICE, NULL) == FALSE) { connman_error("nmcompat: failed register service\n"); return -1; } if (connman_notifier_register(¬ifier) < 0) { connman_error("nmcompat: failed to register notifier"); return -1; } if (g_dbus_register_interface(connection, NM_PATH, DBUS_PROPERTIES_INTERFACE, methods, signals, NULL, NULL, NULL) == FALSE) { connman_error("nmcompat: failed to register " DBUS_PROPERTIES_INTERFACE); return -1; } return 0; }
int main(int argc, char *argv[]) { GOptionContext *context; GError *error = NULL; DBusConnection *conn; DBusError err; struct sigaction sa; mode_t old_umask; #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); } g_option_context_free(context); if (option_version == TRUE) { printf("%s\n", VERSION); exit(0); } if (option_detach == TRUE) { if (daemon(0, 0)) { perror("Can't start daemon"); exit(1); } } if (mkdir(STATEDIR, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0) { if (errno != EEXIST) perror("Failed to create state directory"); } if (mkdir(STORAGEDIR, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) < 0) { if (errno != EEXIST) perror("Failed to create storage directory"); } old_umask = umask(077); main_loop = g_main_loop_new(NULL, FALSE); #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) { 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_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_log_init(option_detach, option_debug ? DBG_ANY : 0); if (option_selftest == TRUE) { if (__connman_selftest() < 0) { connman_error("Self testing routines failed"); goto selftest; } } __connman_dbus_init(conn); __connman_storage_init(); __connman_element_init(option_device, option_nodevice); __connman_agent_init(); __connman_manager_init(option_compat); __connman_profile_init(); __connman_resolver_init(); __connman_ipconfig_init(); __connman_rtnl_init(); __connman_udev_init(); __connman_task_init(); __connman_plugin_init(option_plugin, option_noplugin); __connman_element_start(); g_free(option_device); g_free(option_plugin); g_free(option_nodevice); g_free(option_noplugin); memset(&sa, 0, sizeof(sa)); sa.sa_handler = sig_term; sigaction(SIGINT, &sa, NULL); sigaction(SIGTERM, &sa, NULL); g_main_loop_run(main_loop); __connman_element_stop(); __connman_plugin_cleanup(); __connman_task_cleanup(); __connman_udev_cleanup(); __connman_rtnl_cleanup(); __connman_ipconfig_cleanup(); __connman_resolver_cleanup(); __connman_profile_cleanup(); __connman_manager_cleanup(); __connman_agent_cleanup(); __connman_element_cleanup(); __connman_storage_cleanup(); __connman_dbus_cleanup(); selftest: __connman_log_cleanup(); dbus_connection_unref(conn); g_main_loop_unref(main_loop); return 0; }