2019-05-27 15:32:00 +00:00
|
|
|
#include "capture_traffic.h"
|
2019-05-28 09:45:20 +00:00
|
|
|
|
|
|
|
void dynbuf_init(struct dynbuf* db) {
|
|
|
|
db->content = malloc(MEGABYTE);
|
|
|
|
if (db->content == NULL) {
|
|
|
|
perror("malloc dynbuf failed");
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
db->written = 0;
|
|
|
|
db->alloced = MEGABYTE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void dynbuf_check_alloc(struct dynbuf* db, size_t len) {
|
|
|
|
if (db->written + len > db->alloced) {
|
|
|
|
size_t new_alloced = db->written + len > 2 * db->alloced ? db->written + len : 2 * db->alloced;
|
|
|
|
db->content = realloc(db->content, new_alloced);
|
|
|
|
if (db->content == NULL) {
|
|
|
|
perror("realloc dynbuf failed");
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
db->alloced = new_alloced;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void dynbuf_append(struct dynbuf* db, char* ptr, size_t len) {
|
|
|
|
dynbuf_check_alloc(db, len);
|
|
|
|
|
|
|
|
memcpy(db->content + db->written, ptr, len);
|
|
|
|
db->written += len;
|
|
|
|
}
|
|
|
|
|
2019-05-27 16:14:21 +00:00
|
|
|
void traffic_capture_init(struct capture_ctx* ctx, char* filename) {
|
|
|
|
ctx->activated = filename == NULL ? 0 : 1;
|
|
|
|
if (!ctx->activated) return;
|
2019-05-27 15:32:00 +00:00
|
|
|
|
2019-05-27 16:14:21 +00:00
|
|
|
ctx->filename = strdup(filename);
|
2019-05-28 09:45:20 +00:00
|
|
|
dynbuf_init (&ctx->in);
|
|
|
|
dynbuf_init (&ctx->out);
|
|
|
|
}
|
|
|
|
|
|
|
|
void traffic_capture_notify(struct capture_ctx* ctx, struct buffer_packet *bp, char* dest) {
|
|
|
|
if (!ctx->activated) return;
|
|
|
|
|
|
|
|
if (clock_gettime(CLOCK_MONOTONIC, &bp->seen) == -1){
|
|
|
|
perror("clock_gettime error");
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
|
|
dynbuf_append (
|
|
|
|
strcmp(dest, "in") == 0 ? &ctx->in : &ctx->out,
|
|
|
|
(char*)&bp,
|
|
|
|
sizeof(struct buffer_packet) - sizeof(struct internet_packet) + bp->ip.ap.fmt.headers.size);
|
2019-05-27 15:32:00 +00:00
|
|
|
}
|
|
|
|
|
2019-05-27 16:14:21 +00:00
|
|
|
void traffic_capture_stop(struct capture_ctx* ctx) {
|
|
|
|
if (!ctx->activated) return;
|
2019-05-27 15:32:00 +00:00
|
|
|
|
2019-05-27 16:14:21 +00:00
|
|
|
FILE* fd = NULL;
|
|
|
|
|
|
|
|
if ((fd = fopen(ctx->filename, "w")) == NULL) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
free(ctx->filename);
|
2019-05-27 15:32:00 +00:00
|
|
|
}
|