about summary refs log tree commit
path: root/filter.c
diff options
context:
space:
mode:
Diffstat (limited to 'filter.c')
-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;