[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