Beispiel #1
0
/*
 * 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;
}
Beispiel #2
0
int MyQtFile::myfwrite(QString &buffersize)
{
    return lfwrite(fdQfile, buffersize.toLatin1().data(), buffersize.size());
}
Beispiel #3
0
/*
 * 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;
}