From abfb41757405b74e175fb8e6bf632b270de523dc Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sat, 4 Nov 2000 12:43:24 +0000 Subject: [PATCH] Make the backend grok relative paths for the data directory by converting it to an absolute path. --- src/backend/bootstrap/bootstrap.c | 29 +++++++++------ src/backend/postmaster/postmaster.c | 28 +++++++------- src/backend/tcop/postgres.c | 34 +++++++++-------- src/backend/utils/init/miscinit.c | 58 ++++++++++++++++++++++++++++- src/include/miscadmin.h | 4 +- 5 files changed, 111 insertions(+), 42 deletions(-) diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index aab0c21230..de4cc3dd99 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -8,10 +8,12 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.95 2000/10/24 09:56:09 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.96 2000/11/04 12:43:23 petere Exp $ * *------------------------------------------------------------------------- */ +#include "postgres.h" + #include #include #include @@ -19,7 +21,6 @@ #define BOOTSTRAP_INCLUDE /* mask out stuff in tcop/tcopprot.h */ -#include "postgres.h" #ifdef HAVE_GETOPT_H #include #endif @@ -220,6 +221,7 @@ BootstrapMain(int argc, char *argv[]) char *dbName; int flag; bool xloginit = false; + char *potential_DataDir = NULL; extern int optind; extern char *optarg; @@ -255,7 +257,7 @@ BootstrapMain(int argc, char *argv[]) if (!IsUnderPostmaster) { ResetAllOptions(); - DataDir = getenv("PGDATA"); /* Null if no PGDATA variable */ + potential_DataDir = getenv("PGDATA"); /* Null if no PGDATA variable */ } while ((flag = getopt(argc, argv, "D:dCQxpB:F")) != EOF) @@ -263,7 +265,7 @@ BootstrapMain(int argc, char *argv[]) switch (flag) { case 'D': - DataDir = optarg; + potential_DataDir = optarg; break; case 'd': DebugMode = true; /* print out debugging info while @@ -301,15 +303,20 @@ BootstrapMain(int argc, char *argv[]) SetProcessingMode(BootstrapProcessing); IgnoreSystemIndexes(true); - if (!DataDir) + if (!IsUnderPostmaster) { - fprintf(stderr, "%s does not know where to find the database system " - "data. You must specify the directory that contains the " - "database system either by specifying the -D invocation " - "option or by setting the PGDATA environment variable.\n\n", - argv[0]); - proc_exit(1); + if (!potential_DataDir) + { + fprintf(stderr, "%s does not know where to find the database system " + "data. You must specify the directory that contains the " + "database system either by specifying the -D invocation " + "option or by setting the PGDATA environment variable.\n\n", + argv[0]); + proc_exit(1); + } + SetDataDir(potential_DataDir); } + Assert(DataDir); if (dbName == NULL) { diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index eb7daeb7db..060b0e5ef4 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.177 2000/11/01 21:14:02 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.178 2000/11/04 12:43:23 petere Exp $ * * NOTES * @@ -268,12 +268,12 @@ extern void GetCharSetByHost(char *, int, char *); static void -checkDataDir(const char *DataDir) +checkDataDir(const char *checkdir) { char path[MAXPGPATH]; FILE *fp; - if (DataDir == NULL) + if (checkdir == NULL) { fprintf(stderr, "%s does not know where to find the database system " "data. You must specify the directory that contains the " @@ -285,10 +285,10 @@ checkDataDir(const char *DataDir) #ifdef OLD_FILE_NAMING snprintf(path, sizeof(path), "%s%cbase%ctemplate1%cpg_class", - DataDir, SEP_CHAR, SEP_CHAR, SEP_CHAR); + checkdir, SEP_CHAR, SEP_CHAR, SEP_CHAR); #else snprintf(path, sizeof(path), "%s%cbase%c%u%c%u", - DataDir, SEP_CHAR, SEP_CHAR, + checkdir, SEP_CHAR, SEP_CHAR, TemplateDbOid, SEP_CHAR, RelOid_pg_class); #endif @@ -298,13 +298,13 @@ checkDataDir(const char *DataDir) fprintf(stderr, "%s does not find the database system." "\n\tExpected to find it in the PGDATA directory \"%s\"," "\n\tbut unable to open file \"%s\": %s\n\n", - progname, DataDir, path, strerror(errno)); + progname, checkdir, path, strerror(errno)); exit(2); } FreeFile(fp); - ValidatePgVersion(DataDir); + ValidatePgVersion(checkdir); } @@ -314,6 +314,7 @@ PostmasterMain(int argc, char *argv[]) int opt; int status; char original_extraoptions[MAXPGPATH]; + char *potential_DataDir = NULL; IsUnderPostmaster = true; /* so that backends know this */ @@ -353,8 +354,7 @@ PostmasterMain(int argc, char *argv[]) /* * Options setup */ - if (getenv("PGDATA")) - DataDir = strdup(getenv("PGDATA")); /* default value */ + potential_DataDir = getenv("PGDATA"); /* default value */ ResetAllOptions(); @@ -377,9 +377,7 @@ PostmasterMain(int argc, char *argv[]) switch(opt) { case 'D': - if (DataDir) - free(DataDir); - DataDir = strdup(optarg); + potential_DataDir = optarg; break; case '-': @@ -415,12 +413,14 @@ PostmasterMain(int argc, char *argv[]) } } - optind = 1; /* start over */ - checkDataDir(DataDir); /* issues error messages */ + checkDataDir(potential_DataDir); /* issues error messages */ + SetDataDir(potential_DataDir); ProcessConfigFile(PGC_POSTMASTER); IgnoreSystemIndexes(false); + + optind = 1; /* start over */ while ((opt = getopt(argc, argv, "A:a:B:b:D:d:Film:MN:no:p:Ss-:?")) != EOF) { switch (opt) diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index b024d604dc..29192686e6 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.184 2000/10/28 18:27:56 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.185 2000/11/04 12:43:24 petere Exp $ * * NOTES * this is the "main" module of the postgres backend and @@ -29,7 +29,7 @@ #include #if HAVE_SYS_SELECT_H #include -#endif /* aix */ +#endif #include #include #include @@ -1058,6 +1058,8 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha char *remote_host; unsigned short remote_port; + char *potential_DataDir = NULL; + extern int optind; extern char *optarg; extern int DebugLvl; @@ -1082,8 +1084,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha if (!IsUnderPostmaster) { ResetAllOptions(); - if (getenv("PGDATA")) - DataDir = strdup(getenv("PGDATA")); + potential_DataDir = getenv("PGDATA"); } StatFp = stderr; @@ -1142,9 +1143,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha case 'D': /* PGDATA directory */ if (secure) { - if (DataDir) - free(DataDir); - DataDir = strdup(optarg); + potential_DataDir = optarg; } break; @@ -1429,15 +1428,20 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha Show_query_stats = false; } - if (!DataDir) + if (!IsUnderPostmaster) { - fprintf(stderr, "%s does not know where to find the database system " - "data. You must specify the directory that contains the " - "database system either by specifying the -D invocation " - "option or by setting the PGDATA environment variable.\n\n", - argv[0]); - proc_exit(1); + if (!potential_DataDir) + { + fprintf(stderr, "%s does not know where to find the database system " + "data. You must specify the directory that contains the " + "database system either by specifying the -D invocation " + "option or by setting the PGDATA environment variable.\n\n", + argv[0]); + proc_exit(1); + } + SetDataDir(potential_DataDir); } + Assert(DataDir); /* * 1. Set BlockSig and UnBlockSig masks. 2. Set up signal handlers. 3. @@ -1631,7 +1635,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha if (!IsUnderPostmaster) { puts("\nPOSTGRES backend interactive interface "); - puts("$Revision: 1.184 $ $Date: 2000/10/28 18:27:56 $\n"); + puts("$Revision: 1.185 $ $Date: 2000/11/04 12:43:24 $\n"); } /* diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 0974a05715..026f2cc811 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.55 2000/09/19 18:17:57 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.56 2000/11/04 12:43:24 petere Exp $ * *------------------------------------------------------------------------- */ @@ -366,6 +366,62 @@ GetUserName(Oid userid) +/*------------------------------------------------------------------------- + * Set data directory, but make sure it's an absolute path. Use this, + * never set DataDir directly. + *------------------------------------------------------------------------- + */ +void +SetDataDir(const char *dir) +{ + char *new; + + AssertArg(dir); + if (DataDir) + free(DataDir); + + if (dir[0] != '/') + { + char *buf; + size_t buflen; + + buflen = MAXPGPATH; + for (;;) + { + buf = malloc(buflen); + if (!buf) + elog(FATAL, "out of memory"); + + if (getcwd(buf, buflen)) + break; + else if (errno == ERANGE) + { + free(buf); + buflen *= 2; + continue; + } + else + { + free(buf); + elog(FATAL, "cannot get current working directory: %m"); + } + } + + new = malloc(strlen(buf) + 1 + strlen(dir) + 1); + sprintf(new, "%s/%s", buf, dir); + } + else + { + new = strdup(dir); + } + + if (!new) + elog(FATAL, "out of memory"); + DataDir = new; +} + + + /*------------------------------------------------------------------------- * * postmaster pid file stuffs. $DATADIR/postmaster.pid is created when: diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index fcced217ef..6e6436d152 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -12,7 +12,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: miscadmin.h,v 1.68 2000/10/08 09:25:38 ishii Exp $ + * $Id: miscadmin.h,v 1.69 2000/11/04 12:43:24 petere Exp $ * * NOTES * some of the information in this file will be moved to @@ -137,6 +137,8 @@ extern Oid GetSessionUserId(void); extern void SetSessionUserId(Oid userid); extern void SetSessionUserIdFromUserName(const char *username); +extern void SetDataDir(const char *dir); + extern int FindExec(char *full_path, const char *argv0, const char *binary_name); extern int CheckPathAccess(char *path, char *name, int open_mode); -- 2.40.0