From e9f754b51e4551c345cf1e7117748be59826a71b Mon Sep 17 00:00:00 2001 From: Kwangyoun Kim Date: Mon, 28 Nov 2016 15:12:09 +0900 Subject: [PATCH] Add dbus signal handling for daemon exeption Change-Id: I52dd071b3b063d13923b434d60ff219254777f2f Signed-off-by: Kwangyoun Kim --- client/vc_dbus.c | 37 ++++++++++++++++++++++++++++++++++--- client/vc_mgr_dbus.c | 31 +++++++++++++++++++++++++++++++ client/vc_widget_dbus.c | 38 +++++++++++++++++++++++++++++++++++--- server/vcd_main.c | 2 -- server/vcd_server.c | 39 --------------------------------------- server/vcd_server.h | 2 -- 6 files changed, 100 insertions(+), 49 deletions(-) diff --git a/client/vc_dbus.c b/client/vc_dbus.c index d221b6a..f7af5f9 100644 --- a/client/vc_dbus.c +++ b/client/vc_dbus.c @@ -160,6 +160,13 @@ static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handle SLOG(LOG_DEBUG, TAG_VCC, " "); } /* VCD_METHOD_ERROR */ + else if (dbus_message_is_signal(msg, "org.freedesktop.DBus", "NameOwnerChanged")) { + SLOG(LOG_DEBUG, TAG_VCC, "===== Owner Changed"); + __vc_cb_error(VC_ERROR_SERVICE_RESET, -1, "Daemon Reset"); + SLOG(LOG_DEBUG, TAG_VCC, "====="); + SLOG(LOG_DEBUG, TAG_VCC, " "); + } /* NameOwnerChanged */ + else { SLOG(LOG_DEBUG, TAG_VCC, "Message is NOT valid"); dbus_message_unref(msg); @@ -438,6 +445,19 @@ int vc_dbus_request_initialize(int pid, int* mgr_pid, int* service_state, int* d *mgr_pid = tmp; *service_state = tmp_service_state; *daemon_pid = tmp_daemon_pid; + + /* add a rule for daemon error */ + char rule_err[256] = {0, }; + snprintf(rule_err, 256, "sender='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',type='signal',arg0='%s'", VC_SERVER_SERVICE_INTERFACE); + dbus_bus_add_match(g_conn_listener, rule_err, &err); + dbus_connection_flush(g_conn_listener); + + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCC, "Match Error (%s)", err.message); + dbus_error_free(&err); + return VC_ERROR_OPERATION_FAILED; + } + SLOG(LOG_DEBUG, TAG_VCC, "<<<< vc initialize : result = %d mgr = %d service = %d daemon_pid = %d", result, *mgr_pid, *service_state, *daemon_pid); } else { SLOG(LOG_ERROR, TAG_VCC, "<<<< vc initialize : result = %d", result); @@ -453,10 +473,24 @@ int vc_dbus_request_initialize(int pid, int* mgr_pid, int* service_state, int* d int vc_dbus_request_finalize(int pid) { + DBusError err; + dbus_error_init(&err); + if (0 != __dbus_check()) { return VC_ERROR_OPERATION_FAILED; } + /* remove a rule for daemon error */ + char rule_err[256] = {0, }; + snprintf(rule_err, 256, "sender='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',type='signal',arg0='%s'", VC_SERVER_SERVICE_INTERFACE); + dbus_bus_remove_match(g_conn_listener, rule_err, &err); + dbus_connection_flush(g_conn_listener); + + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCC, "Match Error (%s)", err.message); + dbus_error_free(&err); + } + DBusMessage* msg; msg = dbus_message_new_method_call( @@ -474,9 +508,6 @@ int vc_dbus_request_finalize(int pid) dbus_message_append_args(msg, DBUS_TYPE_INT32, &pid, DBUS_TYPE_INVALID); - DBusError err; - dbus_error_init(&err); - DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; diff --git a/client/vc_mgr_dbus.c b/client/vc_mgr_dbus.c index 9c70c07..93cbb17 100644 --- a/client/vc_mgr_dbus.c +++ b/client/vc_mgr_dbus.c @@ -463,6 +463,13 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd SLOG(LOG_DEBUG, TAG_VCM, " "); } /* VC_METHOD_AUTH_CANCEL */ + else if (dbus_message_is_signal(msg, "org.freedesktop.DBus", "NameOwnerChanged")) { + SLOG(LOG_DEBUG, TAG_VCM, "===== Owner Changed"); + __vc_mgr_cb_error(VC_ERROR_SERVICE_RESET, -1, "Daemon Reset"); + SLOG(LOG_DEBUG, TAG_VCM, "====="); + SLOG(LOG_DEBUG, TAG_VCM, " "); + } /* NameOwnerChanged */ + else { SLOG(LOG_DEBUG, TAG_VCM, "Message is NOT valid"); dbus_message_unref(msg); @@ -762,6 +769,18 @@ int vc_mgr_dbus_request_initialize(int pid, int* service_state, int* foreground, *service_state = tmp_service_state; *foreground = tmp_foreground; *daemon_pid = tmp_daemon_pid; + + /* add a rule for daemon error */ + char rule_err[256] = {0, }; + snprintf(rule_err, 256, "sender='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',type='signal',arg0='%s'", VC_SERVER_SERVICE_INTERFACE); + dbus_bus_add_match(g_m_conn_listener, rule_err, &err); + dbus_connection_flush(g_m_conn_listener); + + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCM, "Match Error (%s)", err.message); + dbus_error_free(&err); + } + SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc mgr initialize : result = %d, service state = %d, foreground = %d, daemon_pid = %d", result, *service_state, *foreground, *daemon_pid); } else { @@ -797,6 +816,18 @@ int vc_mgr_dbus_request_finalize(int pid) return VC_ERROR_OPERATION_FAILED; } + /* remove a rule for daemon error */ + char rule_err[256] = {0, }; + snprintf(rule_err, 256, "sender='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',type='signal',arg0='%s'", VC_SERVER_SERVICE_INTERFACE); + dbus_bus_remove_match(g_m_conn_listener, rule_err, &err); + dbus_connection_flush(g_m_conn_listener); + + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCM, "Match Error (%s)", err.message); + dbus_error_free(&err); + return VC_ERROR_OPERATION_FAILED; + } + DBusMessage* msg; msg = dbus_message_new_method_call( diff --git a/client/vc_widget_dbus.c b/client/vc_widget_dbus.c index a449df4..d491393 100644 --- a/client/vc_widget_dbus.c +++ b/client/vc_widget_dbus.c @@ -206,6 +206,13 @@ static Eina_Bool widget_listener_event_callback(void* data, Ecore_Fd_Handler *fd SLOG(LOG_DEBUG, TAG_VCW, " "); } /* VCD_WIDGET_METHOD_ERROR */ + else if (dbus_message_is_signal(msg, "org.freedesktop.DBus", "NameOwnerChanged")) { + SLOG(LOG_DEBUG, TAG_VCW, "===== Owner Changed"); + __vc_widget_cb_error(VC_ERROR_SERVICE_RESET, -1, "Daemon Reset"); + SLOG(LOG_DEBUG, TAG_VCW, "====="); + SLOG(LOG_DEBUG, TAG_VCW, " "); + } /* NameOwnerChanged */ + else { SLOG(LOG_ERROR, TAG_VCW, "Message is NOT valid"); dbus_message_unref(msg); @@ -465,6 +472,19 @@ int vc_widget_dbus_request_initialize(int pid, int* service_state, int* daemon_p if (0 == result) { *service_state = tmp_service_state; *daemon_pid = tmp_daemon_pid; + + /* add a rule for daemon error */ + char rule_err[256] = {0, }; + snprintf(rule_err, 256, "sender='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',type='signal',arg0='%s'", VC_SERVER_SERVICE_INTERFACE); + dbus_bus_add_match(g_w_conn_listener, rule_err, &err); + dbus_connection_flush(g_w_conn_listener); + + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCW, "Match Error (%s)", err.message); + dbus_error_free(&err); + return VC_ERROR_OPERATION_FAILED; + } + SLOG(LOG_DEBUG, TAG_VCW, "<<<< vc widget initialize : result = %d service = %d daemon_pid = %d", result, *service_state, *daemon_pid); } else { SLOG(LOG_ERROR, TAG_VCW, "<<<< vc widget initialize : result = %d", result); @@ -480,6 +500,21 @@ int vc_widget_dbus_request_initialize(int pid, int* service_state, int* daemon_p int vc_widget_dbus_request_finalize(int pid) { + DBusError err; + dbus_error_init(&err); + + /* remove a rule for daemon error */ + char rule_err[256] = {0, }; + snprintf(rule_err, 256, "sender='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged',type='signal',arg0='%s'", VC_SERVER_SERVICE_INTERFACE); + dbus_bus_remove_match(g_w_conn_listener, rule_err, &err); + dbus_connection_flush(g_w_conn_listener); + + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCW, "Match Error (%s)", err.message); + dbus_error_free(&err); + return VC_ERROR_OPERATION_FAILED; + } + DBusMessage* msg; msg = dbus_message_new_method_call( @@ -497,9 +532,6 @@ int vc_widget_dbus_request_finalize(int pid) dbus_message_append_args(msg, DBUS_TYPE_INT32, &pid, DBUS_TYPE_INVALID); - DBusError err; - dbus_error_init(&err); - DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; diff --git a/server/vcd_main.c b/server/vcd_main.c index 903ff3f..2996ba0 100644 --- a/server/vcd_main.c +++ b/server/vcd_main.c @@ -67,8 +67,6 @@ int main(int argc, char** argv) vcd_finalize(); - vcd_unregister_signal(); - vcd_dbus_close_connection(); ecore_shutdown(); diff --git a/server/vcd_server.c b/server/vcd_server.c index 2076a30..41f225e 100644 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -915,49 +915,10 @@ static int __vcd_db_clean_up() return ret; } -static void __sig_handler(int signo) -{ - /* restore signal handler */ - signal(signo, SIG_DFL); - SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR]"); - - if (0 == vcd_check_dbus_connection()) { - /* Send error signal for notifying that daemon is reset*/ - vcdc_send_error_signal(VCD_ERROR_SERVICE_RESET, "Daemon reset"); - } - - /* invoke signal again */ - raise(signo); -} - -static void __register_sig_handler() -{ - signal(SIGSEGV, __sig_handler); - signal(SIGABRT, __sig_handler); - signal(SIGTERM, __sig_handler); - signal(SIGINT, __sig_handler); - signal(SIGQUIT, __sig_handler); - signal(SIGILL, __sig_handler); - signal(SIGBUS, __sig_handler); -} - -void vcd_unregister_signal() -{ - signal(SIGSEGV, SIG_IGN); - signal(SIGABRT, SIG_IGN); - signal(SIGTERM, SIG_IGN); - signal(SIGINT, SIG_IGN); - signal(SIGQUIT, SIG_IGN); - signal(SIGILL, SIG_IGN); - signal(SIGBUS, SIG_IGN); -} - int vcd_initialize() { int ret = 0; - __register_sig_handler(); - /* Remove old file */ __vcd_file_clean_up(); diff --git a/server/vcd_server.h b/server/vcd_server.h index 72a51db..5166ccb 100644 --- a/server/vcd_server.h +++ b/server/vcd_server.h @@ -32,8 +32,6 @@ int vcd_initialize(); void vcd_finalize(); -void vcd_unregister_signal(); - Eina_Bool vcd_cleanup_client_all(void *data); int vcd_server_get_service_state(); -- 2.7.4