| -rw-r--r-- | cgit.h | 8 | ||||
| -rw-r--r-- | filter.c | 66 | ||||
| -rw-r--r-- | ui-snapshot.c | 11 |
3 files changed, 22 insertions, 63 deletions
@@ -57,13 +57,6 @@ typedef enum { } filter_type; struct cgit_filter { - int (*open)(struct cgit_filter *, va_list ap); - int (*close)(struct cgit_filter *); - void (*fprintf)(struct cgit_filter *, FILE *, const char *prefix); -}; - -struct cgit_exec_filter { - struct cgit_filter base; char *cmd; char **argv; int extra_args; @@ -353,7 +346,6 @@ extern int cgit_parse_snapshots_mask(const char *str); extern int cgit_open_filter(struct cgit_filter *filter, ...); extern int cgit_close_filter(struct cgit_filter *filter); extern void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix); -extern void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **argv); extern struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype); extern void cgit_prepare_repo_env(struct cgit_repo * repo); @@ -13,13 +13,15 @@ #include <string.h> #include <stdlib.h> -static int open_exec_filter(struct cgit_filter *base, va_list ap) +int cgit_open_filter(struct cgit_filter *filter, ...) { - struct cgit_exec_filter *filter = (struct cgit_exec_filter *) base; 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"); @@ -39,9 +41,9 @@ static int open_exec_filter(struct cgit_filter *base, va_list ap) return 0; } -static int close_exec_filter(struct cgit_filter *base) + +int cgit_close_filter(struct cgit_filter *filter) { - struct cgit_exec_filter *filter = (struct cgit_exec_filter *) base; int i, exit_status; chk_non_negative(dup2(filter->old_stdout, STDOUT_FILENO), @@ -61,50 +63,21 @@ done: } -static void fprintf_exec_filter(struct cgit_filter *base, FILE *f, const char *prefix) -{ - struct cgit_exec_filter *filter = (struct cgit_exec_filter *) base; - fprintf(f, "%s%s\n", prefix, filter->cmd); -} - -int cgit_open_filter(struct cgit_filter *filter, ...) -{ - int result; - va_list ap; - va_start(ap, filter); - result = filter->open(filter, ap); - va_end(ap); - return result; -} - -int cgit_close_filter(struct cgit_filter *filter) -{ - return filter->close(filter); -} - void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix) { - filter->fprintf(filter, f, prefix); -} - -void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **argv) -{ - memset(filter, 0, sizeof(*filter)); - filter->base.open = open_exec_filter; - filter->base.close = close_exec_filter; - filter->base.fprintf = fprintf_exec_filter; - filter->cmd = cmd; - filter->argv = argv; + fprintf(f, "%s%s\n", prefix, filter->cmd); } -static struct cgit_filter *new_exec_filter(const char *cmd, filter_type filtertype) +struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype) { - struct cgit_exec_filter *f; + struct cgit_filter *f; int args_size = 0; - f = xmalloc(sizeof(*f)); - /* We leave argv for now and assign it below. */ - cgit_exec_filter_init(f, xstrdup(cmd), NULL); + if (!cmd || !cmd[0]) + return NULL; + + f = xmalloc(sizeof(struct cgit_filter)); + memset(f, 0, sizeof(struct cgit_filter)); switch (filtertype) { case SOURCE: @@ -118,17 +91,10 @@ static struct cgit_filter *new_exec_filter(const char *cmd, filter_type filterty break; } + f->cmd = xstrdup(cmd); args_size = (2 + f->extra_args) * sizeof(char *); f->argv = xmalloc(args_size); memset(f->argv, 0, args_size); f->argv[0] = f->cmd; - return &f->base; -} - -struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype) -{ - if (!cmd || !cmd[0]) - return NULL; - - return new_exec_filter(cmd, filtertype); + return f; } diff --git a/ui-snapshot.c b/ui-snapshot.c index 7115ec4..5136c49 100644 --- a/ui-snapshot.c +++ b/ui-snapshot.c @@ -58,12 +58,13 @@ static int write_compressed_tar_archive(const char *hex, char *filter_argv[]) { int rv; - struct cgit_exec_filter f; - cgit_exec_filter_init(&f, filter_argv[0], filter_argv); - - cgit_open_filter(&f.base); + struct cgit_filter f = { + .cmd = filter_argv[0], + .argv = filter_argv, + }; + cgit_open_filter(&f); rv = write_tar_archive(hex, prefix); - cgit_close_filter(&f.base); + cgit_close_filter(&f); return rv; } |