diff options
-rw-r--r-- | cgit.h | 8 | ||||
-rw-r--r-- | filter.c | 66 | ||||
-rw-r--r-- | ui-snapshot.c | 11 |
3 files changed, 63 insertions, 22 deletions
diff --git a/cgit.h b/cgit.h index 9b4be26..92e8c55 100644 --- a/cgit.h +++ b/cgit.h | |||
@@ -57,6 +57,13 @@ typedef enum { | |||
57 | } filter_type; | 57 | } filter_type; |
58 | 58 | ||
59 | struct cgit_filter { | 59 | struct cgit_filter { |
60 | int (*open)(struct cgit_filter *, va_list ap); | ||
61 | int (*close)(struct cgit_filter *); | ||
62 | void (*fprintf)(struct cgit_filter *, FILE *, const char *prefix); | ||
63 | }; | ||
64 | |||
65 | struct cgit_exec_filter { | ||
66 | struct cgit_filter base; | ||
60 | char *cmd; | 67 | char *cmd; |
61 | char **argv; | 68 | char **argv; |
62 | int extra_args; | 69 | int extra_args; |
@@ -346,6 +353,7 @@ extern int cgit_parse_snapshots_mask(const char *str); | |||
346 | extern int cgit_open_filter(struct cgit_filter *filter, ...); | 353 | extern int cgit_open_filter(struct cgit_filter *filter, ...); |
347 | extern int cgit_close_filter(struct cgit_filter *filter); | 354 | extern int cgit_close_filter(struct cgit_filter *filter); |
348 | extern void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix); | 355 | extern void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix); |
356 | extern void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **argv); | ||
349 | extern struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype); | 357 | extern struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype); |
350 | 358 | ||
351 | extern void cgit_prepare_repo_env(struct cgit_repo * repo); | 359 | extern void cgit_prepare_repo_env(struct cgit_repo * repo); |
diff --git a/filter.c b/filter.c index 80cf689..0f3edb0 100644 --- a/filter.c +++ b/filter.c | |||
@@ -13,15 +13,13 @@ | |||
13 | #include <string.h> | 13 | #include <string.h> |
14 | #include <stdlib.h> | 14 | #include <stdlib.h> |
15 | 15 | ||
16 | int cgit_open_filter(struct cgit_filter *filter, ...) | 16 | static int open_exec_filter(struct cgit_filter *base, va_list ap) |
17 | { | 17 | { |
18 | struct cgit_exec_filter *filter = (struct cgit_exec_filter *) base; | ||
18 | int i; | 19 | int i; |
19 | va_list ap; | ||
20 | 20 | ||
21 | va_start(ap, filter); | ||
22 | for (i = 0; i < filter->extra_args; i++) | 21 | for (i = 0; i < filter->extra_args; i++) |
23 | filter->argv[i+1] = va_arg(ap, char *); | 22 | filter->argv[i+1] = va_arg(ap, char *); |
24 | va_end(ap); | ||
25 | 23 | ||
26 | filter->old_stdout = chk_positive(dup(STDOUT_FILENO), | 24 | filter->old_stdout = chk_positive(dup(STDOUT_FILENO), |
27 | "Unable to duplicate STDOUT"); | 25 | "Unable to duplicate STDOUT"); |
@@ -41,9 +39,9 @@ int cgit_open_filter(struct cgit_filter *filter, ...) | |||
41 | return 0; | 39 | return 0; |
42 | } | 40 | } |
43 | 41 | ||
44 | 42 | static int close_exec_filter(struct cgit_filter *base) | |
45 | int cgit_close_filter(struct cgit_filter *filter) | ||
46 | { | 43 | { |
44 | struct cgit_exec_filter *filter = (struct cgit_exec_filter *) base; | ||
47 | int i, exit_status; | 45 | int i, exit_status; |
48 | 46 | ||
49 | chk_non_negative(dup2(filter->old_stdout, STDOUT_FILENO), | 47 | chk_non_negative(dup2(filter->old_stdout, STDOUT_FILENO), |
@@ -63,21 +61,50 @@ done: | |||
63 | 61 | ||
64 | } | 62 | } |
65 | 63 | ||
66 | void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix) | 64 | static void fprintf_exec_filter(struct cgit_filter *base, FILE *f, const char *prefix) |
67 | { | 65 | { |
66 | struct cgit_exec_filter *filter = (struct cgit_exec_filter *) base; | ||
68 | fprintf(f, "%s%s\n", prefix, filter->cmd); | 67 | fprintf(f, "%s%s\n", prefix, filter->cmd); |
69 | } | 68 | } |
70 | 69 | ||
71 | struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype) | 70 | int cgit_open_filter(struct cgit_filter *filter, ...) |
72 | { | 71 | { |
73 | struct cgit_filter *f; | 72 | int result; |
74 | int args_size = 0; | 73 | va_list ap; |
74 | va_start(ap, filter); | ||
75 | result = filter->open(filter, ap); | ||
76 | va_end(ap); | ||
77 | return result; | ||
78 | } | ||
75 | 79 | ||
76 | if (!cmd || !cmd[0]) | 80 | int cgit_close_filter(struct cgit_filter *filter) |
77 | return NULL; | 81 | { |
82 | return filter->close(filter); | ||
83 | } | ||
84 | |||
85 | void cgit_fprintf_filter(struct cgit_filter *filter, FILE *f, const char *prefix) | ||
86 | { | ||
87 | filter->fprintf(filter, f, prefix); | ||
88 | } | ||
89 | |||
90 | void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **argv) | ||
91 | { | ||
92 | memset(filter, 0, sizeof(*filter)); | ||
93 | filter->base.open = open_exec_filter; | ||
94 | filter->base.close = close_exec_filter; | ||
95 | filter->base.fprintf = fprintf_exec_filter; | ||
96 | filter->cmd = cmd; | ||
97 | filter->argv = argv; | ||
98 | } | ||
99 | |||
100 | static struct cgit_filter *new_exec_filter(const char *cmd, filter_type filtertype) | ||
101 | { | ||
102 | struct cgit_exec_filter *f; | ||
103 | int args_size = 0; | ||
78 | 104 | ||
79 | f = xmalloc(sizeof(struct cgit_filter)); | 105 | f = xmalloc(sizeof(*f)); |
80 | memset(f, 0, sizeof(struct cgit_filter)); | 106 | /* We leave argv for now and assign it below. */ |
107 | cgit_exec_filter_init(f, xstrdup(cmd), NULL); | ||
81 | 108 | ||
82 | switch (filtertype) { | 109 | switch (filtertype) { |
83 | case SOURCE: | 110 | case SOURCE: |
@@ -91,10 +118,17 @@ struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype) | |||
91 | break; | 118 | break; |
92 | } | 119 | } |
93 | 120 | ||
94 | f->cmd = xstrdup(cmd); | ||
95 | args_size = (2 + f->extra_args) * sizeof(char *); | 121 | args_size = (2 + f->extra_args) * sizeof(char *); |
96 | f->argv = xmalloc(args_size); | 122 | f->argv = xmalloc(args_size); |
97 | memset(f->argv, 0, args_size); | 123 | memset(f->argv, 0, args_size); |
98 | f->argv[0] = f->cmd; | 124 | f->argv[0] = f->cmd; |
99 | return f; | 125 | return &f->base; |
126 | } | ||
127 | |||
128 | struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype) | ||
129 | { | ||
130 | if (!cmd || !cmd[0]) | ||
131 | return NULL; | ||
132 | |||
133 | return new_exec_filter(cmd, filtertype); | ||
100 | } | 134 | } |
diff --git a/ui-snapshot.c b/ui-snapshot.c index 5136c49..7115ec4 100644 --- a/ui-snapshot.c +++ b/ui-snapshot.c | |||
@@ -58,13 +58,12 @@ static int write_compressed_tar_archive(const char *hex, | |||
58 | char *filter_argv[]) | 58 | char *filter_argv[]) |
59 | { | 59 | { |
60 | int rv; | 60 | int rv; |
61 | struct cgit_filter f = { | 61 | struct cgit_exec_filter f; |
62 | .cmd = filter_argv[0], | 62 | cgit_exec_filter_init(&f, filter_argv[0], filter_argv); |
63 | .argv = filter_argv, | 63 | |
64 | }; | 64 | cgit_open_filter(&f.base); |
65 | cgit_open_filter(&f); | ||
66 | rv = write_tar_archive(hex, prefix); | 65 | rv = write_tar_archive(hex, prefix); |
67 | cgit_close_filter(&f); | 66 | cgit_close_filter(&f.base); |
68 | return rv; | 67 | return rv; |
69 | } | 68 | } |
70 | 69 | ||