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