1#include "ipf.h"
2#include "ipmon.h"
3
4static void *execute_parse(char **);
5static void execute_destroy(void *);
6static int execute_send(void *, ipmon_msg_t *);
7static void execute_print(void *);
8
9typedef struct execute_opts_s {
10	char	*path;
11} execute_opts_t;
12
13ipmon_saver_t executesaver = {
14	"execute",
15	execute_destroy,
16	NULL,			/* dup */
17	NULL,			/* match */
18	execute_parse,
19	execute_print,
20	execute_send
21};
22
23
24static void *
25execute_parse(char **strings)
26{
27	execute_opts_t *ctx;
28
29	ctx = calloc(1, sizeof(*ctx));
30
31	if (ctx != NULL && strings[0] != NULL && strings[0][0] != '\0') {
32		ctx->path = strdup(strings[0]);
33
34	} else {
35		free(ctx);
36		return (NULL);
37	}
38
39	return (ctx);
40}
41
42
43static void
44execute_print(void *ctx)
45{
46	execute_opts_t *exe = ctx;
47
48	printf("%s", exe->path);
49}
50
51
52static void
53execute_destroy(void *ctx)
54{
55	execute_opts_t *exe = ctx;
56
57	if (exe != NULL)
58		free(exe->path);
59	free(exe);
60}
61
62
63static int
64execute_send(void *ctx, ipmon_msg_t *msg)
65{
66	execute_opts_t *exe = ctx;
67	FILE *fp;
68
69	fp = popen(exe->path, "w");
70	if (fp != NULL) {
71		fwrite(msg->imm_msg, msg->imm_msglen, 1, fp);
72		pclose(fp);
73	}
74	return (0);
75}
76
77