Website Summary Files Commits Branches @commit @diff @stats
path: root / filter.c
diff options
context:
space:
mode:
Commit3d8a6507ca542881a5e8b30ad6b7068a9c4fdeea (patch)
Author
 John Keeping <john@keeping.me.uk>
2014-01-12 17:13:50 +0000
Committer
 Jason A. Donenfeld <Jason@zx2c4.com>
2014-01-12 20:20:20 +0100
Filesf95c74d3317546606d72b74db3082769515c5e33 /filter.c
cgit-3d8a6507ca542881a5e8b30ad6b7068a9c4fdeea.tar
cgit-3d8a6507ca542881a5e8b30ad6b7068a9c4fdeea.tar.gz
cgit-3d8a6507ca542881a5e8b30ad6b7068a9c4fdeea.zip
Parentda218fcd9eb554a8405ca72e84bcc0feb371194f (diff)
filter: pass extra arguments via cgit_open_filter
This avoids poking into the filter data structure at various points in the code. We rely on the fact that the number of arguments is fixed based on the filter type (set in cgit_new_filter) and that the call sites all know which filter type they're using. Signed-off-by: John Keeping <john@keeping.me.uk>
1 files changed, 24 insertions, 11 deletions
-rw-r--r--filter.c35
diff --git a/filter.c b/filter.c
index f4ee9ac..d8c0116 100644
--- a/filter.c
+++ b/filter.c
@@ -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;