From: Bruce Momjian Date: Thu, 13 May 2004 22:45:04 +0000 (+0000) Subject: Reorganize backend code to more cleanly manage executable names and X-Git-Tag: REL8_0_0BETA1~647 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f69ecb4f8cbf0f1d1638f9fb01d8845a5c84a3c0;p=postgresql Reorganize backend code to more cleanly manage executable names and backend startup. --- diff --git a/src/backend/port/beos/support.c b/src/backend/port/beos/support.c index 6a31adad57..86053d79c0 100644 --- a/src/backend/port/beos/support.c +++ b/src/backend/port/beos/support.c @@ -16,7 +16,7 @@ port_id beos_dl_port_out = 0; 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 @@ -50,7 +50,7 @@ beos_dl_open(char *filename) 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); diff --git a/src/backend/port/dynloader/bsdi.c b/src/backend/port/dynloader/bsdi.c index e2ad50d284..af72ef9f07 100644 --- a/src/backend/port/dynloader/bsdi.c +++ b/src/backend/port/dynloader/bsdi.c @@ -11,14 +11,14 @@ * * * 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) @@ -31,7 +31,7 @@ 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; /* diff --git a/src/backend/port/dynloader/linux.c b/src/backend/port/dynloader/linux.c index a49c7f0bc3..967b4a3d73 100644 --- a/src/backend/port/dynloader/linux.c +++ b/src/backend/port/dynloader/linux.c @@ -11,7 +11,7 @@ * * * 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 $ * *------------------------------------------------------------------------- */ @@ -43,7 +43,7 @@ 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; /* diff --git a/src/backend/port/dynloader/ultrix4.c b/src/backend/port/dynloader/ultrix4.c index 2114707ad5..7ab9903357 100644 --- a/src/backend/port/dynloader/ultrix4.c +++ b/src/backend/port/dynloader/ultrix4.c @@ -8,7 +8,7 @@ * * * 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 $ * *------------------------------------------------------------------------- */ @@ -17,7 +17,7 @@ #include "dl.h" #include "utils/dynamic_loader.h" -extern char pg_pathname[]; +extern char my_exec_path[]; void * pg_dlopen(char *filename) @@ -31,7 +31,7 @@ pg_dlopen(char *filename) */ if (!dl_initialized) { - if (!dl_init(pg_pathname)) + if (!dl_init(my_exec_path)) return NULL; /* diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 65a37fd6a3..1c76fd9770 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -13,7 +13,7 @@ * * 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 @@ -530,9 +530,9 @@ pgstat_parseArgs(PGSTAT_FORK_ARGS) 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(); diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index bd18373920..c9783560e1 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -37,7 +37,7 @@ * * * 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 * @@ -181,7 +181,6 @@ static int ListenSocket[MAXLISTEN]; /* Used to reduce macros tests */ #ifdef EXEC_BACKEND const bool ExecBackend = true; - #else const bool ExecBackend = false; #endif @@ -286,7 +285,7 @@ static long PostmasterRandom(void); 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 @@ -295,6 +294,9 @@ postmaster_error(const char *fmt,...) __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) { @@ -692,11 +693,18 @@ PostmasterMain(int argc, char *argv[]) /* * 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. */ @@ -852,7 +860,7 @@ PostmasterMain(int argc, char *argv[]) * recording bogus options (eg, NBuffers too high for available * memory). */ - if (!CreateOptsFile(argc, argv)) + if (!CreateOptsFile(argc, argv, my_exec_path)) ExitPostmaster(1); /* @@ -2754,10 +2762,10 @@ Backend_forkexec(Port *port) 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) @@ -3116,12 +3124,12 @@ SSDataBase(int xlop) #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 @@ -3215,19 +3223,12 @@ SSDataBase(int xlop) * 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) diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 4c006f00b8..97c4d1dde1 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -8,7 +8,7 @@ * * * 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). diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c index 8bcf48b2f2..356d45e62e 100644 --- a/src/backend/utils/init/globals.c +++ b/src/backend/utils/init/globals.c @@ -8,7 +8,7 @@ * * * 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 @@ -45,8 +45,7 @@ char *DataDir = NULL; char OutputFileName[MAXPGPATH]; -char pg_pathname[MAXPGPATH]; /* full path to postgres - * executable */ +char my_exec_path[MAXPGPATH]; /* full path to postgres executable */ BackendId MyBackendId; diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index fc312b3d74..09f2cf2aa2 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -13,7 +13,7 @@ * 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 */ @@ -140,7 +142,7 @@ extern struct Port *MyProcPort; extern long MyCancelKey; extern char OutputFileName[]; -extern char pg_pathname[]; +extern char my_exec_path[]; /* * done in storage/backendid.h for now. diff --git a/src/port/exec.c b/src/port/exec.c index d7a95f495d..8810184a37 100644 --- a/src/port/exec.c +++ b/src/port/exec.c @@ -7,7 +7,7 @@ * * * 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; }