From 861a679fc131a7c75d3ac7a23728f02ff1c8ec03 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 19 Oct 2001 18:19:41 +0000 Subject: [PATCH] Set optreset on platforms that have it before launching postmaster subprocesses; perhaps this will fix portability problem just noted by Lockhart. Also, move test for bad permissions of DataDir to a more logical place. --- src/backend/postmaster/postmaster.c | 31 ++++++++++++++++++++++++++--- src/backend/tcop/postgres.c | 6 ++---- src/backend/utils/init/miscinit.c | 14 +------------ 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 024f62de01..635880136c 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -37,7 +37,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.247 2001/10/19 17:03:08 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.248 2001/10/19 18:19:41 tgl Exp $ * * NOTES * @@ -275,6 +275,7 @@ checkDataDir(const char *checkdir) { char path[MAXPGPATH]; FILE *fp; + struct stat stat_buf; if (checkdir == NULL) { @@ -286,6 +287,22 @@ checkDataDir(const char *checkdir) progname); ExitPostmaster(2); } + + /* + * Check if the directory has group or world access. If so, reject. + */ + if (stat(checkdir, &stat_buf) == -1) + { + if (errno == ENOENT) + elog(FATAL, "data directory %s was not found", checkdir); + else + elog(FATAL, "could not read permissions of directory %s: %m", + checkdir); + } + + if (stat_buf.st_mode & (S_IRWXG | S_IRWXO)) + elog(FATAL, "data directory %s has group or world access; permissions should be u=rwx (0700)", + checkdir); /* Look for PG_VERSION before looking for pg_control */ ValidatePgVersion(checkdir); @@ -421,7 +438,7 @@ PostmasterMain(int argc, char *argv[]) IgnoreSystemIndexes(false); - optind = 1; /* start over */ + optind = 1; /* start over (should be redundant here) */ #ifdef HAVE_INT_OPTRESET optreset = 1; #endif @@ -2162,6 +2179,11 @@ DoBackend(Port *port) av[ac] = (char *) NULL; + optind = 1; /* reset getopt(3) for subprocess */ +#ifdef HAVE_INT_OPTRESET + optreset = 1; +#endif + /* * Release postmaster's working memory context so that backend can * recycle the space. Note this does not trash *MyProcPort, because @@ -2451,7 +2473,10 @@ SSDataBase(int xlop) av[ac] = (char *) NULL; - optind = 1; + optind = 1; /* reset getopt(3) for subprocess */ +#ifdef HAVE_INT_OPTRESET + optreset = 1; +#endif BootstrapMain(ac, av); ExitPostmaster(0); diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 95d4b9e8c1..e2f8662933 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.236 2001/10/19 17:03:08 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.237 2001/10/19 18:19:41 tgl Exp $ * * NOTES * this is the "main" module of the postgres backend and @@ -1192,8 +1192,6 @@ PostgresMain(int argc, char *argv[], secure = true; ctx = PGC_POSTMASTER; - optind = 1; /* reset after postmaster's usage */ - while ((flag = getopt(argc, argv, "A:B:c:CD:d:Eef:FiNOPo:p:S:st:v:W:x:-:")) != EOF) switch (flag) { @@ -1651,7 +1649,7 @@ PostgresMain(int argc, char *argv[], if (!IsUnderPostmaster) { puts("\nPOSTGRES backend interactive interface "); - puts("$Revision: 1.236 $ $Date: 2001/10/19 17:03:08 $\n"); + puts("$Revision: 1.237 $ $Date: 2001/10/19 18:19:41 $\n"); } /* diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 2513d74f76..fc8b6b3ed7 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.79 2001/10/19 17:03:08 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.80 2001/10/19 18:19:41 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -120,7 +120,6 @@ void SetDataDir(const char *dir) { char *new; - struct stat stat_buf; AssertArg(dir); @@ -163,17 +162,6 @@ SetDataDir(const char *dir) if (!new) elog(FATAL, "out of memory"); } - - /* - * Check if the directory has group or world access. If so, reject. - */ - if (stat(new, &stat_buf) == -1) - elog(FATAL, "could not read permissions of directory %s: %s", - new, strerror(errno)); - - if (stat_buf.st_mode & (S_IRWXG | S_IRWXO)) - elog(FATAL, "data directory %s has group or world access; permissions should be u=rwx (0700)", - new); if (DataDir) free(DataDir); -- 2.40.0