From 7198ba986d7174e9b36ec63664f340d53a5a2af3 Mon Sep 17 00:00:00 2001
From: Jeremy Hylton <jeremy@alum.mit.edu>
Date: Mon, 25 Sep 2000 17:00:24 +0000
Subject: fix bug #114290: when interpreter's argv[0] has a relative path make 
    it absolute by joining it with getcwd result.  avoid including    
 unnecessary ./ in path but do not test for ../ (more complicated)

---
 Modules/getpath.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/Modules/getpath.c b/Modules/getpath.c
index c295d30..7d9a961 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -219,6 +219,23 @@ joinpath(char *buffer, char *stuff)
     buffer[n+k] = '\0';
 }
 
+static void
+init_path_from_argv0(char *path, char *argv0_path)
+{
+    if (argv0_path[0] == '/')
+	strcpy(path, argv0_path);
+    else if (argv0_path[0] == '.') {
+	getcwd(path, MAXPATHLEN);
+	if (argv0_path[1] == '/') 
+	    joinpath(path, argv0_path + 2);
+	else
+	    joinpath(path, argv0_path);
+    }
+    else {
+	getcwd(path, MAXPATHLEN);
+	joinpath(path, argv0_path);
+    }
+}
 
 static int
 search_for_prefix(char *argv0_path, char *home)
@@ -264,7 +281,7 @@ search_for_prefix(char *argv0_path, char *home)
     }
 
     /* Search from argv0_path, until root is found */
-    strcpy(prefix, argv0_path);
+    init_path_from_argv0(prefix, argv0_path);
     do {
         n = strlen(prefix);
         joinpath(prefix, lib_python);
@@ -314,7 +331,7 @@ search_for_exec_prefix(char *argv0_path, char *home)
     }
 
     /* Search from argv0_path, until root is found */
-    strcpy(exec_prefix, argv0_path);
+    init_path_from_argv0(exec_prefix, argv0_path);
     do {
         n = strlen(exec_prefix);
         joinpath(exec_prefix, lib_python);
-- 
cgit v0.12

