X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/14f28923a2ed31fba9bf7042e8e2dff21717c333..b88cda6e5b4472fc1bb0ae00d9fb974ec4f61d7a:/shared.c diff --git a/shared.c b/shared.c index 8c3d18a..be2ae59 100644 --- a/shared.c +++ b/shared.c @@ -102,23 +102,15 @@ void *cgit_free_commitinfo(struct commitinfo *info) char *trim_end(const char *str, char c) { int len; - char *s, *t; if (str == NULL) return NULL; - t = (char *)str; - len = strlen(t); - while(len > 0 && t[len - 1] == c) + len = strlen(str); + while(len > 0 && str[len - 1] == c) len--; - if (len == 0) return NULL; - - c = t[len]; - t[len] = '\0'; - s = xstrdup(t); - t[len] = c; - return s; + return xstrndup(str, len); } char *strlpart(char *txt, int maxlen) @@ -313,7 +305,6 @@ void cgit_diff_tree(const unsigned char *old_sha1, filepair_fn fn, const char *prefix, int ignorews) { struct diff_options opt; - int ret; int prefixlen; diff_setup(&opt); @@ -334,9 +325,9 @@ void cgit_diff_tree(const unsigned char *old_sha1, diff_setup_done(&opt); if (old_sha1 && !is_null_sha1(old_sha1)) - ret = diff_tree_sha1(old_sha1, new_sha1, "", &opt); + diff_tree_sha1(old_sha1, new_sha1, "", &opt); else - ret = diff_root_tree_sha1(new_sha1, "", &opt); + diff_root_tree_sha1(new_sha1, "", &opt); diffcore_std(&opt); diff_flush(&opt); } @@ -383,7 +374,7 @@ typedef struct { char * value; } cgit_env_var; -static char * prepare_env(struct cgit_repo * repo) { +static void prepare_env(struct cgit_repo * repo) { cgit_env_var env_vars[] = { { .name = "CGIT_REPO_URL", .value = repo->url }, { .name = "CGIT_REPO_NAME", .value = repo->name }, @@ -394,52 +385,14 @@ static char * prepare_env(struct cgit_repo * repo) { { .name = "CGIT_REPO_CLONE_URL", .value = repo->clone_url } }; int env_var_count = ARRAY_SIZE(env_vars); - 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; + cgit_env_var *p, *q; + static char *warn = "cgit warning: failed to set env: %s=%s\n"; + + p = env_vars; + q = p + env_var_count; + for (; p < q; p++) + if (setenv(p->name, p->value, 1)) + fprintf(stderr, warn, p->name, p->value); } int cgit_open_filter(struct cgit_filter *filter, struct cgit_repo * repo) @@ -450,20 +403,12 @@ int cgit_open_filter(struct cgit_filter *filter, struct cgit_repo * repo) 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); - + prepare_env(repo); + execvp(filter->cmd, filter->argv); die("Unable to exec subprocess %s: %s (%d)", filter->cmd, strerror(errno), errno); }