Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitceceeff

Browse files
committed
Clean up find_my_exec to work cleaner.
Add Win32 code to look in the current directory before the path.Add code so memory is allocated using palloc in backend object files.
1 parent868404b commitceceeff

File tree

1 file changed

+39
-24
lines changed

1 file changed

+39
-24
lines changed

‎src/port/exec.c

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $PostgreSQL: pgsql/src/port/exec.c,v 1.10 2004/05/19 17:15:21 momjian Exp $
10+
* $PostgreSQL: pgsql/src/port/exec.c,v 1.11 2004/05/2015:35:41 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
1414

1515
#ifndefFRONTEND
1616
#include"postgres.h"
17+
#definemalloc(l)palloc(l)
18+
#definefree(p)pfree(p)
19+
#definestrdup(p)pstrdup(p)
1720
#else
1821
#include"postgres_fe.h"
1922
#endif
@@ -178,12 +181,15 @@ validate_exec(char *path)
178181
int
179182
find_my_exec(constchar*argv0,char*full_path)
180183
{
181-
charbuf[MAXPGPATH+2];
184+
charcwd[MAXPGPATH];
182185
char*p;
183186
char*path,
184187
*startp,
185188
*endp;
186189

190+
if (!getcwd(cwd,MAXPGPATH))
191+
cwd[0]='\0';
192+
187193
/*
188194
* First try: use the binary that's located in the
189195
* same directory if it was invoked with an explicit path.
@@ -195,31 +201,42 @@ find_my_exec(const char *argv0, char *full_path)
195201
* it).
196202
*/
197203
/* Does argv0 have a separator? */
198-
if (argv0&&(p=last_path_separator(argv0)))
204+
if ((p=last_path_separator(argv0)))
199205
{
200206
if (*++p=='\0')
201207
{
202208
log_error("argv[0] ends with a path separator \"%s\"",argv0);
203209
return-1;
204210
}
205-
if (is_absolute_path(argv0)|| !getcwd(buf,MAXPGPATH))
206-
buf[0]='\0';
207-
else/* path is not absolute and getcwd worked */
208-
strcat(buf,"/");
209-
strcat(buf,argv0);
210-
if (validate_exec(buf)==0)
211+
212+
if (is_absolute_path(argv0))
213+
StrNCpy(full_path,argv0,MAXPGPATH);
214+
else
215+
snprintf(full_path,MAXPGPATH,"%s/%s",cwd,argv0);
216+
217+
canonicalize_path(full_path);
218+
if (validate_exec(full_path)==0)
211219
{
212-
strncpy(full_path,buf,MAXPGPATH);
213220
win32_make_absolute(full_path);
214221
return0;
215222
}
216223
else
217224
{
218-
log_error("invalid binary \"%s\"",buf);
225+
log_error("invalid binary \"%s\"",full_path);
219226
return-1;
220227
}
221228
}
222229

230+
#ifdefWIN32
231+
/* Win32 checks the current directory first for names without slashes */
232+
if (validate_exec(argv0)==0)
233+
{
234+
snprintf(full_path,MAXPGPATH,"%s/%s",cwd,argv0);
235+
win32_make_absolute(full_path);
236+
return0;
237+
}
238+
#endif
239+
223240
/*
224241
* Second try: since no explicit path was supplied, the user must have
225242
* been relying on PATH. We'll use the same PATH.
@@ -235,24 +252,23 @@ find_my_exec(const char *argv0, char *full_path)
235252
continue;
236253
if (endp)
237254
*endp='\0';
238-
if (is_absolute_path(startp)|| !getcwd(buf,MAXPGPATH))
239-
buf[0]='\0';
240-
else/* path is not absolute and getcwd worked */
241-
strcat(buf,"/");
242-
strcat(buf,startp);
243-
strcat(buf,"/");
244-
strcat(buf,argv0);
245-
switch (validate_exec(buf))
255+
256+
if (is_absolute_path(startp))
257+
snprintf(full_path,MAXPGPATH,"%s/%s",startp,argv0);
258+
else
259+
snprintf(full_path,MAXPGPATH,"%s/%s/%s",cwd,startp,argv0);
260+
261+
canonicalize_path(full_path);
262+
switch (validate_exec(full_path))
246263
{
247264
case0:/* found ok */
248-
strncpy(full_path,buf,MAXPGPATH);
249265
win32_make_absolute(full_path);
250266
free(path);
251267
return0;
252268
case-1:/* wasn't even a candidate, keep looking */
253269
break;
254270
case-2:/* found but disqualified */
255-
log_error("could not read binary \"%s\"",buf);
271+
log_error("could not read binary \"%s\"",full_path);
256272
free(path);
257273
return-1;
258274
}
@@ -270,9 +286,8 @@ find_my_exec(const char *argv0, char *full_path)
270286
*Win32 has a native way to find the executable name, but the above
271287
*method works too.
272288
*/
273-
if (GetModuleFileName(NULL,basename,MAXPGPATH)==0)
274-
ereport(FATAL,
275-
(errmsg("GetModuleFileName failed (%i)",(int)GetLastError())));
289+
if (GetModuleFileName(NULL,full_path,MAXPGPATH)==0)
290+
log_error("GetModuleFileName failed (%i)",(int)GetLastError());
276291
#endif
277292
}
278293

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp