}
else if (status < 100000 + apr_os_start_syserr) {
len += apr_snprintf(errstr + len, max_string_len - len,
"(os %d)", status - apr_os_start_syserr);
}
else {
len += apr_snprintf(errstr + len, max_string_len - len,
"(os 0x%08x)", status - apr_os_start_syserr);
}
apr_strerror(status, errstr + len, max_string_len - len);
len += strlen(errstr + len);
if (max_string_len - len > 2) {
errstr[len++] = ':';
errstr[len++] = ' ';
errstr[len] = '\0';
}
}
errstrlen = len;
#ifndef ap_unsafe_error_log_unescaped
if (apr_vsnprintf(scratch, max_string_len - len, fmt, args)) {
len += ap_escape_errorlog_item(errstr + len, scratch,
max_string_len - len);
}
#else
len += apr_vsnprintf(errstr + len, max_string_len - len, fmt, args);
#endif
if ( r && (referer = apr_table_get(r->headers_in, "referer"))
#ifndef ap_unsafe_error_log_unescaped
&& ap_escape_errorlog_item(scratch, referer, max_string_len - len)
#endif
) {
len += apr_snprintf(errstr + len, max_string_len - len,
", referer: %s",
#ifndef ap_unsafe_error_log_unescaped
scratch
#else
referer
#endif
);
}
/* null if we are logging to syslog */
if (logf) {
/* truncate for the terminator (as apr_snprintf does) */
if (len > max_string_len - sizeof(apr_eol_str)) {
len = max_string_len - sizeof(apr_eol_str);
}
strcpy(errstr + len, apr_eol_str);
apr_file_puts(errstr, logf);
apr_file_flush(logf);
}
#ifdef have_syslog
else {
syslog(level_and_mask, "%s", errstr);
}
#endif
ap_run_error_log(file, line, level, status, s, r, pool, errstr + errstrlen);
}
ap_declare(void) ap_log_error(const char *file, int line, int level,
apr_status_t status, const server_rec *s,
const char *fmt, ...)
{