/* * compress_file * * Compresses the stream fin into foutname. This code is shamelessly * copied from libpcap's savefile.c:sf_next_packet() * * Inputs: * - fin: the uncompressed input stream * - lfout: the compressed output stream * - filehdr: the file header * - swapped: whether the packet order is swapped compared to the host order * * Output: * - return: 0 if ok, <0 if there was any problem * */ int compress_file (FILE *fin, lFILE *lfout, struct pcap_file_header *filehdr, int swapped) { codec_t *codec; int size; int hdr_size; u_char buffer[MAXDATABUFFER]; struct pcap_pkthdr pkthdr; int result; u_char *comp_pkt; int comp_len; u_int32_t bytes_written; co_t co; int paddings; /* get header size */ hdr_size = pktd_get_hdr_size (filehdr->linktype); /* create and initialize codec */ codec = create_codec(); /* get compression parameters */ co.rm_offset = DEFAULT_PKTD_COMPRESSION_RESTART_MARKER; co.ip_mask = DEFAULT_PKTD_COMPRESSION_IP_MASK; co.tcp_mask = DEFAULT_PKTD_COMPRESSION_TCP_MASK; co.udp_mask = DEFAULT_PKTD_COMPRESSION_UDP_MASK; /* write the new extended pcap header */ if (pktd_lfwrite_ext_header (lfout, 40, DLT_COMPRESSED, &co, NULL) < 0) { fprintf (stderr, "Error: cannot write header in file %s\n", foutname); return -1; } bytes_written = 0; while (1) { /* read the pcap header */ size = TCPDUMP_PACKET_HEADER_LENGTH; result = fread (&pkthdr, 1, size, fin); if (result != size) { if ((result == 0) && (feof (fin))) { break; } fprintf (stderr, "Error: fread'ing file %s\n", finname); return -1; } /* encode_trace requires pkthdr in host order */ if (swapped) { pktd_swap_pkthdr (&pkthdr); } /* The caplen and len fields were interchanged at version 2.3, * in order to match the bpf header layout. But unfortunately * some files were written with version 2.3 in their headers * but without the interchanged fields */ if (filehdr->version_minor < 3 || (filehdr->version_minor == 3 && pkthdr.caplen > pkthdr.len)) { int t = pkthdr.caplen; pkthdr.caplen = pkthdr.len; pkthdr.len = t; } /* read the packet itself */ size = pkthdr.caplen; result = fread (buffer, 1, size, fin); if (result != size) { if ((result == 0) && (feof (fin))) { break; } fprintf (stderr, "Error: freading file %s\n", finname); return -1; } /* encode_trace requires packet in network order, so no swap is needed */ /* encode the packet */ encode_trace (codec, &co, &pkthdr, buffer, pkthdr.caplen, hdr_size, &comp_pkt, &comp_len); /* introduce restart markers if needed */ if (co.rm_offset != 0) { paddings = need_restart_markers (&co, lfout, comp_len, bytes_written, codec); if (paddings < 0) { return -1; } else if (paddings > 0) { bytes_written += paddings; /* there was a codec initialization => must reencode packet */ encode_trace (codec, &co, &pkthdr, buffer, pkthdr.caplen, hdr_size, &comp_pkt, &comp_len); } } /* write compressed packet to file */ if (lfwrite (lfout, comp_pkt, comp_len) < comp_len) { return -1; } } return 0; }
int MyQtFile::myfwrite(QString &buffersize) { return lfwrite(fdQfile, buffersize.toLatin1().data(), buffersize.size()); }
/* * uncompress_file * * Uncompresses the stream fin into foutname * * Inputs: * - fin: the compressed input stream * - lfout: the uncompressed output stream * - co: compression parameters * * Output: * - return: 0 if ok, <0 if there was any problem * */ int uncompress_file (FILE *fin, lFILE *lfout, co_t *co) { codec_t *codec; int size; u_char compressed_buffer[MAX_COMPRESSED_LENGTH]; u_char buffer[MAXDATABUFFER]; struct pcap_pkthdr pkthdr; int result; /* create and initialize codec */ codec = create_codec(); /* write the new header */ if (pktd_write_header (lfileno(lfout), 40, DLT_RAW) < 0) { fprintf (stderr, "Error: cannot write header in file %s\n", foutname); return -1; } /* * every time you seek the rm_offset, you *must* initialize the codec (void)fseek (fin, co->rm_offset, SEEK_CUR); init_codec (codec); */ /* parse traces */ while (1) { /* read the trace length */ size = TCPDUMP_PACKET_HEADER_LENGTH_COMPRESSED; result = fread (compressed_buffer, 1, size, fin); if (result != size) { if ((result == 0) && (feof (fin))) { break; } fprintf (stderr, "Error: fread'ing file %s\n", finname); return -1; } size = (u_int8_t)(compressed_buffer[0]); /* look for escaped packets */ if (size == COMPRESSION_INIT_CODEC) { /* codec initialization requested */ init_codec (codec); continue; } else if (size == COMPRESSION_PADDING) { /* padding (empty) trace */ continue; } /* get the rest of the compressed packet */ result = fread (compressed_buffer+TCPDUMP_PACKET_HEADER_LENGTH_COMPRESSED, 1, size-TCPDUMP_PACKET_HEADER_LENGTH_COMPRESSED, fin); if (result != (size-TCPDUMP_PACKET_HEADER_LENGTH_COMPRESSED)) { if ((size == 0) && (feof (fin))) { break; } fprintf (stderr, "Error: freading file %s (%i)\n", finname, size); return -1; } /* decode the packet */ size = decode_trace (codec, compressed_buffer, &pkthdr, buffer); if (size < 0) { fprintf (stderr, "Error: decoding trace\n"); return -1; } /* write the uncompressed packet */ /* result = fwrite(buffer, 1, size, fout); */ result = lfwrite(lfout, buffer, size); if (result != size) { fprintf (stderr, "Error: fwriting file %s\n", foutname); return -1; } } return 0; }