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