save_file.c revision 369245
1#include "ipf.h"
2#include "ipmon.h"
3
4static void *file_parse(char **);
5static void file_destroy(void *);
6static int file_send(void *, ipmon_msg_t *);
7static void file_print(void *);
8static int file_match(void *, void *);
9static void *file_dup(void *);
10
11typedef struct file_opts_s {
12	FILE	*fp;
13	int	raw;
14	char	*path;
15	int	ref;
16} file_opts_t;
17
18ipmon_saver_t filesaver = {
19	"file",
20	file_destroy,
21	file_dup,
22	file_match,
23	file_parse,
24	file_print,
25	file_send
26};
27
28
29static void *
30file_parse(strings)
31	char **strings;
32{
33	file_opts_t *ctx;
34
35	ctx = calloc(1, sizeof(*ctx));
36	if (ctx == NULL)
37		return NULL;
38
39	if (strings[0] != NULL && strings[0][0] != '\0') {
40		ctx->ref = 1;
41		if (!strncmp(strings[0], "raw://", 6)) {
42			ctx->raw = 1;
43			ctx->path = strdup(strings[0] + 6);
44			ctx->fp = fopen(ctx->path, "ab");
45		} else if (!strncmp(strings[0], "file://", 7)) {
46			ctx->path = strdup(strings[0] + 7);
47			ctx->fp = fopen(ctx->path, "a");
48		} else {
49			free(ctx);
50			ctx = NULL;
51		}
52	} else {
53		free(ctx);
54		ctx = NULL;
55	}
56
57	return ctx;
58}
59
60
61static int
62file_match(ctx1, ctx2)
63	void *ctx1, *ctx2;
64{
65	file_opts_t *f1 = ctx1, *f2 = ctx2;
66
67	if (f1->raw != f2->raw)
68		return 1;
69	if (strcmp(f1->path, f2->path))
70		return 1;
71	return 0;
72}
73
74
75static void *
76file_dup(ctx)
77	void *ctx;
78{
79	file_opts_t *f = ctx;
80
81	f->ref++;
82	return f;
83}
84
85
86static void
87file_print(ctx)
88	void *ctx;
89{
90	file_opts_t *file = ctx;
91
92	if (file->raw)
93		printf("raw://");
94	else
95		printf("file://");
96	printf("%s", file->path);
97}
98
99
100static void
101file_destroy(ctx)
102	void *ctx;
103{
104	file_opts_t *file = ctx;
105
106	file->ref--;
107	if (file->ref > 0)
108		return;
109
110	if (file->path != NULL)
111		free(file->path);
112	free(file);
113}
114
115
116static int
117file_send(ctx, msg)
118	void *ctx;
119	ipmon_msg_t *msg;
120{
121	file_opts_t *file = ctx;
122
123	if (file->raw) {
124		fwrite(msg->imm_data, msg->imm_dsize, 1, file->fp);
125	} else {
126		fprintf(file->fp, "%s", msg->imm_msg);
127	}
128	return 0;
129}
130
131