static DBusHandlerResult filter_session_message (DBusConnection *connection, DBusMessage *message, void *user_data) { TestServiceData *testdata = user_data; if (dbus_message_is_method_call (message, "org.freedesktop.DBus.TestSuite.PrivServer", "GetPrivateAddress")) { DBusMessage *reply; reply = dbus_message_new_method_return (message); dbus_message_append_args (reply, DBUS_TYPE_STRING, &(testdata->private_addr), DBUS_TYPE_INVALID); dbus_connection_send (connection, reply, NULL); dbus_message_unref (reply); return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call (message, "org.freedesktop.DBus.TestSuite.PrivServer", "Quit")) { fprintf (stderr, "server exiting loop\n"); _dbus_loop_quit (testdata->loop); return DBUS_HANDLER_RESULT_HANDLED; } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; }
static DBusHandlerResult dbusrecv_message_func(DBusConnection *connection, DBusMessage *message, void *user_data) { dbusrecv_hdl_st *p_dbusrecv_hdl = (dbusrecv_hdl_st *)user_data; if (NULL == p_dbusrecv_hdl) { printf("dbusrecv_message_func: invalid handle!\n"); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } if (dbus_message_is_method_call (message, DBUS_PMD_INTERFACE, "Echo")) { return handle_echo(connection, message, user_data); } else if (dbus_message_is_method_call (message, DBUS_PMD_INTERFACE, "Exit")) { _dbus_loop_quit (p_dbusrecv_hdl->dbusloop); p_dbusrecv_hdl->dbusloop = NULL; return DBUS_HANDLER_RESULT_HANDLED; } else if (dbus_message_is_method_call(message, DBUS_PMD_INTERFACE, "system")) { return handle_system(connection, message, user_data); } else return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; }
static void signal_handler (int sig) { DBusString str; switch (sig) { #ifdef DBUS_BUS_ENABLE_DNOTIFY_ON_LINUX case SIGIO: /* explicit fall-through */ #endif /* DBUS_BUS_ENABLE_DNOTIFY_ON_LINUX */ case SIGHUP: _dbus_string_init_const (&str, "foo"); if (!_dbus_write_socket (reload_pipe[RELOAD_WRITE_END], &str, 0, 1)) { _dbus_warn ("Unable to write to reload pipe.\n"); exit (1); } break; case SIGTERM: _dbus_loop_quit (bus_context_get_loop (context)); break; } }
static void quit (void) { if (!already_quit) { _dbus_loop_quit (loop); already_quit = TRUE; } }
int dbusrecv_uninit(dbusrecv_hdl_st *p_dbusrecv_hdl) { if (NULL == p_dbusrecv_hdl) { printf("dbusrecv_uninit: invalid parameter, p_dbusrecv_hdl!"); return -1; } if (p_dbusrecv_hdl->dbusloop) { _dbus_loop_quit (p_dbusrecv_hdl->dbusloop); sleep(2); } if (p_dbusrecv_hdl->connection) { test_connection_shutdown (p_dbusrecv_hdl->dbusloop, p_dbusrecv_hdl->connection); if (p_dbusrecv_hdl->filter_func) dbus_connection_remove_filter (p_dbusrecv_hdl->connection, p_dbusrecv_hdl->filter_func, NULL); dbus_connection_unref (p_dbusrecv_hdl->connection); p_dbusrecv_hdl->connection = NULL; } if (p_dbusrecv_hdl->dbusloop) { _dbus_loop_unref (p_dbusrecv_hdl->dbusloop); p_dbusrecv_hdl->dbusloop = NULL; } dbus_shutdown(); if (p_dbusrecv_hdl->dbusrecv_cfg.myname) { free(p_dbusrecv_hdl->dbusrecv_cfg.myname); p_dbusrecv_hdl->dbusrecv_cfg.myname = NULL; } free(p_dbusrecv_hdl); p_dbusrecv_hdl = NULL; _dbus_verbose("%s: service exiting!\n", __FILE__); return 0; }
static dbus_bool_t handle_reload_watch (DBusWatch *watch, unsigned int flags, void *data) { DBusError error; DBusString str; char *action_str; char action = '\0'; while (!_dbus_string_init (&str)) _dbus_wait_for_memory (); if ((reload_pipe[RELOAD_READ_END] > 0) && _dbus_read_socket (reload_pipe[RELOAD_READ_END], &str, 1) != 1) { _dbus_warn ("Couldn't read from reload pipe.\n"); close_reload_pipe (&watch); return TRUE; } action_str = _dbus_string_get_data (&str); if (action_str != NULL) { action = action_str[0]; } _dbus_string_free (&str); /* this can only fail if we don't understand the config file * or OOM. Either way we should just stick with the currently * loaded config. */ dbus_error_init (&error); switch (action) { case ACTION_RELOAD: if (! bus_context_reload_config (context, &error)) { _DBUS_ASSERT_ERROR_IS_SET (&error); _dbus_assert (dbus_error_has_name (&error, DBUS_ERROR_FAILED) || dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)); _dbus_warn ("Unable to reload configuration: %s\n", error.message); dbus_error_free (&error); } break; case ACTION_QUIT: { DBusLoop *loop; /* * On OSs without abstract sockets, we want to quit * gracefully rather than being killed by SIGTERM, * so that DBusServer gets a chance to clean up the * sockets from the filesystem. fd.o #38656 */ loop = bus_context_get_loop (context); if (loop != NULL) { _dbus_loop_quit (loop); } } break; default: break; } return TRUE; }