bfc88dcbf7
Approved by: glebius (mentor) BSD Licensed by: Darren Reed <darrenr@reed.wattle.id.au> (author)
131 lines
1.9 KiB
C
131 lines
1.9 KiB
C
#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;
|
|
}
|
|
|