[PATCH 2/4] filter: wire up exec_filter to enable function
Jason A. Donenfeld
Jason at zx2c4.com
Sat Oct 14 16:17:48 CEST 2017
We also move pipe_fh to be local, since it's not needed any place else.
Signed-off-by: Jason A. Donenfeld <Jason at zx2c4.com>
---
cgit.h | 1 +
filter.c | 27 +++++++++++++++++++++------
2 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/cgit.h b/cgit.h
index 8da69e7..f9949a7 100644
--- a/cgit.h
+++ b/cgit.h
@@ -72,6 +72,7 @@ struct cgit_exec_filter {
char *cmd;
char **argv;
int old_stdout;
+ int new_stdout;
int pid;
};
diff --git a/filter.c b/filter.c
index aa0027a..4deb4de 100644
--- a/filter.c
+++ b/filter.c
@@ -60,9 +60,8 @@ static int open_exec_filter(struct cgit_filter *base, va_list ap)
die_errno("Unable to exec subprocess %s", filter->cmd);
}
close(pipe_fh[0]);
- chk_non_negative(dup2(pipe_fh[1], STDOUT_FILENO),
- "Unable to use pipe as STDOUT");
- close(pipe_fh[1]);
+ filter->new_stdout = pipe_fh[1];
+ chk_non_negative(dup2(filter->new_stdout, STDOUT_FILENO), "Unable to assign new fd to STDOUT");
return 0;
}
@@ -71,9 +70,10 @@ static int close_exec_filter(struct cgit_filter *base)
struct cgit_exec_filter *filter = (struct cgit_exec_filter *)base;
int i, exit_status = 0;
- chk_non_negative(dup2(filter->old_stdout, STDOUT_FILENO),
- "Unable to restore STDOUT");
+ chk_non_negative(dup2(filter->old_stdout, STDOUT_FILENO), "Unable to assign old fd to STDOUT");
close(filter->old_stdout);
+ close(filter->new_stdout);
+
if (filter->pid < 0)
goto done;
waitpid(filter->pid, &exit_status, 0);
@@ -82,10 +82,24 @@ static int close_exec_filter(struct cgit_filter *base)
die("Subprocess %s exited abnormally", filter->cmd);
done:
+ close(filter->old_stdout);
+ close(filter->new_stdout);
for (i = 0; i < filter->base.argument_count; i++)
filter->argv[i + 1] = NULL;
- return WEXITSTATUS(exit_status);
+ return WIFEXITED(exit_status);
+}
+static int enable_exec_filter(struct cgit_filter *base, bool on)
+{
+ struct cgit_exec_filter *filter = (struct cgit_exec_filter *)base;
+ int ret;
+
+ if (on)
+ ret = dup2(filter->new_stdout, STDOUT_FILENO);
+ else
+ ret = dup2(filter->old_stdout, STDOUT_FILENO);
+ chk_non_negative(ret, "Unable to assign fd to STDOUT");
+ return 0;
}
static void fprintf_exec_filter(struct cgit_filter *base, FILE *f, const char *prefix)
@@ -128,6 +142,7 @@ void cgit_exec_filter_init(struct cgit_exec_filter *filter, char *cmd, char **ar
memset(filter, 0, sizeof(*filter));
filter->base.open = open_exec_filter;
filter->base.close = close_exec_filter;
+ filter->base.enable = enable_exec_filter;
filter->base.fprintf = fprintf_exec_filter;
filter->base.cleanup = cleanup_exec_filter;
filter->cmd = cmd;
--
2.14.2
More information about the CGit
mailing list