diff options
| -rw-r--r-- | cgit.c | 1 | ||||
| -rw-r--r-- | cgit.h | 2 | ||||
| -rw-r--r-- | filter.c | 90 |
3 files changed, 66 insertions, 27 deletions
| @@ -951,6 +951,7 @@ int main(int argc, const char **argv) | |||
| 951 | ctx.cfg.cache_size = 0; | 951 | ctx.cfg.cache_size = 0; |
| 952 | err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root, | 952 | err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root, |
| 953 | ctx.qry.raw, ttl, process_request, &ctx); | 953 | ctx.qry.raw, ttl, process_request, &ctx); |
| 954 | cgit_cleanup_filters(); | ||
| 954 | if (err) | 955 | if (err) |
| 955 | cgit_print_error("Error processing page: %s (%d)", | 956 | cgit_print_error("Error processing page: %s (%d)", |
| 956 | strerror(err), err); | 957 | strerror(err), err); |
| @@ -60,6 +60,7 @@ struct cgit_filter { | |||
| 60 | int (*open)(struct cgit_filter *, va_list ap); | 60 | int (*open)(struct cgit_filter *, va_list ap); |
| 61 | int (*close)(struct cgit_filter *); | 61 | int (*close)(struct cgit_filter *); |
| 62 | void (*fprintf)(struct cgit_filter *, FILE *, const char *prefix); | 62 | void (*fprintf)(struct cgit_filter *, FILE *, const char *prefix); |
| 63 | void (*cleanup)(struct cgit_filter *); | ||
| 63 | }; | 64 | }; |
| 64 | 65 | ||
| 65 | struct cgit_exec_filter { | 66 | struct cgit_exec_filter { |
| @@ -355,6 +356,7 @@ extern int cgit_close_filter(struct cgit_filter *filter); | |||
| 355 | extern void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix); | 356 | extern void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix); |
| 356 | extern void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **argv); | 357 | extern void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **argv); |
| 357 | extern struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype); | 358 | extern struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype); |
| 359 | extern void cgit_cleanup_filters(void); | ||
| 358 | 360 | ||
| 359 | extern void cgit_prepare_repo_env(struct cgit_repo * repo); | 361 | extern void cgit_prepare_repo_env(struct cgit_repo * repo); |
| 360 | 362 | ||
| @@ -13,6 +13,25 @@ | |||
| 13 | #include <string.h> | 13 | #include <string.h> |
| 14 | #include <stdlib.h> | 14 | #include <stdlib.h> |
| 15 | 15 | ||
| 16 | static inline void reap_filter(struct cgit_filter *filter) | ||
| 17 | { | ||
| 18 | if (filter && filter->cleanup) | ||
| 19 | filter->cleanup(filter); | ||
| 20 | } | ||
| 21 | |||
| 22 | void cgit_cleanup_filters(void) | ||
| 23 | { | ||
| 24 | int i; | ||
| 25 | reap_filter(ctx.cfg.about_filter); | ||
| 26 | reap_filter(ctx.cfg.commit_filter); | ||
| 27 | reap_filter(ctx.cfg.source_filter); | ||
| 28 | for (i = 0; i < cgit_repolist.count; ++i) { | ||
| 29 | reap_filter(cgit_repolist.repos[i].about_filter); | ||
| 30 | reap_filter(cgit_repolist.repos[i].commit_filter); | ||
| 31 | reap_filter(cgit_repolist.repos[i].source_filter); | ||
| 32 | } | ||
| 33 | } | ||
| 34 | |||
| 16 | static int open_exec_filter(struct cgit_filter *base, va_list ap) | 35 | static int open_exec_filter(struct cgit_filter *base, va_list ap) |
| 17 | { | 36 | { |
| 18 | struct cgit_exec_filter *filter = (struct cgit_exec_filter *) base; | 37 | struct cgit_exec_filter *filter = (struct cgit_exec_filter *) base; |
| @@ -67,34 +86,17 @@ static void fprintf_exec_filter(struct cgit_filter *base, FILE *f, const char *p | |||
| 67 | fprintf(f, "%sexec:%s\n", prefix, filter->cmd); | 86 | fprintf(f, "%sexec:%s\n", prefix, filter->cmd); |
| 68 | } | 87 | } |
| 69 | 88 | ||
| 70 | int cgit_open_filter(struct cgit_filter *filter, ...) | 89 | static void cleanup_exec_filter(struct cgit_filter *base) |
| 71 | { | ||
| 72 | int result; | ||
| 73 | va_list ap; | ||
| 74 | va_start(ap, filter); | ||
| 75 | result = filter->open(filter, ap); | ||
| 76 | va_end(ap); | ||
| 77 | return result; | ||
| 78 | } | ||
| 79 | |||
| 80 | int cgit_close_filter(struct cgit_filter *filter) | ||
| 81 | { | ||
| 82 | return filter->close(filter); | ||
| 83 | } | ||
| 84 | |||
| 85 | void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix) | ||
| 86 | { | ||
| 87 | filter->fprintf(filter, f, prefix); | ||
| 88 | } | ||
| 89 | |||
| 90 | void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **argv) | ||
| 91 | { | 90 | { |
| 92 | memset(filter, 0, sizeof(*filter)); | 91 | struct cgit_exec_filter *filter = (struct cgit_exec_filter *) base; |
| 93 | filter->base.open = open_exec_filter; | 92 | if (filter->argv) { |
| 94 | filter->base.close = close_exec_filter; | 93 | free(filter->argv); |
| 95 | filter->base.fprintf = fprintf_exec_filter; | 94 | filter->argv = NULL; |
| 96 | filter->cmd = cmd; | 95 | } |
| 97 | filter->argv = argv; | 96 | if (filter->cmd) { |
| 97 | free(filter->cmd); | ||
| 98 | filter->cmd = NULL; | ||
| 99 | } | ||
| 98 | } | 100 | } |
| 99 | 101 | ||
| 100 | static struct cgit_filter *new_exec_filter(const char *cmd, filter_type filtertype) | 102 | static struct cgit_filter *new_exec_filter(const char *cmd, filter_type filtertype) |
| @@ -125,6 +127,39 @@ static struct cgit_filter *new_exec_filter(const char *cmd, filter_type filterty | |||
| 125 | return &f->base; | 127 | return &f->base; |
| 126 | } | 128 | } |
| 127 | 129 | ||
| 130 | void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **argv) | ||
| 131 | { | ||
| 132 | memset(filter, 0, sizeof(*filter)); | ||
| 133 | filter->base.open = open_exec_filter; | ||
| 134 | filter->base.close = close_exec_filter; | ||
| 135 | filter->base.fprintf = fprintf_exec_filter; | ||
| 136 | filter->base.cleanup = cleanup_exec_filter; | ||
| 137 | filter->cmd = cmd; | ||
| 138 | filter->argv = argv; | ||
| 139 | } | ||
| 140 | |||
| 141 | int cgit_open_filter(struct cgit_filter *filter, ...) | ||
| 142 | { | ||
| 143 | int result; | ||
| 144 | va_list ap; | ||
| 145 | va_start(ap, filter); | ||
| 146 | result = filter->open(filter, ap); | ||
| 147 | va_end(ap); | ||
| 148 | return result; | ||
| 149 | } | ||
| 150 | |||
| 151 | int cgit_close_filter(struct cgit_filter *filter) | ||
| 152 | { | ||
| 153 | return filter->close(filter); | ||
| 154 | } | ||
| 155 | |||
| 156 | void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix) | ||
| 157 | { | ||
| 158 | filter->fprintf(filter, f, prefix); | ||
| 159 | } | ||
| 160 | |||
| 161 | |||
| 162 | |||
| 128 | static const struct { | 163 | static const struct { |
| 129 | const char *prefix; | 164 | const char *prefix; |
| 130 | struct cgit_filter *(*ctor)(const char *cmd, filter_type filtertype); | 165 | struct cgit_filter *(*ctor)(const char *cmd, filter_type filtertype); |
| @@ -161,3 +196,4 @@ struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype) | |||
| 161 | 196 | ||
| 162 | die("Invalid filter type: %.*s", (int) len, cmd); | 197 | die("Invalid filter type: %.*s", (int) len, cmd); |
| 163 | } | 198 | } |
| 199 | |||
