44bc301921
Reported by: jrtc27
Fixes: 2582ae5740
MFC after: 1 month
77 lines
1.1 KiB
C
77 lines
1.1 KiB
C
#include "ipf.h"
|
|
#include "ipmon.h"
|
|
|
|
static void *execute_parse(char **);
|
|
static void execute_destroy(void *);
|
|
static int execute_send(void *, ipmon_msg_t *);
|
|
static void execute_print(void *);
|
|
|
|
typedef struct execute_opts_s {
|
|
char *path;
|
|
} execute_opts_t;
|
|
|
|
ipmon_saver_t executesaver = {
|
|
"execute",
|
|
execute_destroy,
|
|
NULL, /* dup */
|
|
NULL, /* match */
|
|
execute_parse,
|
|
execute_print,
|
|
execute_send
|
|
};
|
|
|
|
|
|
static void *
|
|
execute_parse(char **strings)
|
|
{
|
|
execute_opts_t *ctx;
|
|
|
|
ctx = calloc(1, sizeof(*ctx));
|
|
|
|
if (ctx != NULL && strings[0] != NULL && strings[0][0] != '\0') {
|
|
ctx->path = strdup(strings[0]);
|
|
|
|
} else {
|
|
free(ctx);
|
|
return (NULL);
|
|
}
|
|
|
|
return (ctx);
|
|
}
|
|
|
|
|
|
static void
|
|
execute_print(void *ctx)
|
|
{
|
|
execute_opts_t *exe = ctx;
|
|
|
|
printf("%s", exe->path);
|
|
}
|
|
|
|
|
|
static void
|
|
execute_destroy(void *ctx)
|
|
{
|
|
execute_opts_t *exe = ctx;
|
|
|
|
if (exe != NULL)
|
|
free(exe->path);
|
|
free(exe);
|
|
}
|
|
|
|
|
|
static int
|
|
execute_send(void *ctx, ipmon_msg_t *msg)
|
|
{
|
|
execute_opts_t *exe = ctx;
|
|
FILE *fp;
|
|
|
|
fp = popen(exe->path, "w");
|
|
if (fp != NULL) {
|
|
fwrite(msg->imm_msg, msg->imm_msglen, 1, fp);
|
|
pclose(fp);
|
|
}
|
|
return (0);
|
|
}
|
|
|