fluffy/pcap.c

107 lines
1.8 KiB
C

#include <stdio.h>
#include <sysexits.h>
#include <string.h>
#include "pcap.h"
int
pcap_open_in(struct pcap_file *ctx, FILE * f)
{
struct pcap_file_header h;
if (1 != fread(&h, sizeof(h), 1, f)) {
h.magic = 0;
}
if (MAGIC == h.magic) {
ctx->swap = 0;
} else if (bswap32(MAGIC) == h.magic) {
ctx->swap = 1;
} else {
return -1;
}
if ((h.version_major != 2) || (h.version_minor != 4)) {
return -1;
}
if (ctx->swap) {
h.snaplen = bswap32(h.snaplen);
}
if (h.snaplen > MAXFRAME) {
return -1;
}
ctx->linktype = h.linktype;
ctx->f = f;
return 0;
}
int
pcap_open_out(struct pcap_file *ctx, FILE * f)
{
return pcap_open_out_linktype(ctx, f, 1);
}
int
pcap_open_out_linktype(struct pcap_file *ctx, FILE *f, int32_t linktype) {
struct pcap_file_header h = { MAGIC, 2, 4, 0, 0, MAXFRAME, linktype };
if (1 != fwrite(&h, sizeof(h), 1, f)) {
return -1;
}
ctx->f = f;
ctx->swap = 0;
return 0;
}
int
pcap_read_pkthdr(struct pcap_file *ctx, struct pcap_pkthdr *hdr)
{
if (1 != fread(hdr, sizeof(*hdr), 1, ctx->f)) {
return -1;
}
if (ctx->swap) {
hdr->ts.tv_sec = bswap32(hdr->ts.tv_sec);
hdr->ts.tv_usec = bswap32(hdr->ts.tv_usec);
hdr->caplen = bswap32(hdr->caplen);
hdr->len = bswap32(hdr->len);
}
if (hdr->caplen > MAXFRAME) {
return -1;
}
return 0;
}
int
pcap_write_pkthdr(struct pcap_file *ctx, struct pcap_pkthdr *hdr)
{
if (ctx->swap) {
struct pcap_pkthdr ohdr;
memcpy(&ohdr, hdr, sizeof(ohdr));
hdr->ts.tv_sec = bswap32(hdr->ts.tv_sec);
hdr->ts.tv_usec = bswap32(hdr->ts.tv_usec);
hdr->caplen = bswap32(hdr->caplen);
hdr->len = bswap32(hdr->len);
if (1 != fwrite(&ohdr, sizeof(ohdr), 1, ctx->f)) {
return -1;
}
} else {
if (1 != fwrite(hdr, sizeof(*hdr), 1, ctx->f)) {
return -1;
}
}
return 0;
}
void
pcap_close(struct pcap_file *ctx)
{
fclose(ctx->f);
}