/* $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; }