crash-manager: dbus: Add information about signal that caused crash 68/210368/2
authorKarol Lewandowski <k.lewandowsk@samsung.com>
Thu, 18 Jul 2019 11:32:48 +0000 (13:32 +0200)
committerKarol Lewandowski <k.lewandowsk@samsung.com>
Fri, 19 Jul 2019 13:24:08 +0000 (15:24 +0200)
Signal number is going to be available under "sys.signal" key in
broadcasted signal.

Change-Id: I1c1e57e9229ca0d896ce095782d3c510ab5fe96e

src/crash-manager/crash-manager.c
src/crash-manager/dbus_notify.c
tests/system/dbus_notify/dbus_notify.sh.template

index bf55763..59b0537 100644 (file)
@@ -679,7 +679,7 @@ static void launch_dbus_notify(struct crash_info *cinfo)
 {
        assert(cinfo);
 
-       char pid_str[11], tid_str[11];
+       char pid_str[11], tid_str[11], sig_str[11];
        char *prstatus_fd_str = NULL;
 
        if (asprintf(&prstatus_fd_str, "%d", cinfo->prstatus_fd) == -1) {
@@ -689,6 +689,7 @@ static void launch_dbus_notify(struct crash_info *cinfo)
 
        SNPRINTF_OR_EXIT(pid, "%d")
        SNPRINTF_OR_EXIT(tid, "%d")
+       SNPRINTF_OR_EXIT(sig, "%d")
 
        char *av[] = { CRASH_NOTIFY_BIN_PATH,
                        "--cmdline", cinfo->cmd_line,
@@ -699,6 +700,7 @@ static void launch_dbus_notify(struct crash_info *cinfo)
                        "--pkgid", cinfo->pkgid,
                        "--reportpath", cinfo->result_path,
                        "--prstatus_fd", prstatus_fd_str,
+                       "--signal", sig_str,
                        NULL };
 
        spawn(av, NULL, NULL, NULL, NULL);
index 3a87808..8ba0c3c 100644 (file)
@@ -55,6 +55,7 @@ struct NotifyParams {
        int prstatus_fd;
        pid_t pid;
        pid_t tid;
+       int signal;
        char *cmd_name;
        char *cmd_path;
        char *report_path;
@@ -165,6 +166,13 @@ static GVariant* build_message_data(const struct NotifyParams *notify_params)
 
        g_variant_builder_open(&md_builder, G_VARIANT_TYPE("a{sv}"));
 
+       if (notify_params->signal) {
+               g_variant_builder_open(&md_builder, G_VARIANT_TYPE("{sv}"));
+               g_variant_builder_add(&md_builder, "s", "sys.signal");
+               g_variant_builder_add(&md_builder, "v", g_variant_new_int32(notify_params->signal));
+               g_variant_builder_close(&md_builder);
+       }
+
        struct RegInfo *reg_info;
        int regs_count = _get_important_registers(notify_params->prstatus_fd, &reg_info);
 
@@ -239,6 +247,7 @@ static bool parse_cmdline(int ac, char *av[], struct NotifyParams *params)
                FLAG_PKGID,
                FLAG_REPORTPATH,
                FLAG_PRSTATUS_FD,
+               FLAG_SIGNAL,
        };
        static const struct option options[] = {
                { .name = "cmdline",     .has_arg = required_argument, .flag = NULL, .val = FLAG_CMDLINE },
@@ -249,6 +258,7 @@ static bool parse_cmdline(int ac, char *av[], struct NotifyParams *params)
                { .name = "pkgid",       .has_arg = required_argument, .flag = NULL, .val = FLAG_PKGID },
                { .name = "reportpath",  .has_arg = required_argument, .flag = NULL, .val = FLAG_REPORTPATH },
                { .name = "prstatus_fd", .has_arg = required_argument, .flag = NULL, .val = FLAG_PRSTATUS_FD },
+               { .name = "signal",      .has_arg = required_argument, .flag = NULL, .val = FLAG_SIGNAL },
                { NULL },
        };
 
@@ -272,6 +282,8 @@ static bool parse_cmdline(int ac, char *av[], struct NotifyParams *params)
                        params->pkgid = optarg;
                else if (FLAG_PRSTATUS_FD == val)
                        params->prstatus_fd = atoi(optarg);
+               else if (FLAG_SIGNAL == val)
+                       params->signal = atoi(optarg);
        } while (val != -1);
 
        return params->cmd_name && params->cmd_path && params->appid && params->pkgid && params->prstatus_fd > 0;
@@ -281,7 +293,7 @@ static void usage(const char *const progname)
 {
        assert(progname);
 
-       printf("%s --prstatus_fd N --pid PID --tid TID --cmdline CMDLINE --cmdpath CMDPATH --appid APPID --pkgid PKGID\n", progname);
+       printf("%s --prstatus_fd N --pid PID --tid TID --cmdline CMDLINE --cmdpath CMDPATH --appid APPID --pkgid PKGID --signal SIGNALNR\n", progname);
 }
 
 int main(int ac, char *av[])
index c7e7349..89972cc 100644 (file)
@@ -27,6 +27,10 @@ fi
 #         string "arm.lr"
 #         variant             uint32 3070220008
 #      )
+#      dict entry(
+#         string "sys.signal"
+#         variant             int32 6
+#      )
 #   ]
 
 ( ${CRASH_WORKER_SYSTEM_TESTS}/utils/kenny &
@@ -64,7 +68,11 @@ for i in $(seq 1 10); do
                        score=$(($score + 1))
                fi
 
-               if [ $score -eq 3 ]; then
+               if egrep -A1 "string \"sys.signal" $TMPFILE | grep 'int32 6'; then
+                       score=$(($score + 1))
+               fi
+
+               if [ $score -eq 4 ]; then
                        exit_with_code "SUCCESS" ${SUCCESS_CODE}
                fi
        fi