Add dbus signal handling for daemon exeption 34/100434/1 accepted/tizen/common/20161130.134133 accepted/tizen/ivi/20161130.233103 accepted/tizen/mobile/20161130.233008 accepted/tizen/tv/20161130.233022 accepted/tizen/wearable/20161130.233045 submit/tizen/20161130.083103
authorKwangyoun Kim <ky85.kim@samsung.com>
Mon, 28 Nov 2016 06:12:09 +0000 (15:12 +0900)
committerKwangyoun Kim <ky85.kim@samsung.com>
Mon, 28 Nov 2016 06:29:30 +0000 (22:29 -0800)
Change-Id: I52dd071b3b063d13923b434d60ff219254777f2f
Signed-off-by: Kwangyoun Kim <ky85.kim@samsung.com>
client/vc_dbus.c
client/vc_mgr_dbus.c
client/vc_widget_dbus.c
server/vcd_main.c
server/vcd_server.c
server/vcd_server.h

index d221b6a..f7af5f9 100644 (file)
@@ -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;
 
index 9c70c07..93cbb17 100644 (file)
@@ -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(
index a449df4..d491393 100644 (file)
@@ -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;
 
index 903ff3f..2996ba0 100644 (file)
@@ -67,8 +67,6 @@ int main(int argc, char** argv)
 
        vcd_finalize();
 
-       vcd_unregister_signal();
-
        vcd_dbus_close_connection();
 
        ecore_shutdown();
index 2076a30..41f225e 100644 (file)
@@ -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();
 
index 72a51db..5166ccb 100644 (file)
@@ -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();