summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sys-devel/distcc/files/1.2.1/wrapper.patch')
-rw-r--r--sys-devel/distcc/files/1.2.1/wrapper.patch203
1 files changed, 203 insertions, 0 deletions
diff --git a/sys-devel/distcc/files/1.2.1/wrapper.patch b/sys-devel/distcc/files/1.2.1/wrapper.patch
new file mode 100644
index 000000000000..fc5af43064b7
--- /dev/null
+++ b/sys-devel/distcc/files/1.2.1/wrapper.patch
@@ -0,0 +1,203 @@
+diff -aur distcc-1.2.1.orig/src/distcc.c distcc-1.2.1/src/distcc.c
+--- distcc-1.2.1.orig/src/distcc.c 2003-02-23 14:33:19.000000000 -0800
++++ distcc-1.2.1/src/distcc.c 2003-02-26 16:36:57.000000000 -0800
+@@ -481,6 +481,156 @@
+ }
+ }
+
++static char *dcc_safe_getcwd(void)
++{
++ char *cwdstr;
++ size_t len = 200;
++
++ do {
++ cwdstr = malloc(len);
++ if (NULL == cwdstr) break;
++
++ if (NULL == getcwd(cwdstr, len)) {
++ free(cwdstr);
++ cwdstr = NULL;
++ if (ERANGE == errno) {
++ len += 200;
++ continue;
++ }
++ }
++ } while(0);
++
++ if (NULL == cwdstr) {
++ rs_log_error("can't get working directory");
++ exit(1);
++ }
++
++ return cwdstr;
++}
++
++/**
++ * Filter PATH past point that wrapper was called
++ */
++static void dcc_wrapper_trunc_path(char *progname, char *path, char *argv[])
++{
++ static const char *envpath = "PATH=";
++ const char *p;
++ char *n, *str;
++ char *ppath = NULL;
++ int len, maxlen, plen = 0;
++
++ maxlen = strlen(path) + strlen(envpath) + 1;
++ str = malloc(maxlen);
++ if (NULL == str) exit(1);
++
++ /* if we were called explicitly, find the (partial) path */
++ if (progname != argv[0]) {
++ /* eliminate this explicit path from PATH */
++ char *cwdstr = NULL;
++ size_t cwdlen = 0;
++
++ if ('/' != argv[0][0]) {
++ cwdstr = dcc_safe_getcwd();
++ cwdlen = strlen(cwdstr);
++ /* or we could just error out and exit??? */
++ }
++
++ plen = progname - argv[0] - 1;
++ len = cwdlen + plen;
++ ppath = malloc(len);
++ if (NULL == ppath) exit(1);
++
++ ppath[0] = 0;
++ if (NULL != cwdstr) {
++ strncpy(ppath, cwdstr, len);
++ ppath[cwdlen++] = '/';
++ ppath[cwdlen] = 0;
++ free(cwdstr);
++ }
++ strncat(ppath, argv[0], cwdlen + plen);
++ rs_trace("looking for explicit path: %s\n", ppath);
++ }
++ else
++ ppath = NULL;
++
++ for (p = n = path; NULL != n; p = n ? n + 1 : NULL) {
++ n = strchr(p, ':');
++ if (NULL != n)
++ len = n - p;
++ else
++ len = strlen(p);
++
++ if (NULL != ppath) {
++ /* check for partial path name match,
++ pmatch is last portion of path */
++ rs_trace("checking for ppath in %s\n", p);
++ if (len != plen || 0 != strncmp(p, ppath, len))
++ continue;
++ }
++ else {
++ strncpy(str, p, len);
++ snprintf(str + len, maxlen - len, "/%s", progname);
++ rs_trace("checking %s\n", str);
++ if (0 != access(str, X_OK))
++ continue;
++ rs_trace("found %s\n", str);
++ }
++ /* getting here means either we found the path we ran in, or
++ we found the target program we're trying to run;
++ so PATH now starts at next entry */
++ if (NULL != n)
++ p = n + 1;
++ else
++ p = "";
++ break;
++ }
++
++ /* if temp path, p, still contains something, reset PATH;
++ p will be NULL if relative or non-PATH invocation, so
++ the current path is probably free from recursion */
++ if (NULL != p) {
++ strncpy(str, envpath, maxlen);
++ strncat(str, p, maxlen);
++ rs_trace("wrapper is setting %s\n", str);
++ n = strdup(str);
++ if ((NULL == n) || (-1 == putenv(n))) {
++ rs_log_error("putenv PATH failed");
++ exit(1);
++ }
++ }
++ else
++ rs_trace("wrapper not modifying PATH");
++
++ free(str);
++ free(ppath);
++}
++
++static char *dcc_support_wrapper(char *argv[])
++{
++ char *progname, *envstr;
++
++ /* see if program was called with a full or partial path */
++ if ((progname = strrchr(argv[0], '/')) != NULL)
++ progname++;
++ else
++ progname = argv[0];
++
++ if (NULL == (envstr = getenv("DISTCC_HOSTS"))) {
++ char localonly[] = "DISTCC_HOSTS=localhost";
++ if (-1 == putenv(localonly)) {
++ rs_log_error("unable to set default DISTCC_HOSTS");
++ exit(1);
++ }
++ }
++
++ /* right now, we're only playing with path... but
++ wouldn't it be interesting to look at CHOST, too? */
++ if (NULL != (envstr = getenv("PATH")))
++ dcc_wrapper_trunc_path(progname, envstr, argv);
++
++ return progname;
++}
++
+
+ /**
+ * distcc client entry point.
+@@ -490,6 +640,7 @@
+ * Performs basic setup and checks for distcc arguments, and then kicks of
+ * dcc_build_somewhere().
+ **/
++#include <libgen.h>
+ int main(int argc, char **argv)
+ {
+ int status;
+@@ -499,17 +650,25 @@
+
+ dcc_set_trace_from_env();
+
+- if (argc <= 1 || !strcmp(argv[1], "--help")) {
+- dcc_show_usage();
+- exit(0);
+- } else if (!strcmp(argv[1], "--version")) {
+- dcc_show_version("distcc");
+- exit(0);
+- }
+-
+ dcc_recursion_safeguard();
+
+- dcc_find_compiler(argv, &compiler_args);
++ if (NULL != strstr(basename(argv[0]), "distcc")) {
++
++ if (argc <= 1 || !strcmp(argv[1], "--help")) {
++ dcc_show_usage();
++ exit(0);
++ } else if (!strcmp(argv[1], "--version")) {
++ dcc_show_version("distcc");
++ exit(0);
++ }
++
++ dcc_find_compiler(argv, &compiler_args);
++ }
++ else {
++ char *progname = dcc_support_wrapper(argv);
++ dcc_shallowcopy_argv(argv, &compiler_args, 0);
++ compiler_args[0] = progname;
++ }
+
+ dcc_exit(dcc_build_somewhere(compiler_args, &status));
+ }