- long values_space = (env_var_count * (PATH_MAX + 64));
-
- void * buffer;
- char ** vars;
- char * values;
- int vars_index = 0;
- unsigned int chars_printed;
-
- /* Allocate buffer for environment variables: first in the buffer is an
- * array of pointers to argument strings, terminated with a NULL pointer.
- * After that the argument strings are placed after each other */
- buffer = malloc(((env_var_count + 1) * sizeof(char *)) + values_space);
- if (!buffer)
- return NULL;
-
- vars = buffer;
- values = (char *) &vars[env_var_count + 1];
-
- /* loop over all defined environment variables and their values */
- while (vars_index < env_var_count) {
- char * name = env_vars[vars_index].name;
- char * value = env_vars[vars_index].value;
-
- if (!value)
- value = "";
-
- chars_printed = snprintf(values, (values_space - 1), "%s=%s", name,
- value);
- if (chars_printed > (values_space - 1)) {
- /* Buffer space exhausted: stop adding variables.
- * Not all environment variables are defined, but the best we can
- * do is to provide the ones that _are_ defined */
- break;
- }
-
- values[chars_printed] = '\0';
- *&vars[vars_index] = values;
- values += (chars_printed + 1);
- values_space -= (chars_printed + 1);
- vars_index++;
- }
-
- /* terminate the array with pointers */
- *&vars[vars_index] = NULL;
-
- return (char *) buffer;
-}
-
-int cgit_open_filter(struct cgit_filter *filter, struct cgit_repo * repo)
-{
-
- filter->old_stdout = chk_positive(dup(STDOUT_FILENO),
- "Unable to duplicate STDOUT");
- chk_zero(pipe(filter->pipe_fh), "Unable to create pipe to subprocess");
- filter->pid = chk_non_negative(fork(), "Unable to create subprocess");
- if (filter->pid == 0) {
- char * env = NULL;
-
- close(filter->pipe_fh[1]);
- chk_non_negative(dup2(filter->pipe_fh[0], STDIN_FILENO),
- "Unable to use pipe as STDIN");
-
- if (repo)
- env = prepare_env(repo);
-
- execve(filter->cmd, filter->argv, (char **)env);
-
- if (env)
- free(env);
-
- die("Unable to exec subprocess %s: %s (%d)", filter->cmd,
- strerror(errno), errno);
- }
- close(filter->pipe_fh[0]);
- chk_non_negative(dup2(filter->pipe_fh[1], STDOUT_FILENO),
- "Unable to use pipe as STDOUT");
- close(filter->pipe_fh[1]);
- return 0;
-}
-
-int cgit_close_filter(struct cgit_filter *filter)
-{
- chk_non_negative(dup2(filter->old_stdout, STDOUT_FILENO),
- "Unable to restore STDOUT");
- close(filter->old_stdout);
- if (filter->pid < 0)
- return 0;
- waitpid(filter->pid, &filter->exitstatus, 0);
- if (WIFEXITED(filter->exitstatus) && !WEXITSTATUS(filter->exitstatus))
- return 0;
- die("Subprocess %s exited abnormally", filter->cmd);