diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 024f62de01907c3c8601e795d592daced1d6551c..635880136c1232817aaeb72e24ea52e2511d89b7 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 95d4b9e8c15c5eeb5be14e7beaf1ae2b380e3995..e2f8662933551f5281a734619a39992d21201eb5 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 2513d74f763f190bb9e20aac52dea66e5ac845b9..fc8b6b3ed789e3fd1827e9a30d66270a34419f3c 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);