about summary refs log tree commit diff
path: root/filter.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--filter.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/filter.c b/filter.c
index f4ee9ac..d8c0116 100644
--- a/filter.c
+++ b/filter.c
@@ -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;