/* $NetBSD: save_file.c,v 1.1.1.1 2012/03/23 21:20:10 christos Exp $ */
#include "ipf.h"
#include "ipmon.h"
static void *file_parse __P((char **));
static void file_destroy __P((void *));
static int file_send __P((void *, ipmon_msg_t *));
static void file_print __P((void *));
static int file_match __P((void *, void *));
static void *file_dup __P((void *));
typedef struct file_opts_s {
FILE *fp;
int raw;
char *path;
int ref;
} file_opts_t;
ipmon_saver_t filesaver = {
"file",
file_destroy,
file_dup,
file_match,
file_parse,
file_print,
file_send
};
static void *
file_parse(strings)
char **strings;
{
file_opts_t *ctx;
ctx = calloc(1, sizeof(*ctx));
if (ctx == NULL)
return NULL;
if (strings[0] != NULL && strings[0][0] != '\0') {
ctx->ref = 1;
if (!strncmp(strings[0], "raw://", 6)) {
ctx->raw = 1;
ctx->path = strdup(strings[0] + 6);
ctx->fp = fopen(ctx->path, "ab");
} else if (!strncmp(strings[0], "file://", 7)) {
ctx->path = strdup(strings[0] + 7);
ctx->fp = fopen(ctx->path, "a");
} else {
free(ctx);
ctx = NULL;
}
} else {
free(ctx);
ctx = NULL;
}
return ctx;
}
static int
file_match(ctx1, ctx2)
void *ctx1, *ctx2;
{
file_opts_t *f1 = ctx1, *f2 = ctx2;
if (f1->raw != f2->raw)
return 1;
if (strcmp(f1->path, f2->path))
return 1;
return 0;
}
static void *
file_dup(ctx)
void *ctx;
{
file_opts_t *f = ctx;
f->ref++;
return f;
}
static void
file_print(ctx)
void *ctx;
{
file_opts_t *file = ctx;
if (file->raw)
printf("raw://");
else
printf("file://");
printf("%s", file->path);
}
static void
file_destroy(ctx)
void *ctx;
{
file_opts_t *file = ctx;
file->ref--;
if (file->ref > 0)
return;
if (file->path != NULL)
free(file->path);
free(file);
}
static int
file_send(ctx, msg)
void *ctx;
ipmon_msg_t *msg;
{
file_opts_t *file = ctx;
if (file->raw) {
fwrite(msg->imm_data, msg->imm_dsize, 1, file->fp);
} else {
fprintf(file->fp, "%s", msg->imm_msg);
}
return 0;
}