shithub: choc

Download patch

ref: e62fdd771f01ef7b50fe3cb8f456eae5d7db3748
parent: 9ea3cb62c94b2f293cc5dbc95518b8312434e093
author: Simon Howard <[email protected]>
date: Thu Nov 19 16:07:31 EST 2009

Make chocolate-setup use its own location in the filesystem to find the
location of the chocolate-doom executable. Remove INSTALL_DIR define.

Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 1729

--- a/setup/Makefile.am
+++ b/setup/Makefile.am
@@ -1,7 +1,7 @@
 
 gamesdir = $(prefix)/games
 
-AM_CFLAGS = -I../textscreen -I../src -DINSTALL_DIR="\"$(gamesdir)\""
+AM_CFLAGS = -I../textscreen -I../src
 
 games_PROGRAMS = chocolate-setup
 
--- a/setup/execute.c
+++ b/setup/execute.c
@@ -55,7 +55,7 @@
 #ifdef _WIN32
 #define DOOM_BINARY PACKAGE_TARNAME ".exe"
 #else
-#define DOOM_BINARY INSTALL_DIR "/" PACKAGE_TARNAME
+#define DOOM_BINARY PACKAGE_TARNAME
 #endif
 
 #ifdef _WIN32
@@ -269,11 +269,41 @@
 
 #else
 
+// Given the specified program name, get the full path to the program,
+// assuming that it is in the same directory as this program is.
+
+static char *GetFullExePath(const char *program)
+{
+    char *result;
+    char *sep;
+    unsigned int path_len;
+
+    sep = strrchr(myargv[0], DIR_SEPARATOR);
+
+    if (sep == NULL)
+    {
+        result = strdup(program);
+    }
+    else
+    {
+        path_len = sep - myargv[0] + 1;
+
+        result = malloc(strlen(program) + path_len + 1);
+
+        strncpy(result, myargv[0], path_len);
+        result[path_len] = '\0';
+
+        strcat(result, program);
+    }
+
+    return result;
+}
+
 static int ExecuteCommand(const char *program, const char *arg)
 {
     pid_t childpid;
     int result;
-    const char *argv[] = { program, arg, NULL };
+    const char *argv[3];
 
     childpid = fork();
 
@@ -280,6 +310,10 @@
     if (childpid == 0) 
     {
         // This is the child.  Execute the command.
+
+        argv[0] = GetFullExePath(program);
+        argv[1] = arg;
+        argv[2] = NULL;
 
         execv(argv[0], (char **) argv);