in wb/wb.c [1429:1490]
void save_logfile (char * buf, apr_size_t buflen)
{
apr_status_t rv;
char errmsg[120];
char size_str[128];
static int need_add_LN = 0;
apr_size_t need_save_length = buflen;
apr_size_t saved_len = 0;
apr_size_t next_save_length;
if (!g_save_file_fd) {
return;
}
// if exceeding max file size, rewind it to the beginning
g_saved_bytes += need_save_length;
if (g_MAX_FILE_SIZE > 0 && g_saved_bytes >= g_MAX_FILE_SIZE) {
apr_off_t pos = 0;
apr_file_seek(g_save_file_fd, APR_SET, &pos);
g_saved_bytes = need_save_length;
}
// buf == NULL means writing the ending "0" to log file
if (buf) {
if (buflen == 0)
buflen = strlen(buf);
if (!buflen)
return;
} else
buflen = 0;
if (need_add_LN) {
sprintf(size_str,"\n%zu\n",buflen);
} else
sprintf(size_str,"%zu\n",buflen);
next_save_length = strlen(size_str);
rv = apr_file_write(g_save_file_fd, size_str, &next_save_length);
if (rv != APR_SUCCESS) {
fprintf(stderr, "wb: Could not write response size to output file: %s\n",
apr_strerror(rv, errmsg, sizeof errmsg));
exit(1);
}
// make sure we save all need_save_length to output file
need_save_length = buflen;
saved_len = 0;
do {
next_save_length = need_save_length - saved_len;
rv = apr_file_write(g_save_file_fd, buf + saved_len, &next_save_length);
if (rv != APR_SUCCESS) {
fprintf(stderr, "wb: Could not write output file: %s\n",
apr_strerror(rv, errmsg, sizeof errmsg));
exit(1);
}
saved_len += next_save_length;
}while (saved_len < need_save_length);
if (buf && buflen > 0)
need_add_LN = !(buf[buflen - 1] == '\n');
} // end of save_logfile: file to save received http messages