xref: /freebsd/sbin/ipf/libipf/save_file.c (revision 963f5dc7a30624e95d72fb7f87b8892651164e46)
1 #include "ipf.h"
2 #include "ipmon.h"
3 
4 static void *file_parse(char **);
5 static void file_destroy(void *);
6 static int file_send(void *, ipmon_msg_t *);
7 static void file_print(void *);
8 static int file_match(void *, void *);
9 static void *file_dup(void *);
10 
11 typedef struct file_opts_s {
12 	FILE	*fp;
13 	int	raw;
14 	char	*path;
15 	int	ref;
16 } file_opts_t;
17 
18 ipmon_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 
29 static void *
30 file_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 
61 static int
62 file_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 
75 static void *
76 file_dup(ctx)
77 	void *ctx;
78 {
79 	file_opts_t *f = ctx;
80 
81 	f->ref++;
82 	return f;
83 }
84 
85 
86 static void
87 file_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 
100 static void
101 file_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 
116 static int
117 file_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