summaryrefslogtreecommitdiffstats
path: root/contrib/ipfilter/lib/save_file.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ipfilter/lib/save_file.c')
-rw-r--r--contrib/ipfilter/lib/save_file.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/contrib/ipfilter/lib/save_file.c b/contrib/ipfilter/lib/save_file.c
new file mode 100644
index 0000000..b852bd6
--- /dev/null
+++ b/contrib/ipfilter/lib/save_file.c
@@ -0,0 +1,130 @@
+#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;
+}
+
OpenPOWER on IntegriCloud