diff options
Diffstat (limited to 'filter.c')
-rw-r--r-- | filter.c | 35 |
1 files changed, 24 insertions, 11 deletions
@@ -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; |