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%4092
issue20
tibs 2008-11-11 19:46:58 +00:00
rodzic 0b7868f9ca
commit ebf0a5da1b
1 zmienionych plików z 135 dodań i 135 usunięć

268
pcap.c
Wyświetl plik

@ -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: