struct cgit_filter {
char *cmd;
char **argv;
+ int extra_args;
int old_stdout;
int pipe_fh[2];
int pid;
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);
#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");
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;
{
if (!ctx.cfg.root_readme)
return;
- if (ctx.cfg.about_filter) {
- ctx.cfg.about_filter->argv[1] = ctx.cfg.root_readme;
- cgit_open_filter(ctx.cfg.about_filter);
- }
+ if (ctx.cfg.about_filter)
+ cgit_open_filter(ctx.cfg.about_filter, ctx.cfg.root_readme);
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;
- }
}
* filesystem, while applying the about-filter.
*/
html("<div id='summary'>");
- if (ctx.repo->about_filter) {
- ctx.repo->about_filter->argv[1] = filename;
- cgit_open_filter(ctx.repo->about_filter);
- }
+ if (ctx.repo->about_filter)
+ cgit_open_filter(ctx.repo->about_filter, filename);
+
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);
}
if (ctx.repo->source_filter) {
+ char *filter_arg = xstrdup(name);
html("<td class='lines'><pre><code>");
- ctx.repo->source_filter->argv[1] = xstrdup(name);
- cgit_open_filter(ctx.repo->source_filter);
+ cgit_open_filter(ctx.repo->source_filter, filter_arg);
html_raw(buf, size);
cgit_close_filter(ctx.repo->source_filter);
- free(ctx.repo->source_filter->argv[1]);
- ctx.repo->source_filter->argv[1] = NULL;
+ free(filter_arg);
html("</code></pre></td></tr></table>\n");
return;
}