]> gitweb.ps.run Git - ps-cgit/blobdiff - filter.c
authors: specify maintainers
[ps-cgit] / filter.c
index f4ee9ac2167eee92c3dc0ba8719421d7d701c45c..d8c0116df39bd20a96f183b4e992b969afdb7623 100644 (file)
--- a/filter.c
+++ b/filter.c
 #include <string.h>
 #include <stdlib.h>
 
 #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");
        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 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)
 
        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))
        waitpid(filter->pid, &exit_status, 0);
        if (WIFEXITED(exit_status) && !WEXITSTATUS(exit_status))
-               return 0;
+               goto done;
        die("Subprocess %s exited abnormally", filter->cmd);
        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;
 }
 
 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;
 
 
        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:
        switch (filtertype) {
                case SOURCE:
                case ABOUT:
-                       extra_args = 1;
+                       f->extra_args = 1;
                        break;
 
                case COMMIT:
                default:
                        break;
 
                case COMMIT:
                default:
-                       extra_args = 0;
+                       f->extra_args = 0;
                        break;
        }
                        break;
        }
-       
-       f = xmalloc(sizeof(struct cgit_filter));
-       memset(f, 0, sizeof(struct cgit_filter));
 
        f->cmd = xstrdup(cmd);
 
        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;
        f->argv = xmalloc(args_size);
        memset(f->argv, 0, args_size);
        f->argv[0] = f->cmd;