diff options
Diffstat (limited to 'src/backend/postmaster/postmaster.c')
-rw-r--r-- | src/backend/postmaster/postmaster.c | 71 |
1 files changed, 56 insertions, 15 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index f27a83e1f88..9f7aef1a93f 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.577 2009/04/05 04:19:58 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.578 2009/05/02 22:02:37 tgl Exp $ * * NOTES * @@ -315,6 +315,7 @@ extern int optreset; /* might not be declared by system headers */ /* * postmaster.c - function prototypes */ +static void getInstallationPaths(const char *argv0); static void checkDataDir(void); #ifdef USE_BONJOUR @@ -493,11 +494,8 @@ PostmasterMain(int argc, char *argv[]) ALLOCSET_DEFAULT_MAXSIZE); MemoryContextSwitchTo(PostmasterContext); - if (find_my_exec(argv[0], my_exec_path) < 0) - elog(FATAL, "%s: could not locate my own executable path", - argv[0]); - - get_pkglib_path(my_exec_path, pkglib_path); + /* Initialize paths to installation files */ + getInstallationPaths(argv[0]); /* * Options setup @@ -690,15 +688,6 @@ PostmasterMain(int argc, char *argv[]) ExitPostmaster(1); } -#ifdef EXEC_BACKEND - /* Locate executable backend before we change working directory */ - if (find_other_exec(argv[0], "postgres", PG_BACKEND_VERSIONSTR, - postgres_exec_path) < 0) - ereport(FATAL, - (errmsg("%s: could not locate matching postgres executable", - progname))); -#endif - /* * Locate the proper configuration files and data directory, and read * postgresql.conf for the first time. @@ -1063,6 +1052,58 @@ PostmasterMain(int argc, char *argv[]) /* + * Compute and check the directory paths to files that are part of the + * installation (as deduced from the postgres executable's own location) + */ +static void +getInstallationPaths(const char *argv0) +{ + DIR *pdir; + + /* Locate the postgres executable itself */ + if (find_my_exec(argv0, my_exec_path) < 0) + elog(FATAL, "%s: could not locate my own executable path", argv0); + +#ifdef EXEC_BACKEND + /* Locate executable backend before we change working directory */ + if (find_other_exec(argv0, "postgres", PG_BACKEND_VERSIONSTR, + postgres_exec_path) < 0) + ereport(FATAL, + (errmsg("%s: could not locate matching postgres executable", + argv0))); +#endif + + /* + * Locate the pkglib directory --- this has to be set early in case we try + * to load any modules from it in response to postgresql.conf entries. + */ + get_pkglib_path(my_exec_path, pkglib_path); + + /* + * Verify that there's a readable directory there; otherwise the + * Postgres installation is incomplete or corrupt. (A typical cause + * of this failure is that the postgres executable has been moved or + * hardlinked to some directory that's not a sibling of the installation + * lib/ directory.) + */ + pdir = AllocateDir(pkglib_path); + if (pdir == NULL) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open directory \"%s\": %m", + pkglib_path), + errhint("This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location.", + my_exec_path))); + FreeDir(pdir); + + /* + * XXX is it worth similarly checking the share/ directory? If the + * lib/ directory is there, then share/ probably is too. + */ +} + + +/* * Validate the proposed data directory */ static void |