void save_logfile()

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