void ap_open_logs (server_rec *, ap_pool_t *p);
-/* The two primary logging functions, ap_log_error and ap_log_rerror,
- * use a printf style format string to build the log message. It is
- * VERY IMPORTANT that you not include any raw data from the network,
- * such as the request-URI or request header fields, within the format
- * string. Doing so makes the server vulnerable to a denial-of-service
- * attack and other messy behavior. Instead, use a simple format string
+/* The three primary logging functions, ap_log_error, ap_log_rerror, and
+ * ap_log_perror use a printf style format string to build the log message.
+ * It is VERY IMPORTANT that you not include any raw data from the network,
+ * such as the request-URI or request header fields, within the format
+ * string. Doing so makes the server vulnerable to a denial-of-service
+ * attack and other messy behavior. Instead, use a simple format string
* like "%s", followed by the string containing the untrusted data.
*/
API_EXPORT(void) ap_log_error(const char *file, int line, int level,
ap_status_t status, const server_rec *s,
const char *fmt, ...)
__attribute__((format(printf,6,7)));
+API_EXPORT(void) ap_log_perror(const char *file, int line, int level,
+ ap_status_t status, ap_pool_t *p,
+ const char *fmt, ...)
+ __attribute__((format(printf,6,7)));
API_EXPORT(void) ap_log_rerror(const char *file, int line, int level,
ap_status_t status, const request_rec *s,
const char *fmt, ...)
static void log_error_core(const char *file, int line, int level,
ap_status_t status, const server_rec *s,
- const request_rec *r, const char *fmt, va_list args)
+ const request_rec *r, ap_pool_t *pool,
+ const char *fmt, va_list args)
{
char errstr[MAX_STRING_LEN + 1]; /* + 1 to have room for '\n' */
size_t len;
len += ap_snprintf(errstr + len, MAX_STRING_LEN - len,
"[client %s] ", r->connection->remote_ip);
}
- /* XXX - need an APRized strerror() */
if (!(level & APLOG_NOERRNO)
&& (status != 0)) {
+ ap_pool_t *p;
+ if (r) {
+ p = r->pool;
+ }
+ else if (s) {
+ p = s->process->pool;
+ }
+ else {
+ p = pool;
+ }
len += ap_snprintf(errstr + len, MAX_STRING_LEN - len,
- "(%d)%s: ", status, strerror(status));
+ "(%d)%s: ", status, ap_strerror(status, p));
}
len += ap_vsnprintf(errstr + len, MAX_STRING_LEN - len, fmt, args);
va_list args;
va_start(args, fmt);
- log_error_core(file, line, level, status, s, NULL, fmt, args);
+ log_error_core(file, line, level, status, s, NULL, NULL, fmt, args);
+ va_end(args);
+}
+
+API_EXPORT(void) ap_log_perror(const char *file, int line, int level,
+ ap_status_t status, ap_pool_t *p,
+ const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ log_error_core(file, line, level, status, NULL, NULL, p, fmt, args);
va_end(args);
}
va_list args;
va_start(args, fmt);
- log_error_core(file, line, level, status, r->server, r, fmt, args);
+ log_error_core(file, line, level, status, r->server, r, NULL, fmt, args);
/*
* IF the error level is 'warning' or more severe,
* AND there isn't already error text associated with this request,
va_list args;
va_start(args, fmt);
- log_error_core(APLOG_MARK, APLOG_ERR, errno, s, NULL, fmt, args);
+ log_error_core(APLOG_MARK, APLOG_ERR, errno, s, NULL, NULL, fmt, args);
va_end(args);
}