diff options
Diffstat (limited to 'filter.c')
| -rw-r--r-- | filter.c | 35 | 
1 files changed, 24 insertions, 11 deletions
| @@ -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; | 
