1/* $NetBSD$ */ 2 3#include "ipf.h" 4#include "ipmon.h" 5 6static void *file_parse __P((char **)); 7static void file_destroy __P((void *)); 8static int file_send __P((void *, ipmon_msg_t *)); 9static void file_print __P((void *)); 10static int file_match __P((void *, void *)); 11static void *file_dup __P((void *)); 12 13typedef struct file_opts_s { 14 FILE *fp; 15 int raw; 16 char *path; 17 int ref; 18} file_opts_t; 19 20ipmon_saver_t filesaver = { 21 "file", 22 file_destroy, 23 file_dup, 24 file_match, 25 file_parse, 26 file_print, 27 file_send 28}; 29 30 31static void * 32file_parse(strings) 33 char **strings; 34{ 35 file_opts_t *ctx; 36 37 ctx = calloc(1, sizeof(*ctx)); 38 if (ctx == NULL) 39 return NULL; 40 41 if (strings[0] != NULL && strings[0][0] != '\0') { 42 ctx->ref = 1; 43 if (!strncmp(strings[0], "raw://", 6)) { 44 ctx->raw = 1; 45 ctx->path = strdup(strings[0] + 6); 46 ctx->fp = fopen(ctx->path, "ab"); 47 } else if (!strncmp(strings[0], "file://", 7)) { 48 ctx->path = strdup(strings[0] + 7); 49 ctx->fp = fopen(ctx->path, "a"); 50 } else { 51 free(ctx); 52 ctx = NULL; 53 } 54 } else { 55 free(ctx); 56 ctx = NULL; 57 } 58 59 return ctx; 60} 61 62 63static int 64file_match(ctx1, ctx2) 65 void *ctx1, *ctx2; 66{ 67 file_opts_t *f1 = ctx1, *f2 = ctx2; 68 69 if (f1->raw != f2->raw) 70 return 1; 71 if (strcmp(f1->path, f2->path)) 72 return 1; 73 return 0; 74} 75 76 77static void * 78file_dup(ctx) 79 void *ctx; 80{ 81 file_opts_t *f = ctx; 82 83 f->ref++; 84 return f; 85} 86 87 88static void 89file_print(ctx) 90 void *ctx; 91{ 92 file_opts_t *file = ctx; 93 94 if (file->raw) 95 printf("raw://"); 96 else 97 printf("file://"); 98 printf("%s", file->path); 99} 100 101 102static void 103file_destroy(ctx) 104 void *ctx; 105{ 106 file_opts_t *file = ctx; 107 108 file->ref--; 109 if (file->ref > 0) 110 return; 111 112 if (file->path != NULL) 113 free(file->path); 114 free(file); 115} 116 117 118static int 119file_send(ctx, msg) 120 void *ctx; 121 ipmon_msg_t *msg; 122{ 123 file_opts_t *file = ctx; 124 125 if (file->raw) { 126 fwrite(msg->imm_data, msg->imm_dsize, 1, file->fp); 127 } else { 128 fprintf(file->fp, "%s", msg->imm_msg); 129 } 130 return 0; 131} 132 133