aboutsummaryrefslogtreecommitdiff
diff refs
from: back
to: back
| flip
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, 30 insertions, 38 deletions
diff --git a/cgit.h b/cgit.h
index e6e7715..a72c503 100644
--- a/cgit.h
+++ b/cgit.h
@@ -59,7 +59,6 @@ typedef enum {
struct cgit_filter {
char *cmd;
char **argv;
- int extra_args;
int old_stdout;
int pipe_fh[2];
int pid;
@@ -343,7 +342,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 d8c0116..f4ee9ac 100644
--- a/filter.c
+++ b/filter.c
@@ -13,16 +13,8 @@
#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");
@@ -44,50 +36,45 @@ int cgit_open_filter(struct cgit_filter *filter, ...)
int cgit_close_filter(struct cgit_filter *filter)
{
- int i, exit_status;
+ int exit_status;
chk_non_negative(dup2(filter->old_stdout, STDOUT_FILENO),
"Unable to restore STDOUT");
close(filter->old_stdout);
if (filter->pid < 0)
- goto done;
+ return 0;
waitpid(filter->pid, &exit_status, 0);
if (WIFEXITED(exit_status) && !WEXITSTATUS(exit_status))
- goto done;
+ return 0;
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:
- f->extra_args = 1;
+ extra_args = 1;
break;
case COMMIT:
default:
- f->extra_args = 0;
+ extra_args = 0;
break;
}
+
+ f = xmalloc(sizeof(struct cgit_filter));
+ memset(f, 0, sizeof(struct cgit_filter));
f->cmd = xstrdup(cmd);
- args_size = (2 + f->extra_args) * sizeof(char *);
+ args_size = (2 + 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 f622a01..d4ee279 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -331,9 +331,13 @@ void cgit_print_site_readme()
{
if (!ctx.cfg.root_readme)
return;
- if (ctx.cfg.about_filter)
- cgit_open_filter(ctx.cfg.about_filter, ctx.cfg.root_readme);
+ if (ctx.cfg.about_filter) {
+ ctx.cfg.about_filter->argv[1] = ctx.cfg.root_readme;
+ cgit_open_filter(ctx.cfg.about_filter);
+ }
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 725f3ab..63a5a75 100644
--- a/ui-summary.c
+++ b/ui-summary.c
@@ -151,17 +151,18 @@ void cgit_print_repo_readme(char *path)
* filesystem, while applying the about-filter.
*/
html("<div id='summary'>");
- if (ctx.repo->about_filter)
- cgit_open_filter(ctx.repo->about_filter, filename);
-
+ if (ctx.repo->about_filter) {
+ ctx.repo->about_filter->argv[1] = filename;
+ cgit_open_filter(ctx.repo->about_filter);
+ }
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 e4c3d22..5ae3926 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -45,12 +45,13 @@ 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>");
- cgit_open_filter(ctx.repo->source_filter, filter_arg);
+ ctx.repo->source_filter->argv[1] = xstrdup(name);
+ cgit_open_filter(ctx.repo->source_filter);
html_raw(buf, size);
cgit_close_filter(ctx.repo->source_filter);
- free(filter_arg);
+ free(ctx.repo->source_filter->argv[1]);
+ ctx.repo->source_filter->argv[1] = NULL;
html("</code></pre></td></tr></table>\n");
return;
}