int log_error_write(server *srv, const char *filename, unsigned int line, const char *fmt, ...) { va_list ap; if (-1 == log_buffer_prepare(srv->errorlog_buf, srv, filename, line)) return 0; va_start(ap, fmt); log_buffer_append_printf(srv->errorlog_buf, fmt, ap); va_end(ap); log_write(srv, srv->errorlog_buf); return 0; }
int log_error_write_multiline_buffer(server *srv, const char *filename, unsigned int line, buffer *multiline, const char *fmt, ...) { va_list ap; size_t prefix_used; buffer *b = srv->errorlog_buf; char *pos, *end, *current_line; if (multiline->used < 2) return 0; if (-1 == log_buffer_prepare(b, srv, filename, line)) return 0; va_start(ap, fmt); log_buffer_append_printf(b, fmt, ap); va_end(ap); prefix_used = b->used; current_line = pos = multiline->ptr; end = multiline->ptr + multiline->used; for ( ; pos < end ; ++pos) { switch (*pos) { case '\n': case '\r': case '\0': /* handles end of string */ if (current_line < pos) { /* truncate to prefix */ b->used = prefix_used; b->ptr[b->used - 1] = '\0'; buffer_append_string_len(b, current_line, pos - current_line); log_write(srv, b); } current_line = pos + 1; break; default: break; } } return 0; }