diff options
Diffstat (limited to '')
| -rw-r--r-- | cgit.h | 3 | ||||
| -rw-r--r-- | filter.c | 35 | ||||
| -rw-r--r-- | ui-repolist.c | 10 | ||||
| -rw-r--r-- | ui-summary.c | 13 | ||||
| -rw-r--r-- | ui-tree.c | 7 | 
5 files changed, 38 insertions, 30 deletions
| @@ -59,6 +59,7 @@ typedef enum {  struct cgit_filter {  	char *cmd;  	char **argv; +	int extra_args;  	int old_stdout;  	int pipe_fh[2];  	int pid; @@ -342,7 +343,7 @@ extern const char *cgit_repobasename(const char *reponame);  extern int cgit_parse_snapshots_mask(const char *str); -extern int cgit_open_filter(struct cgit_filter *filter); +extern int cgit_open_filter(struct cgit_filter *filter, ...);  extern int cgit_close_filter(struct cgit_filter *filter);  extern struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype); @@ -13,8 +13,16 @@  #include <string.h>  #include <stdlib.h> -int cgit_open_filter(struct cgit_filter *filter) +int cgit_open_filter(struct cgit_filter *filter, ...)  { +	int i; +	va_list ap; + +	va_start(ap, filter); +	for (i = 0; i < filter->extra_args; i++) +		filter->argv[i+1] = va_arg(ap, char *); +	va_end(ap); +  	filter->old_stdout = chk_positive(dup(STDOUT_FILENO),  		"Unable to duplicate STDOUT");  	chk_zero(pipe(filter->pipe_fh), "Unable to create pipe to subprocess"); @@ -36,45 +44,50 @@ int cgit_open_filter(struct cgit_filter *filter)  int cgit_close_filter(struct cgit_filter *filter)  { -	int exit_status; +	int i, exit_status;  	chk_non_negative(dup2(filter->old_stdout, STDOUT_FILENO),  		"Unable to restore STDOUT");  	close(filter->old_stdout);  	if (filter->pid < 0) -		return 0; +		goto done;  	waitpid(filter->pid, &exit_status, 0);  	if (WIFEXITED(exit_status) && !WEXITSTATUS(exit_status)) -		return 0; +		goto done;  	die("Subprocess %s exited abnormally", filter->cmd); + +done: +	for (i = 0; i < filter->extra_args; i++) +		filter->argv[i+1] = NULL; +	return 0; +  }  struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype)  {  	struct cgit_filter *f;  	int args_size = 0; -	int extra_args;  	if (!cmd || !cmd[0])  		return NULL; +	f = xmalloc(sizeof(struct cgit_filter)); +	memset(f, 0, sizeof(struct cgit_filter)); +  	switch (filtertype) {  		case SOURCE:  		case ABOUT: -			extra_args = 1; +			f->extra_args = 1;  			break;  		case COMMIT:  		default: -			extra_args = 0; +			f->extra_args = 0;  			break;  	} -	 -	f = xmalloc(sizeof(struct cgit_filter)); -	memset(f, 0, sizeof(struct cgit_filter));  	f->cmd = xstrdup(cmd); -	args_size = (2 + extra_args) * sizeof(char *); +	args_size = (2 + f->extra_args) * sizeof(char *);  	f->argv = xmalloc(args_size);  	memset(f->argv, 0, args_size);  	f->argv[0] = f->cmd; diff --git a/ui-repolist.c b/ui-repolist.c index d4ee279..f622a01 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -331,13 +331,9 @@ void cgit_print_site_readme()  {  	if (!ctx.cfg.root_readme)  		return; -	if (ctx.cfg.about_filter) { -		ctx.cfg.about_filter->argv[1] = ctx.cfg.root_readme; -		cgit_open_filter(ctx.cfg.about_filter); -	} +	if (ctx.cfg.about_filter) +		cgit_open_filter(ctx.cfg.about_filter, ctx.cfg.root_readme);  	html_include(ctx.cfg.root_readme); -	if (ctx.cfg.about_filter) { +	if (ctx.cfg.about_filter)  		cgit_close_filter(ctx.cfg.about_filter); -		ctx.cfg.about_filter->argv[1] = NULL; -	}  } diff --git a/ui-summary.c b/ui-summary.c index 63a5a75..725f3ab 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -151,18 +151,17 @@ void cgit_print_repo_readme(char *path)  	 * filesystem, while applying the about-filter.  	 */  	html("<div id='summary'>"); -	if (ctx.repo->about_filter) { -		ctx.repo->about_filter->argv[1] = filename; -		cgit_open_filter(ctx.repo->about_filter); -	} +	if (ctx.repo->about_filter) +		cgit_open_filter(ctx.repo->about_filter, filename); +  	if (ref)  		cgit_print_file(filename, ref, 1);  	else  		html_include(filename); -	if (ctx.repo->about_filter) { + +	if (ctx.repo->about_filter)  		cgit_close_filter(ctx.repo->about_filter); -		ctx.repo->about_filter->argv[1] = NULL; -	} +  	html("</div>");  	if (free_filename)  		free(filename); @@ -45,13 +45,12 @@ static void print_text_buffer(const char *name, char *buf, unsigned long size)  	}  	if (ctx.repo->source_filter) { +		char *filter_arg = xstrdup(name);  		html("<td class='lines'><pre><code>"); -		ctx.repo->source_filter->argv[1] = xstrdup(name); -		cgit_open_filter(ctx.repo->source_filter); +		cgit_open_filter(ctx.repo->source_filter, filter_arg);  		html_raw(buf, size);  		cgit_close_filter(ctx.repo->source_filter); -		free(ctx.repo->source_filter->argv[1]); -		ctx.repo->source_filter->argv[1] = NULL; +		free(filter_arg);  		html("</code></pre></td></tr></table>\n");  		return;  	} | 
