ret_t cherokee_buffer_add_va (cherokee_buffer_t *buf, const char *format, ...) { ret_t ret; va_list ap; va_start (ap, format); ret = cherokee_buffer_add_va_list (buf, format, ap); va_end (ap); return ret; }
static void render_human_error (cherokee_error_type_t type, const char *filename, int line, int error_num, const cherokee_error_t *error, cherokee_buffer_t *output, va_list ap) { UNUSED (error_num); /* Time */ cherokee_buffer_add_char (output, '['); cherokee_buf_add_bogonow (output, false); cherokee_buffer_add_str (output, "] "); /* Error type */ switch (type) { case cherokee_err_warning: cherokee_buffer_add_str (output, "(warning)"); break; case cherokee_err_error: cherokee_buffer_add_str (output, "(error)"); break; case cherokee_err_critical: cherokee_buffer_add_str (output, "(critical)"); break; default: SHOULDNT_HAPPEN; } /* Source */ cherokee_buffer_add_va (output, " %s:%d - ", filename, line); /* Error */ cherokee_buffer_add_va_list (output, error->title, ap); cherokee_buffer_add_char (output, '\n'); /* Backtrace */ #ifdef BACKTRACES_ENABLED cherokee_buf_add_backtrace (output, 2, "\n", " "); #endif }
static void render_python_error (cherokee_error_type_t type, const char *filename, int line, int error_num, const cherokee_error_t *error, cherokee_buffer_t *output, va_list ap) { cherokee_buffer_t tmp = CHEROKEE_BUF_INIT; /* Dict: open */ cherokee_buffer_add_char (output, '{'); /* Error type */ cherokee_buffer_add_str (output, "'type': \""); switch (type) { case cherokee_err_warning: cherokee_buffer_add_str (output, "warning"); break; case cherokee_err_error: cherokee_buffer_add_str (output, "error"); break; case cherokee_err_critical: cherokee_buffer_add_str (output, "critical"); break; default: SHOULDNT_HAPPEN; } cherokee_buffer_add_str (output, "\", "); /* Time */ cherokee_buffer_add_str (output, "'time': \""); cherokee_buf_add_bogonow (output, false); cherokee_buffer_add_str (output, "\", "); /* Render the title */ cherokee_buffer_add_str (output, "'title': \""); cherokee_buffer_add_va_list (output, error->title, ap); cherokee_buffer_add_str (output, "\", "); skip_args (ap, error->title); /* File and line*/ cherokee_buffer_add_str (output, "'code': \""); cherokee_buffer_add_va (output, "%s:%d", filename, line); cherokee_buffer_add_str (output, "\", "); /* Error number */ cherokee_buffer_add_str (output, "'error': \""); cherokee_buffer_add_va (output, "%d", error_num); cherokee_buffer_add_str (output, "\", "); /* Description */ if (error->description) { cherokee_buffer_add_str (output, "'description': \""); cherokee_buffer_clean (&tmp); cherokee_buffer_add_va_list (&tmp, error->description, ap); cherokee_buffer_add_escape_html (output, &tmp); cherokee_buffer_add_str (output, "\", "); skip_args (ap, error->description); } /* Admin URL */ if (error->admin_url) { cherokee_buffer_add_str (output, "'admin_url': \""); cherokee_buffer_add_va_list (output, error->admin_url, ap); cherokee_buffer_add_str (output, "\", "); /* ARGS: Skip 'admin_url' */ skip_args (ap, error->admin_url); } /* Debug information */ if (error->debug) { cherokee_buffer_add_str (output, "'debug': \""); cherokee_buffer_add_va_list (output, error->debug, ap); cherokee_buffer_add_str (output, "\", "); /* ARGS: Skip 'debug' */ skip_args (ap, error->debug); } /* Version */ cherokee_buffer_add_str (output, "'version': \""); cherokee_buffer_add_str (output, PACKAGE_VERSION); cherokee_buffer_add_str (output, "\", "); cherokee_buffer_add_str (output, "'compilation_date': \""); cherokee_buffer_add_str (output, __DATE__ " " __TIME__); cherokee_buffer_add_str (output, "\", "); cherokee_buffer_add_str (output, "'configure_args': \""); cherokee_buffer_clean (&tmp); cherokee_buffer_add_str (&tmp, CHEROKEE_CONFIG_ARGS); cherokee_buffer_add_escape_html (output, &tmp); cherokee_buffer_add_buffer (output, &tmp); cherokee_buffer_add_str (output, "\", "); /* Backtrace */ cherokee_buffer_add_str (output, "'backtrace': \""); #ifdef BACKTRACES_ENABLED cherokee_buffer_clean (&tmp); cherokee_buf_add_backtrace (&tmp, 2, "\\n", ""); cherokee_buffer_add_escape_html (output, &tmp); #endif cherokee_buffer_add_str (output, "\", "); /* Let's finish here.. */ if (strcmp (output->buf + output->len - 2, ", ") == 0) { cherokee_buffer_drop_ending (output, 2); } cherokee_buffer_add_str (output, "}\n"); /* Clean up */ cherokee_buffer_mrproper (&tmp); }
void cherokee_trace_do_trace (const char *entry, const char *file, int line, const char *func, const char *fmt, ...) { ret_t ret; char *p; char *lentry; char *lentry_end; va_list args; cherokee_connection_t *conn; cherokee_buffer_t *trace_modules = &trace.modules; cherokee_boolean_t do_log = false; cherokee_buffer_t entries = CHEROKEE_BUF_INIT; /* Prevents loops */ if (disabled) { return; } disabled = true; /* Return ASAP if nothing is being traced */ if (cherokee_buffer_is_empty (&trace.modules)) { goto out; } /* Check the connection source, if possible */ if (trace.from_filter != NULL) { conn = CONN (CHEROKEE_THREAD_PROP_GET (thread_connection_ptr)); /* No conn, no trace entry */ if (conn == NULL) { goto out; } if (conn->socket.socket < 0) { goto out; } /* Skip the trace if the conn doesn't match */ ret = cherokee_access_ip_match (trace.from_filter, &conn->socket); if (ret != ret_ok) { goto out; } } /* Also, check for 'all' */ p = strstr (trace_modules->buf, "all"); if (p == NULL) { /* Parse the In-code module string */ cherokee_buffer_add (&entries, entry, strlen(entry)); for (lentry = entries.buf;;) { lentry_end = strchr (lentry, ','); if (lentry_end) *lentry_end = '\0'; /* Check the type */ p = strstr (trace_modules->buf, lentry); if (p) { char *tmp = p + strlen(lentry); if ((*tmp == '\0') || (*tmp == ',') || (*tmp == ' ')) do_log = true; } if ((lentry_end == NULL) || (do_log)) break; lentry = lentry_end + 1; } /* Return if trace entry didn't match with the configured list */ if (! do_log) { goto out; } } /* Format the message and log it: * 'entries' is not needed at this stage, reuse it */ cherokee_buffer_clean (&entries); if (trace.print_thread) { int len; char tmp[32+1]; static int longest_len = 0; len = snprintf (tmp, 32+1, "%llX", (unsigned long long) CHEROKEE_THREAD_SELF); longest_len = MAX (longest_len, len); cherokee_buffer_add_str (&entries, "{0x"); cherokee_buffer_add_char_n (&entries, '0', longest_len - len); cherokee_buffer_add (&entries, tmp, len); cherokee_buffer_add_str (&entries, "} "); } if (trace.print_time) { cherokee_buffer_add_char (&entries, '['); cherokee_buf_add_bogonow (&entries, true); cherokee_buffer_add_str (&entries, "] "); } cherokee_buffer_add_va (&entries, "%18s:%04d (%30s): ", file, line, func); va_start (args, fmt); cherokee_buffer_add_va_list (&entries, (char *)fmt, args); va_end (args); if (trace.use_syslog) { cherokee_syslog (LOG_DEBUG, &entries); } else { #ifdef HAVE_FLOCKFILE flockfile (stdout); #endif fprintf (stdout, "%s", entries.buf); #ifdef HAVE_FUNLOCKFILE funlockfile (stdout); #endif } out: cherokee_buffer_mrproper (&entries); disabled = false; }