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