char * sr_java_frame_to_json(struct sr_java_frame *frame) { struct sr_strbuf *strbuf = sr_strbuf_new(); /* Name. */ if (frame->name) { sr_strbuf_append_str(strbuf, ", \"name\": "); sr_json_append_escaped(strbuf, frame->name); sr_strbuf_append_str(strbuf, "\n"); } /* File name. */ if (frame->file_name) { sr_strbuf_append_str(strbuf, ", \"file_name\": "); sr_json_append_escaped(strbuf, frame->file_name); sr_strbuf_append_str(strbuf, "\n"); /* File line. */ sr_strbuf_append_strf(strbuf, ", \"file_line\": %"PRIu32"\n", frame->file_line); } /* Class path. */ if (frame->class_path) { sr_strbuf_append_str(strbuf, ", \"class_path\": "); sr_json_append_escaped(strbuf, frame->class_path); sr_strbuf_append_str(strbuf, "\n"); } /* Is native? */ sr_strbuf_append_strf(strbuf, ", \"is_native\": %s\n", frame->is_native ? "true" : "false"); /* Is exception? */ sr_strbuf_append_strf(strbuf, ", \"is_exception\": %s\n", frame->is_exception ? "true" : "false"); /* Message. */ if (frame->message) { sr_strbuf_append_str(strbuf, ", \"message\": "); sr_json_append_escaped(strbuf, frame->message); sr_strbuf_append_str(strbuf, "\n"); } strbuf->buf[0] = '{'; sr_strbuf_append_str(strbuf, "}"); return sr_strbuf_free_nobuf(strbuf); }
char * sr_ruby_frame_to_json(struct sr_ruby_frame *frame) { struct sr_strbuf *strbuf = sr_strbuf_new(); /* Source file name. */ if (frame->file_name) { sr_strbuf_append_str(strbuf, ", \"file_name\": "); sr_json_append_escaped(strbuf, frame->file_name); sr_strbuf_append_str(strbuf, "\n"); } /* Source file line. */ if (frame->file_line) { sr_strbuf_append_strf(strbuf, ", \"file_line\": %"PRIu32"\n", frame->file_line); } /* Function name / special function. */ if (frame->function_name) { if (frame->special_function) sr_strbuf_append_str(strbuf, ", \"special_function\": "); else sr_strbuf_append_str(strbuf, ", \"function_name\": "); sr_json_append_escaped(strbuf, frame->function_name); sr_strbuf_append_str(strbuf, "\n"); } /* Block level. */ if (frame->block_level > 0) { sr_strbuf_append_strf(strbuf, ", \"block_level\": %"PRIu32"\n", frame->block_level); } /* Rescue level. */ if (frame->rescue_level > 0) { sr_strbuf_append_strf(strbuf, ", \"rescue_level\": %"PRIu32"\n", frame->rescue_level); } strbuf->buf[0] = '{'; sr_strbuf_append_char(strbuf, '}'); return sr_strbuf_free_nobuf(strbuf); }
char * sr_python_frame_to_json(struct sr_python_frame *frame) { struct sr_strbuf *strbuf = sr_strbuf_new(); /* Source file name / special file. */ if (frame->file_name) { if (frame->special_file) sr_strbuf_append_str(strbuf, ", \"special_file\": "); else sr_strbuf_append_str(strbuf, ", \"file_name\": "); sr_json_append_escaped(strbuf, frame->file_name); sr_strbuf_append_str(strbuf, "\n"); } /* Source file line. */ if (frame->file_line) { sr_strbuf_append_strf(strbuf, ", \"file_line\": %"PRIu32"\n", frame->file_line); } /* Function name / special function. */ if (frame->function_name) { if (frame->special_function) sr_strbuf_append_str(strbuf, ", \"special_function\": "); else sr_strbuf_append_str(strbuf, ", \"function_name\": "); sr_json_append_escaped(strbuf, frame->function_name); sr_strbuf_append_str(strbuf, "\n"); } /* Line contents. */ if (frame->line_contents) { sr_strbuf_append_str(strbuf, ", \"line_contents\": "); sr_json_append_escaped(strbuf, frame->line_contents); sr_strbuf_append_str(strbuf, "\n"); } strbuf->buf[0] = '{'; sr_strbuf_append_char(strbuf, '}'); return sr_strbuf_free_nobuf(strbuf); }
char * sr_core_stacktrace_to_json(struct sr_core_stacktrace *stacktrace) { struct sr_strbuf *strbuf = sr_strbuf_new(); sr_strbuf_append_strf(strbuf, "{ \"signal\": %"PRIu16"\n", stacktrace->signal); if (stacktrace->executable) { sr_strbuf_append_str(strbuf, ", \"executable\": "); sr_json_append_escaped(strbuf, stacktrace->executable); sr_strbuf_append_str(strbuf, "\n"); } if (stacktrace->only_crash_thread) sr_strbuf_append_str(strbuf, ", \"only_crash_thread\": true\n"); sr_strbuf_append_str(strbuf, ", \"stacktrace\":\n"); struct sr_core_thread *thread = stacktrace->threads; while (thread) { if (thread == stacktrace->threads) sr_strbuf_append_str(strbuf, " [ "); else sr_strbuf_append_str(strbuf, " , "); bool crash_thread = (thread == stacktrace->crash_thread); /* If we don't know the crash thread, just take the first one. */ crash_thread |= (stacktrace->crash_thread == NULL && thread == stacktrace->threads); char *thread_json = sr_core_thread_to_json(thread, crash_thread); char *indented_thread_json = sr_indent_except_first_line(thread_json, 8); sr_strbuf_append_str(strbuf, indented_thread_json); free(indented_thread_json); free(thread_json); thread = thread->next; if (thread) sr_strbuf_append_str(strbuf, "\n"); } sr_strbuf_append_str(strbuf, " ]\n"); sr_strbuf_append_char(strbuf, '}'); return sr_strbuf_free_nobuf(strbuf); }
char * sr_python_stacktrace_to_json(struct sr_python_stacktrace *stacktrace) { struct sr_strbuf *strbuf = sr_strbuf_new(); /* Exception class name. */ if (stacktrace->exception_name) { sr_strbuf_append_str(strbuf, ", \"exception_name\": "); sr_json_append_escaped(strbuf, stacktrace->exception_name); sr_strbuf_append_str(strbuf, "\n"); } /* Frames. */ if (stacktrace->frames) { struct sr_python_frame *frame = stacktrace->frames; sr_strbuf_append_str(strbuf, ", \"stacktrace\":\n"); while (frame) { if (frame == stacktrace->frames) sr_strbuf_append_str(strbuf, " [ "); else sr_strbuf_append_str(strbuf, " , "); char *frame_json = sr_python_frame_to_json(frame); char *indented_frame_json = sr_indent_except_first_line(frame_json, 8); sr_strbuf_append_str(strbuf, indented_frame_json); free(indented_frame_json); free(frame_json); frame = frame->next; if (frame) sr_strbuf_append_str(strbuf, "\n"); } sr_strbuf_append_str(strbuf, " ]\n"); } if (strbuf->len > 0) strbuf->buf[0] = '{'; else sr_strbuf_append_char(strbuf, '{'); sr_strbuf_append_char(strbuf, '}'); return sr_strbuf_free_nobuf(strbuf); }
char * sr_koops_stacktrace_to_json(struct sr_koops_stacktrace *stacktrace) { struct sr_strbuf *strbuf = sr_strbuf_new(); /* Raw oops. */ if (stacktrace->raw_oops) { sr_strbuf_append_str(strbuf, ", \"raw_oops\": "); sr_json_append_escaped(strbuf, stacktrace->raw_oops); sr_strbuf_append_str(strbuf, "\n"); } /* Kernel version. */ if (stacktrace->version) { sr_strbuf_append_str(strbuf, ", \"version\": "); sr_json_append_escaped(strbuf, stacktrace->version); sr_strbuf_append_str(strbuf, "\n"); } /* Kernel taint flags. */ char *taint_flags = taint_flags_to_json(stacktrace); char *indented_taint_flags = sr_indent_except_first_line(taint_flags, strlen(", \"taint_flags\": ")); free(taint_flags); sr_strbuf_append_strf(strbuf, ", \"taint_flags\": %s\n", indented_taint_flags); free(indented_taint_flags); /* Modules. */ if (stacktrace->modules) { sr_strbuf_append_strf(strbuf, ", \"modules\":\n"); sr_strbuf_append_str(strbuf, " [ "); char **module = stacktrace->modules; while (*module) { if (module != stacktrace->modules) sr_strbuf_append_str(strbuf, " , "); sr_json_append_escaped(strbuf, *module); ++module; if (*module) sr_strbuf_append_str(strbuf, "\n"); } sr_strbuf_append_str(strbuf, " ]\n"); } /* Frames. */ if (stacktrace->frames) { struct sr_koops_frame *frame = stacktrace->frames; sr_strbuf_append_str(strbuf, ", \"frames\":\n"); while (frame) { if (frame == stacktrace->frames) sr_strbuf_append_str(strbuf, " [ "); else sr_strbuf_append_str(strbuf, " , "); char *frame_json = sr_koops_frame_to_json(frame); char *indented_frame_json = sr_indent_except_first_line(frame_json, 8); sr_strbuf_append_str(strbuf, indented_frame_json); free(indented_frame_json); free(frame_json); frame = frame->next; if (frame) sr_strbuf_append_str(strbuf, "\n"); } sr_strbuf_append_str(strbuf, " ]\n"); } if (strbuf->len > 0) strbuf->buf[0] = '{'; else sr_strbuf_append_char(strbuf, '{'); sr_strbuf_append_char(strbuf, '}'); return sr_strbuf_free_nobuf(strbuf); }
char * sr_operating_system_to_json(struct sr_operating_system *operating_system) { struct sr_strbuf *strbuf = sr_strbuf_new(); if (operating_system->name) { sr_strbuf_append_str(strbuf, ", \"name\": "); sr_json_append_escaped(strbuf, operating_system->name); sr_strbuf_append_str(strbuf, "\n"); } if (operating_system->version) { sr_strbuf_append_str(strbuf, ", \"version\": "); sr_json_append_escaped(strbuf, operating_system->version); sr_strbuf_append_str(strbuf, "\n"); } if (operating_system->architecture) { sr_strbuf_append_str(strbuf, ", \"architecture\": "); sr_json_append_escaped(strbuf, operating_system->architecture); sr_strbuf_append_str(strbuf, "\n"); } if (operating_system->cpe) { sr_strbuf_append_str(strbuf, ", \"cpe\": "); sr_json_append_escaped(strbuf, operating_system->cpe); sr_strbuf_append_str(strbuf, "\n"); } if (operating_system->desktop) { sr_strbuf_append_str(strbuf, ", \"desktop\": "); sr_json_append_escaped(strbuf, operating_system->desktop); sr_strbuf_append_str(strbuf, "\n"); } if (operating_system->variant) { sr_strbuf_append_str(strbuf, ", \"variant\": "); sr_json_append_escaped(strbuf, operating_system->variant); sr_strbuf_append_str(strbuf, "\n"); } if (operating_system->uptime > 0) { sr_strbuf_append_strf(strbuf, ", \"uptime\": %"PRIu64"\n", operating_system->uptime); } if (strbuf->len > 0) strbuf->buf[0] = '{'; else sr_strbuf_append_char(strbuf, '{'); sr_strbuf_append_char(strbuf, '}'); return sr_strbuf_free_nobuf(strbuf); }