backend startup.
index 6a31adad5783ba699f523eea5c618a0655cb47a8..86053d79c096e82e65a6ca4160bf15569cc15e66 100644 (file)
sem_id beos_shm_sem;
/* Global var containing the postgres path */
-extern char pg_pathname[];
+extern char my_exec_path[];
/* Shared library loading doesn't work after fork in beos. The solution is to use an exact
char Cmd[4000];
/* Build arg list */
- sprintf(Cmd, "%s -beossupportserver %d %d &", pg_pathname, (int) beos_dl_port_in, (int) beos_dl_port_out);
+ sprintf(Cmd, "%s -beossupportserver %d %d &", my_exec_path, (int) beos_dl_port_in, (int) beos_dl_port_out);
/* Lauch process */
system(Cmd);
index e2ad50d28417a14ffdf3d9eb928687eda17ff0df..af72ef9f07cf94ae8b8f34433283cfee6bea78b1 100644 (file)
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/port/dynloader/bsdi.c,v 1.23 2003年11月29日 19:51:54 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/port/dynloader/bsdi.c,v 1.24 2004年05月13日 22:45:02 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#ifndef HAVE_DLOPEN
-extern char pg_pathname[];
+extern char my_exec_path[];
void *
pg_dlopen(char *filename)
*/
if (!dl_initialized)
{
- if (dld_init(dld_find_executable(pg_pathname)))
+ if (dld_init(dld_find_executable(my_exec_path)))
return NULL;
/*
index a49c7f0bc30259382333b5e17e1261cf3d54855a..967b4a3d73d0b0e92aeb51cff1e89d12b108ab78 100644 (file)
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/port/dynloader/linux.c,v 1.27 2003年11月29日 19:51:54 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/port/dynloader/linux.c,v 1.28 2004年05月13日 22:45:02 momjian Exp $
*
*-------------------------------------------------------------------------
*/
*/
if (!dl_initialized)
{
- if (dld_init(dld_find_executable(pg_pathname)))
+ if (dld_init(dld_find_executable(my_exec_path)))
return NULL;
/*
index 2114707ad5f9a042bb6df9db1a23fce04eeee18d..7ab990335795e672f344d2e4839254bc237f5f22 100644 (file)
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/port/dynloader/ultrix4.c,v 1.19 2003年11月29日 19:51:54 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/port/dynloader/ultrix4.c,v 1.20 2004年05月13日 22:45:02 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#include "dl.h"
#include "utils/dynamic_loader.h"
-extern char pg_pathname[];
+extern char my_exec_path[];
void *
pg_dlopen(char *filename)
*/
if (!dl_initialized)
{
- if (!dl_init(pg_pathname))
+ if (!dl_init(my_exec_path))
return NULL;
/*
index 65a37fd6a38b0001a03ddd3ad4d16611dfb447aa..1c76fd97708764df04b3ad52d61eed42fdf97f57 100644 (file)
*
* Copyright (c) 2001-2003, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.68 2004年05月06日 19:23:25 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.69 2004年05月13日 22:45:02 momjian Exp $
* ----------
*/
#include "postgres.h"
@@ -487,7 +487,7 @@ pgstat_forkexec(STATS_PROCESS_TYPE procType)
/* + the pstat file names, and postgres pathname */
snprintf(pgstatBuf[bufc++],MAXPGPATH,"\"%s\"",pgStat_tmpfname);
snprintf(pgstatBuf[bufc++],MAXPGPATH,"\"%s\"",pgStat_fname);
- snprintf(pgstatBuf[bufc++],MAXPGPATH,"\"%s\"",pg_pathname);
+ snprintf(pgstatBuf[bufc++],MAXPGPATH,"\"%s\"",my_exec_path); /* used? */
snprintf(pgstatBuf[bufc++],MAXPGPATH,"\"%s\"",DataDir);
/* Add to the arg list */
@@ -500,9 +500,9 @@ pgstat_forkexec(STATS_PROCESS_TYPE procType)
/* Fire off execv in child */
#ifdef WIN32
- pid = win32_forkexec(pg_pathname,av);
+ pid = win32_forkexec(my_exec_path, av);
#else
- if ((pid = fork()) == 0 && (execv(pg_pathname,av) == -1))
+ if ((pid = fork()) == 0 && (execv(my_exec_path, av) == -1))
/* FIXME: [fork/exec] suggestions for what to do here? Can't call elog... */
abort();
#endif
pgStatPipe[0] = atoi(argv[argc++]);
pgStatPipe[1] = atoi(argv[argc++]);
MaxBackends = atoi(argv[argc++]);
- strncpy(pgStat_tmpfname,argv[argc++],MAXPGPATH);
- strncpy(pgStat_fname, argv[argc++],MAXPGPATH);
- strncpy(pg_pathname, argv[argc++],MAXPGPATH);
+ StrNCpy(pgStat_tmpfname,argv[argc++],MAXPGPATH);
+ StrNCpy(pgStat_fname, argv[argc++],MAXPGPATH);
+ StrNCpy(my_exec_path, argv[argc++],MAXPGPATH);
DataDir = strdup(argv[argc++]);
read_nondefault_variables();
index bd183739204c862dd9f1b07d5897d332112a4eb5..c9783560e13fe1c3b4e8721b42612653445d1f29 100644 (file)
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.385 2004年05月12日 13:38:39 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.386 2004年05月13日 22:45:02 momjian Exp $
*
* NOTES
*
/* Used to reduce macros tests */
#ifdef EXEC_BACKEND
const bool ExecBackend = true;
-
#else
const bool ExecBackend = false;
#endif
static void RandomSalt(char *cryptSalt, char *md5Salt);
static void SignalChildren(int signal);
static int CountChildren(void);
-static bool CreateOptsFile(int argc, char *argv[]);
+static bool CreateOptsFile(int argc, char *argv[], char *fullprogname);
NON_EXEC_STATIC void SSDataBaseInit(int xlop);
static pid_t SSDataBase(int xlop);
static void
__attribute__((format(printf, 1, 2)));
#ifdef EXEC_BACKEND
+
+static char postgres_exec_path[MAXPGPATH];
+
#ifdef WIN32
pid_t win32_forkexec(const char* path, char *argv[]);
@@ -323,7 +325,6 @@ static void ShmemBackendArrayRemove(pid_t pid);
#define StartBackgroundWriter() SSDataBase(BS_XLOG_BGWRITER)
#define ShutdownDataBase() SSDataBase(BS_XLOG_SHUTDOWN)
-
static void
checkDataDir(const char *checkdir)
{
/*
* On some systems our dynloader code needs the executable's pathname.
*/
- if (find_my_exec(pg_pathname, argv[0]) < 0)
+ if (find_my_exec(my_exec_path, argv[0]) < 0)
ereport(FATAL,
- (errmsg("%s: could not locate postgres executable",
+ (errmsg("%s: could not locate my own executable path",
progname)));
+#ifdef EXEC_BACKEND
+ if (find_other_exec(postgres_exec_path, argv[0], "postgres", PG_VERSIONSTR) < 0)
+ ereport(FATAL,
+ (errmsg("%s: could not locate postgres executable or non-matching version",
+ progname)));
+#endif
+
/*
* Initialize SSL library, if specified.
*/
* recording bogus options (eg, NBuffers too high for available
* memory).
*/
- if (!CreateOptsFile(argc, argv))
+ if (!CreateOptsFile(argc, argv, my_exec_path))
ExitPostmaster(1);
/*
Assert(ac <= lengthof(av));
#ifdef WIN32
- pid = win32_forkexec(pg_pathname,av); /* logs on error */
+ pid = win32_forkexec(postgres_exec_path, av); /* logs on error */
#else
/* Fire off execv in child */
- if ((pid = fork()) == 0 && (execv(pg_pathname,av) == -1))
+ if ((pid = fork()) == 0 && (execv(postgres_exec_path, av) == -1))
/*
* FIXME: [fork/exec] suggestions for what to do here?
* Probably OK to issue error (unlike pgstat case)
#ifdef EXEC_BACKEND
/* EXEC_BACKEND case; fork/exec here */
#ifdef WIN32
- pid = win32_forkexec(pg_pathname,av); /* logs on error */
+ pid = win32_forkexec(postgres_exec_path, av); /* logs on error */
#else
- if ((pid = fork()) == 0 && (execv(pg_pathname,av) == -1))
+ if ((pid = fork()) == 0 && (execv(postgres_exec_path, av) == -1))
{
/* in child */
- elog(ERROR,"unable to execv in SSDataBase: %m");
+ elog(ERROR,"unable to execv in SSDataBase: %m");
exit(0);
}
#endif
* Create the opts file
*/
static bool
-CreateOptsFile(int argc, char *argv[])
+CreateOptsFile(int argc, char *argv[], char *fullprogname)
{
- char fullprogname[MAXPGPATH];
char filename[MAXPGPATH];
FILE *fp;
int i;
- if (find_my_exec(fullprogname, argv[0]) < 0)
- {
- elog(LOG, "could not locate postmaster");
- return false;
- }
-
snprintf(filename, sizeof(filename), "%s/postmaster.opts", DataDir);
if ((fp = fopen(filename, "w")) == NULL)
index 4c006f00b8b00e4b7979ca037b78ee46131d3818..97c4d1dde166ab543b0283b39c32d522a5621ee1 100644 (file)
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.404 2004年05月12日 13:38:40 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.405 2004年05月13日 22:45:03 momjian Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@@ -2159,7 +2159,7 @@ PostgresMain(int argc, char *argv[], const char *username)
}
if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
{
- puts("postgres (PostgreSQL) " PG_VERSION);
+ puts(PG_VERSIONSTR);
exit(0);
}
}
@@ -2646,14 +2646,12 @@ PostgresMain(int argc, char *argv[], const char *username)
}
/*
- * On some systems our dynloader code needs the executable's
- * pathname. (If under postmaster, this was done already.)
+ * On some systems our dynloader code needs the executable's pathname.
*/
- if (find_my_exec(pg_pathname, argv[0]) < 0)
+ if (strlen(my_exec_path) == 0 && find_my_exec(my_exec_path, argv[0]) < 0)
ereport(FATAL,
(errmsg("%s: could not locate postgres executable",
argv[0])));
-
/*
* Validate we have been given a reasonable-looking DataDir (if
* under postmaster, assume postmaster did this already).
index 8bcf48b2f2780e95d966012e78b7742fd87cfd8a..356d45e62e4dc26419122e67766decb70b4b120a 100644 (file)
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/init/globals.c,v 1.84 2004年02月10日 03:42:45 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/init/globals.c,v 1.85 2004年05月13日 22:45:03 momjian Exp $
*
* NOTES
* Globals used all over the place should be declared here and not
char OutputFileName[MAXPGPATH];
-char pg_pathname[MAXPGPATH]; /* full path to postgres
- * executable */
+char my_exec_path[MAXPGPATH]; /* full path to postgres executable */
BackendId MyBackendId;
index fc312b3d74baafee9656be7851ae25e00ecb30b7..09f2cf2aa2480422d8bc71e3166c82df23ed2830 100644 (file)
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/miscadmin.h,v 1.157 2004年05月11日 21:57:15 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/miscadmin.h,v 1.158 2004年05月13日 22:45:04 momjian Exp $
*
* NOTES
* some of the information in this file should be moved to
@@ -124,6 +124,8 @@ extern void SubPostmasterMain(int argc, char* argv[]);
#endif
extern void ClosePostmasterPorts(bool pgstat_too);
+#define PG_VERSIONSTR "postgres (PostgreSQL) " PG_VERSION "\n"
+
/*
* from utils/init/globals.c
*/
extern long MyCancelKey;
extern char OutputFileName[];
-extern char pg_pathname[];
+extern char my_exec_path[];
/*
* done in storage/backendid.h for now.
index d7a95f495dfd775e2d42b7cc75b4b66572f70e6e..8810184a3777015cb6e097ccc2070316f3121933 100644 (file)
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/port/exec.c,v 1.3 2004年05月13日 01:47:12 momjian Exp $
+ * $PostgreSQL: pgsql/src/port/exec.c,v 1.4 2004年05月13日 22:45:04 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -184,7 +184,6 @@ find_my_exec(char *full_path, const char *argv0)
char *path,
*startp,
*endp;
- const char *binary_name = get_progname(argv0);
/*
* First try: use the binary that's located in the
@@ -192,24 +191,23 @@ find_my_exec(char *full_path, const char *argv0)
* Presumably the user used an explicit path because it
* wasn't in PATH, and we don't want to use incompatible executables.
*
- * This has the neat property that it works for installed binaries, old
- * source trees (obj/support/post{master,gres}) and new source
- * trees (obj/post{master,gres}) because they all put the two binaries
- * in the same place.
- *
- * for the binary: First try: if we're given some kind of path, use it
+ * For the binary: First try: if we're given some kind of path, use it
* (making sure that a relative path is made absolute before returning
* it).
*/
- if (argv0 && (p = last_path_separator(argv0)) && *++p)
+ /* Does argv0 have a separator? */
+ if (argv0 && (p = last_path_separator(argv0)))
{
+ if (*++p == '0円')
+ {
+ log_debug("argv[0] ends with a path separator \"%s\"", argv0);
+ return -1;
+ }
if (is_absolute_path(argv0) || !getcwd(buf, MAXPGPATH))
buf[0] = '0円';
- else
+ else /* path is not absolute and getcwd worked */
strcat(buf, "/");
strcat(buf, argv0);
- p = last_path_separator(buf);
- strcpy(++p, binary_name);
if (validate_exec(buf) == 0)
{
strncpy(full_path, buf, MAXPGPATH);
@@ -239,11 +237,11 @@ find_my_exec(char *full_path, const char *argv0)
*endp = '0円';
if (is_absolute_path(startp) || !getcwd(buf, MAXPGPATH))
buf[0] = '0円';
- else
+ else /* path is not absolute and getcwd worked */
strcat(buf, "/");
strcat(buf, startp);
strcat(buf, "/");
- strcat(buf, binary_name);
+ strcat(buf, argv0);
switch (validate_exec(buf))
{
case 0: /* found ok */
@@ -265,7 +263,7 @@ find_my_exec(char *full_path, const char *argv0)
free(path);
}
- log_debug("could not find a \"%s\" to execute", binary_name);
+ log_debug("could not find a \"%s\" to execute", argv0);
return -1;
}