kopia lustrzana https://github.com/F5OEO/tstools
Add the magic runes to the end, and reformat.
Move the two static functions to the top, so that forward prototyping is not required. --HG-- extra : convert_revision : svn%3Aeff31bef-be4a-0410-a8fe-e47997df2690/trunk%4092issue20
rodzic
0b7868f9ca
commit
ebf0a5da1b
268
pcap.c
268
pcap.c
|
|
@ -33,98 +33,6 @@
|
||||||
#include "pcap.h"
|
#include "pcap.h"
|
||||||
#include "misc_fns.h"
|
#include "misc_fns.h"
|
||||||
|
|
||||||
static int pcap_read_header(PCAP_reader_p ctx, pcap_hdr_t *out_hdr);
|
|
||||||
static int pcap_read_pktheader(PCAP_reader_p ctx, pcaprec_hdr_t *out_hdr);
|
|
||||||
|
|
||||||
|
|
||||||
int pcap_open(PCAP_reader_p *ctx_p, pcap_hdr_t *out_hdr,
|
|
||||||
const char *filename)
|
|
||||||
{
|
|
||||||
FILE *fptr = (filename ? fopen(filename, "rb") : stdin);
|
|
||||||
PCAP_reader_p ctx;
|
|
||||||
int rv;
|
|
||||||
|
|
||||||
(*ctx_p) = NULL;
|
|
||||||
|
|
||||||
if (!fptr)
|
|
||||||
{
|
|
||||||
// Couldn't open the file.
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
ctx = (PCAP_reader_p)malloc(SIZEOF_PCAP_READER);
|
|
||||||
if (!ctx)
|
|
||||||
{
|
|
||||||
fclose(fptr);
|
|
||||||
// Out of memory.
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->file = fptr;
|
|
||||||
|
|
||||||
rv = pcap_read_header(ctx, out_hdr);
|
|
||||||
|
|
||||||
if (rv != 1)
|
|
||||||
{
|
|
||||||
// Header read failed.
|
|
||||||
fclose(ctx->file);
|
|
||||||
free(ctx);
|
|
||||||
return -4;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*ctx_p) = ctx;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int pcap_read_next(PCAP_reader_p ctx, pcaprec_hdr_t *out_hdr,
|
|
||||||
uint8_t **out_data,
|
|
||||||
uint32_t *out_len)
|
|
||||||
{
|
|
||||||
int rv;
|
|
||||||
|
|
||||||
(*out_data) = NULL; (*out_len) = 0;
|
|
||||||
|
|
||||||
rv = pcap_read_pktheader(ctx, out_hdr);
|
|
||||||
if (rv != 1) { return rv; }
|
|
||||||
|
|
||||||
// Otherwise we now know how long our packet is ..
|
|
||||||
(*out_data) = (uint8_t *)malloc(out_hdr->incl_len);
|
|
||||||
|
|
||||||
if (!(*out_data))
|
|
||||||
{
|
|
||||||
// Out of memory.
|
|
||||||
return -3;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*out_len) = out_hdr->incl_len;
|
|
||||||
|
|
||||||
rv = fread((*out_data), (*out_len), 1, ctx->file);
|
|
||||||
if (rv != 1)
|
|
||||||
{
|
|
||||||
free(*out_data); (*out_data) = NULL;
|
|
||||||
*out_len = 0;
|
|
||||||
|
|
||||||
if (feof(ctx->file))
|
|
||||||
{
|
|
||||||
// Ah. EOF.
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Error. Curses.
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (rv == 1)
|
|
||||||
{
|
|
||||||
// Gotcha.
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int pcap_read_header(PCAP_reader_p ctx, pcap_hdr_t *hdr)
|
static int pcap_read_header(PCAP_reader_p ctx, pcap_hdr_t *hdr)
|
||||||
{
|
{
|
||||||
uint8_t hdr_val[SIZEOF_PCAP_HDR_ON_DISC];
|
uint8_t hdr_val[SIZEOF_PCAP_HDR_ON_DISC];
|
||||||
|
|
@ -132,55 +40,55 @@ static int pcap_read_header(PCAP_reader_p ctx, pcap_hdr_t *hdr)
|
||||||
|
|
||||||
rv = fread(&hdr_val[0], SIZEOF_PCAP_HDR_ON_DISC, 1, ctx->file);
|
rv = fread(&hdr_val[0], SIZEOF_PCAP_HDR_ON_DISC, 1, ctx->file);
|
||||||
if (rv != 1)
|
if (rv != 1)
|
||||||
|
{
|
||||||
|
if (feof(ctx->file))
|
||||||
{
|
{
|
||||||
if (feof(ctx->file))
|
return 0;
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return PCAP_ERR_FILE_READ;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return PCAP_ERR_FILE_READ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* The magic number is 0xa1b2c3d4. If the writing
|
/* The magic number is 0xa1b2c3d4. If the writing
|
||||||
* machine was BE, the first byte will be a1 else d4
|
* machine was BE, the first byte will be a1 else d4
|
||||||
*/
|
*/
|
||||||
if (hdr_val[0] == 0xa1)
|
if (hdr_val[0] == 0xa1)
|
||||||
{
|
{
|
||||||
// Big endian.
|
// Big endian.
|
||||||
ctx->is_be = 1;
|
ctx->is_be = 1;
|
||||||
}
|
}
|
||||||
else if (hdr_val[0] == 0xd4)
|
else if (hdr_val[0] == 0xd4)
|
||||||
{
|
{
|
||||||
// Little endian.
|
// Little endian.
|
||||||
ctx->is_be = 0;
|
ctx->is_be = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return PCAP_ERR_INVALID_MAGIC;
|
return PCAP_ERR_INVALID_MAGIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
hdr->magic_number = (ctx->is_be ? uint_32_be(&hdr_val[0]) :
|
hdr->magic_number = (ctx->is_be ? uint_32_be(&hdr_val[0]) :
|
||||||
uint_32_le(&hdr_val[0]));
|
uint_32_le(&hdr_val[0]));
|
||||||
if (hdr->magic_number != 0xa1b2c3d4)
|
if (hdr->magic_number != 0xa1b2c3d4)
|
||||||
{
|
{
|
||||||
return PCAP_ERR_INVALID_MAGIC;
|
return PCAP_ERR_INVALID_MAGIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
hdr->version_major = (ctx->is_be ? uint_16_be(&hdr_val[4]) :
|
hdr->version_major = (ctx->is_be ? uint_16_be(&hdr_val[4]) :
|
||||||
uint_16_le(&hdr_val[4]));
|
uint_16_le(&hdr_val[4]));
|
||||||
hdr->version_minor = (ctx->is_be ? uint_16_be(&hdr_val[6]) :
|
hdr->version_minor = (ctx->is_be ? uint_16_be(&hdr_val[6]) :
|
||||||
uint_16_le(&hdr_val[6]));
|
uint_16_le(&hdr_val[6]));
|
||||||
hdr->thiszone = (int32_t)(ctx->is_be ? uint_32_be(&hdr_val[8]) :
|
hdr->thiszone = (int32_t)(ctx->is_be ? uint_32_be(&hdr_val[8]) :
|
||||||
uint_32_le(&hdr_val[8]));
|
uint_32_le(&hdr_val[8]));
|
||||||
hdr->sigfigs = (ctx->is_be ? uint_32_be(&hdr_val[12]) :
|
hdr->sigfigs = (ctx->is_be ? uint_32_be(&hdr_val[12]) :
|
||||||
uint_32_le(&hdr_val[12]));
|
uint_32_le(&hdr_val[12]));
|
||||||
hdr->snaplen = (ctx->is_be ? uint_32_be(&hdr_val[16]) :
|
hdr->snaplen = (ctx->is_be ? uint_32_be(&hdr_val[16]) :
|
||||||
uint_32_le(&hdr_val[16]));
|
uint_32_le(&hdr_val[16]));
|
||||||
hdr->network = (ctx->is_be ? uint_32_be(&hdr_val[20]) :
|
hdr->network = (ctx->is_be ? uint_32_be(&hdr_val[20]) :
|
||||||
uint_32_le(&hdr_val[20]));
|
uint_32_le(&hdr_val[20]));
|
||||||
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
@ -193,28 +101,120 @@ static int pcap_read_pktheader(PCAP_reader_p ctx, pcaprec_hdr_t *hdr)
|
||||||
|
|
||||||
rv = fread(&hdr_val[0], SIZEOF_PCAPREC_HDR_ON_DISC, 1, ctx->file);
|
rv = fread(&hdr_val[0], SIZEOF_PCAPREC_HDR_ON_DISC, 1, ctx->file);
|
||||||
if (rv != 1)
|
if (rv != 1)
|
||||||
|
{
|
||||||
|
if (feof(ctx->file))
|
||||||
{
|
{
|
||||||
if (feof(ctx->file))
|
return 0;
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return PCAP_ERR_FILE_READ;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return PCAP_ERR_FILE_READ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
hdr->ts_sec = (ctx->is_be ? uint_32_be(&hdr_val[0]) :
|
hdr->ts_sec = (ctx->is_be ? uint_32_be(&hdr_val[0]) :
|
||||||
uint_32_le(&hdr_val[0]));
|
uint_32_le(&hdr_val[0]));
|
||||||
hdr->ts_usec = (ctx->is_be ? uint_32_be(&hdr_val[4]) :
|
hdr->ts_usec = (ctx->is_be ? uint_32_be(&hdr_val[4]) :
|
||||||
uint_32_le(&hdr_val[4]));
|
uint_32_le(&hdr_val[4]));
|
||||||
hdr->incl_len = (ctx->is_be ? uint_32_be(&hdr_val[8]) :
|
hdr->incl_len = (ctx->is_be ? uint_32_be(&hdr_val[8]) :
|
||||||
uint_32_le(&hdr_val[8]));
|
uint_32_le(&hdr_val[8]));
|
||||||
hdr->orig_len = (ctx->is_be ? uint_32_be(&hdr_val[12]) :
|
hdr->orig_len = (ctx->is_be ? uint_32_be(&hdr_val[12]) :
|
||||||
uint_32_le(&hdr_val[12]));
|
uint_32_le(&hdr_val[12]));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End file */
|
extern int pcap_open(PCAP_reader_p *ctx_p, pcap_hdr_t *out_hdr,
|
||||||
|
const char *filename)
|
||||||
|
{
|
||||||
|
FILE *fptr = (filename ? fopen(filename, "rb") : stdin);
|
||||||
|
PCAP_reader_p ctx;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
(*ctx_p) = NULL;
|
||||||
|
|
||||||
|
if (!fptr)
|
||||||
|
{
|
||||||
|
// Couldn't open the file.
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ctx = (PCAP_reader_p)malloc(SIZEOF_PCAP_READER);
|
||||||
|
if (!ctx)
|
||||||
|
{
|
||||||
|
fclose(fptr);
|
||||||
|
// Out of memory.
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->file = fptr;
|
||||||
|
|
||||||
|
rv = pcap_read_header(ctx, out_hdr);
|
||||||
|
|
||||||
|
if (rv != 1)
|
||||||
|
{
|
||||||
|
// Header read failed.
|
||||||
|
fclose(ctx->file);
|
||||||
|
free(ctx);
|
||||||
|
return -4;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*ctx_p) = ctx;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern int pcap_read_next(PCAP_reader_p ctx, pcaprec_hdr_t *out_hdr,
|
||||||
|
uint8_t **out_data,
|
||||||
|
uint32_t *out_len)
|
||||||
|
{
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
(*out_data) = NULL; (*out_len) = 0;
|
||||||
|
|
||||||
|
rv = pcap_read_pktheader(ctx, out_hdr);
|
||||||
|
if (rv != 1) { return rv; }
|
||||||
|
|
||||||
|
// Otherwise we now know how long our packet is ..
|
||||||
|
(*out_data) = (uint8_t *)malloc(out_hdr->incl_len);
|
||||||
|
|
||||||
|
if (!(*out_data))
|
||||||
|
{
|
||||||
|
// Out of memory.
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*out_len) = out_hdr->incl_len;
|
||||||
|
|
||||||
|
rv = fread((*out_data), (*out_len), 1, ctx->file);
|
||||||
|
if (rv != 1)
|
||||||
|
{
|
||||||
|
free(*out_data); (*out_data) = NULL;
|
||||||
|
*out_len = 0;
|
||||||
|
|
||||||
|
if (feof(ctx->file))
|
||||||
|
{
|
||||||
|
// Ah. EOF.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Error. Curses.
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (rv == 1)
|
||||||
|
{
|
||||||
|
// Gotcha.
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Local Variables:
|
||||||
|
// tab-width: 8
|
||||||
|
// indent-tabs-mode: nil
|
||||||
|
// c-basic-offset: 2
|
||||||
|
// End:
|
||||||
|
// vim: set tabstop=8 shiftwidth=2 expandtab:
|
||||||
|
|
||||||
|
|
|
||||||
Ładowanie…
Reference in New Issue