about summary refs log tree commit
diff options
context:
space:
mode:
-rw-r--r--cgit.h3
-rw-r--r--filter.c35
-rw-r--r--ui-repolist.c10
-rw-r--r--ui-summary.c13
-rw-r--r--ui-tree.c7
5 files changed, 38 insertions, 30 deletions
diff --git a/cgit.h b/cgit.h
index a72c503..e6e7715 100644
--- a/cgit.h
+++ b/cgit.h
@@ -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);
 
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;
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);
diff --git a/ui-tree.c b/ui-tree.c
index 5ae3926..e4c3d22 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -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;
         }