diff options
-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, 38 insertions, 30 deletions
@@ -59,6 +59,7 @@ typedef enum { | |||
59 | struct cgit_filter { | 59 | struct cgit_filter { |
60 | char *cmd; | 60 | char *cmd; |
61 | char **argv; | 61 | char **argv; |
62 | int extra_args; | ||
62 | int old_stdout; | 63 | int old_stdout; |
63 | int pipe_fh[2]; | 64 | int pipe_fh[2]; |
64 | int pid; | 65 | int pid; |
@@ -342,7 +343,7 @@ extern const char *cgit_repobasename(const char *reponame); | |||
342 | 343 | ||
343 | extern int cgit_parse_snapshots_mask(const char *str); | 344 | extern int cgit_parse_snapshots_mask(const char *str); |
344 | 345 | ||
345 | extern int cgit_open_filter(struct cgit_filter *filter); | 346 | extern int cgit_open_filter(struct cgit_filter *filter, ...); |
346 | extern int cgit_close_filter(struct cgit_filter *filter); | 347 | extern int cgit_close_filter(struct cgit_filter *filter); |
347 | extern struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype); | 348 | extern struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype); |
348 | 349 | ||
@@ -13,8 +13,16 @@ | |||
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 | int cgit_open_filter(struct cgit_filter *filter, ...) |
17 | { | 17 | { |
18 | int i; | ||
19 | va_list ap; | ||
20 | |||
21 | va_start(ap, filter); | ||
22 | for (i = 0; i < filter->extra_args; i++) | ||
23 | filter->argv[i+1] = va_arg(ap, char *); | ||
24 | va_end(ap); | ||
25 | |||
18 | filter->old_stdout = chk_positive(dup(STDOUT_FILENO), | 26 | filter->old_stdout = chk_positive(dup(STDOUT_FILENO), |
19 | "Unable to duplicate STDOUT"); | 27 | "Unable to duplicate STDOUT"); |
20 | chk_zero(pipe(filter->pipe_fh), "Unable to create pipe to subprocess"); | 28 | chk_zero(pipe(filter->pipe_fh), "Unable to create pipe to subprocess"); |
@@ -36,45 +44,50 @@ int cgit_open_filter(struct cgit_filter *filter) | |||
36 | 44 | ||
37 | int cgit_close_filter(struct cgit_filter *filter) | 45 | int cgit_close_filter(struct cgit_filter *filter) |
38 | { | 46 | { |
39 | int exit_status; | 47 | int i, exit_status; |
40 | 48 | ||
41 | chk_non_negative(dup2(filter->old_stdout, STDOUT_FILENO), | 49 | chk_non_negative(dup2(filter->old_stdout, STDOUT_FILENO), |
42 | "Unable to restore STDOUT"); | 50 | "Unable to restore STDOUT"); |
43 | close(filter->old_stdout); | 51 | close(filter->old_stdout); |
44 | if (filter->pid < 0) | 52 | if (filter->pid < 0) |
45 | return 0; | 53 | goto done; |
46 | waitpid(filter->pid, &exit_status, 0); | 54 | waitpid(filter->pid, &exit_status, 0); |
47 | if (WIFEXITED(exit_status) && !WEXITSTATUS(exit_status)) | 55 | if (WIFEXITED(exit_status) && !WEXITSTATUS(exit_status)) |
48 | return 0; | 56 | goto done; |
49 | die("Subprocess %s exited abnormally", filter->cmd); | 57 | die("Subprocess %s exited abnormally", filter->cmd); |
58 | |||
59 | done: | ||
60 | for (i = 0; i < filter->extra_args; i++) | ||
61 | filter->argv[i+1] = NULL; | ||
62 | return 0; | ||
63 | |||
50 | } | 64 | } |
51 | 65 | ||
52 | struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype) | 66 | struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype) |
53 | { | 67 | { |
54 | struct cgit_filter *f; | 68 | struct cgit_filter *f; |
55 | int args_size = 0; | 69 | int args_size = 0; |
56 | int extra_args; | ||
57 | 70 | ||
58 | if (!cmd || !cmd[0]) | 71 | if (!cmd || !cmd[0]) |
59 | return NULL; | 72 | return NULL; |
60 | 73 | ||
74 | f = xmalloc(sizeof(struct cgit_filter)); | ||
75 | memset(f, 0, sizeof(struct cgit_filter)); | ||
76 | |||
61 | switch (filtertype) { | 77 | switch (filtertype) { |
62 | case SOURCE: | 78 | case SOURCE: |
63 | case ABOUT: | 79 | case ABOUT: |
64 | extra_args = 1; | 80 | f->extra_args = 1; |
65 | break; | 81 | break; |
66 | 82 | ||
67 | case COMMIT: | 83 | case COMMIT: |
68 | default: | 84 | default: |
69 | extra_args = 0; | 85 | f->extra_args = 0; |
70 | break; | 86 | break; |
71 | } | 87 | } |
72 | |||
73 | f = xmalloc(sizeof(struct cgit_filter)); | ||
74 | memset(f, 0, sizeof(struct cgit_filter)); | ||
75 | 88 | ||
76 | f->cmd = xstrdup(cmd); | 89 | f->cmd = xstrdup(cmd); |
77 | args_size = (2 + extra_args) * sizeof(char *); | 90 | args_size = (2 + f->extra_args) * sizeof(char *); |
78 | f->argv = xmalloc(args_size); | 91 | f->argv = xmalloc(args_size); |
79 | memset(f->argv, 0, args_size); | 92 | memset(f->argv, 0, args_size); |
80 | f->argv[0] = f->cmd; | 93 | 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() | |||
331 | { | 331 | { |
332 | if (!ctx.cfg.root_readme) | 332 | if (!ctx.cfg.root_readme) |
333 | return; | 333 | return; |
334 | if (ctx.cfg.about_filter) { | 334 | if (ctx.cfg.about_filter) |
335 | ctx.cfg.about_filter->argv[1] = ctx.cfg.root_readme; | 335 | cgit_open_filter(ctx.cfg.about_filter, ctx.cfg.root_readme); |
336 | cgit_open_filter(ctx.cfg.about_filter); | ||
337 | } | ||
338 | html_include(ctx.cfg.root_readme); | 336 | html_include(ctx.cfg.root_readme); |
339 | if (ctx.cfg.about_filter) { | 337 | if (ctx.cfg.about_filter) |
340 | cgit_close_filter(ctx.cfg.about_filter); | 338 | cgit_close_filter(ctx.cfg.about_filter); |
341 | ctx.cfg.about_filter->argv[1] = NULL; | ||
342 | } | ||
343 | } | 339 | } |
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) | |||
151 | * filesystem, while applying the about-filter. | 151 | * filesystem, while applying the about-filter. |
152 | */ | 152 | */ |
153 | html("<div id='summary'>"); | 153 | html("<div id='summary'>"); |
154 | if (ctx.repo->about_filter) { | 154 | if (ctx.repo->about_filter) |
155 | ctx.repo->about_filter->argv[1] = filename; | 155 | cgit_open_filter(ctx.repo->about_filter, filename); |
156 | cgit_open_filter(ctx.repo->about_filter); | 156 | |
157 | } | ||
158 | if (ref) | 157 | if (ref) |
159 | cgit_print_file(filename, ref, 1); | 158 | cgit_print_file(filename, ref, 1); |
160 | else | 159 | else |
161 | html_include(filename); | 160 | html_include(filename); |
162 | if (ctx.repo->about_filter) { | 161 | |
162 | if (ctx.repo->about_filter) | ||
163 | cgit_close_filter(ctx.repo->about_filter); | 163 | cgit_close_filter(ctx.repo->about_filter); |
164 | ctx.repo->about_filter->argv[1] = NULL; | 164 | |
165 | } | ||
166 | html("</div>"); | 165 | html("</div>"); |
167 | if (free_filename) | 166 | if (free_filename) |
168 | free(filename); | 167 | free(filename); |
@@ -45,13 +45,12 @@ static void print_text_buffer(const char *name, char *buf, unsigned long size) | |||
45 | } | 45 | } |
46 | 46 | ||
47 | if (ctx.repo->source_filter) { | 47 | if (ctx.repo->source_filter) { |
48 | char *filter_arg = xstrdup(name); | ||
48 | html("<td class='lines'><pre><code>"); | 49 | html("<td class='lines'><pre><code>"); |
49 | ctx.repo->source_filter->argv[1] = xstrdup(name); | 50 | cgit_open_filter(ctx.repo->source_filter, filter_arg); |
50 | cgit_open_filter(ctx.repo->source_filter); | ||
51 | html_raw(buf, size); | 51 | html_raw(buf, size); |
52 | cgit_close_filter(ctx.repo->source_filter); | 52 | cgit_close_filter(ctx.repo->source_filter); |
53 | free(ctx.repo->source_filter->argv[1]); | 53 | free(filter_arg); |
54 | ctx.repo->source_filter->argv[1] = NULL; | ||
55 | html("</code></pre></td></tr></table>\n"); | 54 | html("</code></pre></td></tr></table>\n"); |
56 | return; | 55 | return; |
57 | } | 56 | } |