| -rw-r--r-- | cgit.h | 3 | ||||
| -rw-r--r-- | filter.c | 35 | ||||
| -rw-r--r-- | ui-repolist.c | 10 | ||||
| -rw-r--r-- | ui-summary.c | 13 | ||||
| -rw-r--r-- | ui-tree.c | 7 |
5 files changed, 30 insertions, 38 deletions
@@ -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); @@ -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); @@ -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; } |