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 #include -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("
"); - 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("
"); 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("
");
-		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("
\n"); return; }