Line
Link Here
|
0 |
-- hatari-1.4.0.orig/src/paths.c |
0 |
++ hatari-1.4.0/src/paths.c |
Lines 109-179
Link Here
|
109 |
free(pTmpName); |
109 |
free(pTmpName); |
110 |
} |
110 |
} |
111 |
|
111 |
|
112 |
|
|
|
113 |
/** |
114 |
* Locate the directory where the hatari executable resides |
115 |
*/ |
116 |
static char *Paths_InitExecDir(const char *argv0) |
117 |
{ |
118 |
char *psExecDir; /* Path string where the hatari executable can be found */ |
119 |
|
120 |
/* Allocate memory for storing the path string of the executable */ |
121 |
psExecDir = malloc(FILENAME_MAX); |
122 |
if (!psExecDir) |
123 |
{ |
124 |
fprintf(stderr, "Out of memory (Paths_Init)\n"); |
125 |
exit(-1); |
126 |
} |
127 |
|
128 |
/* Determine the bindir... |
129 |
* Start with empty string, then try to use OS specific functions, |
130 |
* and finally analyze the PATH variable if it has not been found yet. */ |
131 |
psExecDir[0] = '\0'; |
132 |
|
133 |
#if defined(__linux__) |
134 |
{ |
135 |
int i; |
136 |
/* On Linux, we can analyze the symlink /proc/self/exe */ |
137 |
i = readlink("/proc/self/exe", psExecDir, FILENAME_MAX); |
138 |
if (i > 0) |
139 |
{ |
140 |
char *p; |
141 |
psExecDir[i] = '\0'; |
142 |
p = strrchr(psExecDir, '/'); /* Search last slash */ |
143 |
if (p) |
144 |
*p = 0; /* Strip file name from path */ |
145 |
} |
146 |
} |
147 |
//#elif defined(WIN32) || defined(__CEGCC__) |
148 |
// /* On Windows we can use GetModuleFileName for getting the exe path */ |
149 |
// GetModuleFileName(NULL, psExecDir, FILENAME_MAX); |
150 |
#endif |
151 |
|
152 |
/* If we do not have the execdir yet, analyze argv[0] and the PATH: */ |
153 |
if (psExecDir[0] == 0) |
154 |
{ |
155 |
if (strchr(argv0, PATHSEP) == 0) |
156 |
{ |
157 |
/* No separator in argv[0], we have to explore PATH... */ |
158 |
Paths_GetExecDirFromPATH(argv0, psExecDir, FILENAME_MAX); |
159 |
} |
160 |
else |
161 |
{ |
162 |
/* There was a path separator in argv[0], so let's assume a |
163 |
* relative or absolute path to the current directory in argv[0] */ |
164 |
char *p; |
165 |
strncpy(psExecDir, argv0, FILENAME_MAX); |
166 |
psExecDir[FILENAME_MAX-1] = 0; |
167 |
p = strrchr(psExecDir, PATHSEP); /* Search last slash */ |
168 |
if (p) |
169 |
*p = 0; /* Strip file name from path */ |
170 |
} |
171 |
} |
172 |
|
173 |
return psExecDir; |
174 |
} |
175 |
|
176 |
|
177 |
/** |
112 |
/** |
178 |
* Initialize the users home directory string |
113 |
* Initialize the users home directory string |
179 |
* and Hatari's home directory (~/.hatari) |
114 |
* and Hatari's home directory (~/.hatari) |
Lines 226-233
Link Here
|
226 |
*/ |
161 |
*/ |
227 |
void Paths_Init(const char *argv0) |
162 |
void Paths_Init(const char *argv0) |
228 |
{ |
163 |
{ |
229 |
char *psExecDir; /* Path string where the hatari executable can be found */ |
|
|
230 |
|
231 |
/* Init working directory string */ |
164 |
/* Init working directory string */ |
232 |
if (getcwd(sWorkingDir, FILENAME_MAX) == NULL) |
165 |
if (getcwd(sWorkingDir, FILENAME_MAX) == NULL) |
233 |
{ |
166 |
{ |
Lines 238-264
Link Here
|
238 |
/* Init the user's home directory string */ |
171 |
/* Init the user's home directory string */ |
239 |
Paths_InitHomeDirs(); |
172 |
Paths_InitHomeDirs(); |
240 |
|
173 |
|
241 |
/* Get the directory where the executable resides */ |
174 |
strcpy(sDataDir, BIN2DATADIR); |
242 |
psExecDir = Paths_InitExecDir(argv0); |
|
|
243 |
|
244 |
/* Now create the datadir path name from the bindir path name: */ |
245 |
if (psExecDir && strlen(psExecDir) > 0) |
246 |
{ |
247 |
snprintf(sDataDir, sizeof(sDataDir), "%s%c%s", |
248 |
psExecDir, PATHSEP, BIN2DATADIR); |
249 |
} |
250 |
else |
251 |
{ |
252 |
/* bindir could not be determined, let's assume datadir is relative |
253 |
* to current working directory... */ |
254 |
strcpy(sDataDir, BIN2DATADIR); |
255 |
} |
256 |
|
175 |
|
257 |
/* And finally make a proper absolute path out of datadir: */ |
176 |
/* And finally make a proper absolute path out of datadir: */ |
258 |
File_MakeAbsoluteName(sDataDir); |
177 |
File_MakeAbsoluteName(sDataDir); |
259 |
|
178 |
|
260 |
free(psExecDir); |
|
|
261 |
|
262 |
/* fprintf(stderr, " WorkingDir = %s\n DataDir = %s\n UserHomeDir = %s\n HatariHomeDir = %s\n", |
179 |
/* fprintf(stderr, " WorkingDir = %s\n DataDir = %s\n UserHomeDir = %s\n HatariHomeDir = %s\n", |
263 |
sWorkingDir, sDataDir, sUserHomeDir, sHatariHomeDir); */ |
180 |
sWorkingDir, sDataDir, sUserHomeDir, sHatariHomeDir); */ |
264 |
} |
181 |
} |