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)  		ctx.cfg.cache_size = 0;  	err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root,  			    ctx.qry.raw, ttl, process_request, &ctx); +	cgit_cleanup_filters();  	if (err)  		cgit_print_error("Error processing page: %s (%d)",  				 strerror(err), err); @@ -60,6 +60,7 @@ struct cgit_filter {  	int (*open)(struct cgit_filter *, va_list ap);  	int (*close)(struct cgit_filter *);  	void (*fprintf)(struct cgit_filter *, FILE *, const char *prefix); +	void (*cleanup)(struct cgit_filter *);  };  struct cgit_exec_filter { @@ -355,6 +356,7 @@ extern int cgit_close_filter(struct cgit_filter *filter);  extern void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix);  extern void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **argv);  extern struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype); +extern void cgit_cleanup_filters(void);  extern void cgit_prepare_repo_env(struct cgit_repo * repo); @@ -13,6 +13,25 @@  #include <string.h>  #include <stdlib.h> +static inline void reap_filter(struct cgit_filter *filter) +{ +	if (filter && filter->cleanup) +		filter->cleanup(filter); +} + +void cgit_cleanup_filters(void) +{ +	int i; +	reap_filter(ctx.cfg.about_filter); +	reap_filter(ctx.cfg.commit_filter); +	reap_filter(ctx.cfg.source_filter); +	for (i = 0; i < cgit_repolist.count; ++i) { +		reap_filter(cgit_repolist.repos[i].about_filter); +		reap_filter(cgit_repolist.repos[i].commit_filter); +		reap_filter(cgit_repolist.repos[i].source_filter); +	} +} +  static int open_exec_filter(struct cgit_filter *base, va_list ap)  {  	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  	fprintf(f, "%sexec:%s\n", prefix, filter->cmd);  } -int cgit_open_filter(struct cgit_filter *filter, ...) -{ -	int result; -	va_list ap; -	va_start(ap, filter); -	result = filter->open(filter, ap); -	va_end(ap); -	return result; -} - -int cgit_close_filter(struct cgit_filter *filter) -{ -	return filter->close(filter); -} - -void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix) -{ -	filter->fprintf(filter, f, prefix); -} - -void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **argv) +static void cleanup_exec_filter(struct cgit_filter *base)  { -	memset(filter, 0, sizeof(*filter)); -	filter->base.open = open_exec_filter; -	filter->base.close = close_exec_filter; -	filter->base.fprintf = fprintf_exec_filter; -	filter->cmd = cmd; -	filter->argv = argv; +	struct cgit_exec_filter *filter = (struct cgit_exec_filter *) base; +	if (filter->argv) { +		free(filter->argv); +		filter->argv = NULL; +	} +	if (filter->cmd) { +		free(filter->cmd); +		filter->cmd = NULL; +	}  }  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  	return &f->base;  } +void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **argv) +{ +	memset(filter, 0, sizeof(*filter)); +	filter->base.open = open_exec_filter; +	filter->base.close = close_exec_filter; +	filter->base.fprintf = fprintf_exec_filter; +	filter->base.cleanup = cleanup_exec_filter; +	filter->cmd = cmd; +	filter->argv = argv; +} + +int cgit_open_filter(struct cgit_filter *filter, ...) +{ +	int result; +	va_list ap; +	va_start(ap, filter); +	result = filter->open(filter, ap); +	va_end(ap); +	return result; +} + +int cgit_close_filter(struct cgit_filter *filter) +{ +	return filter->close(filter); +} + +void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix) +{ +	filter->fprintf(filter, f, prefix); +} + + +  static const struct {  	const char *prefix;  	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)  	die("Invalid filter type: %.*s", (int) len, cmd);  } + | 
