From ca9540d34f0ad97c5659cac30aab8a016bd9868c Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Sun, 1 Aug 2004 06:19:26 +0000
Subject: [PATCH] Add docs for initdb --auth.

---
 configure                         |   5 -
 configure.in                      |   7 +-
 doc/src/sgml/ref/initdb.sgml      |  15 ++-
 src/Makefile.global.in            |   4 +-
 src/backend/commands/dbcommands.c |  11 +-
 src/bin/initdb/Makefile           |   7 +-
 src/bin/initdb/initdb.c           |  27 +----
 src/include/port.h                |   4 +-
 src/port/dirmod.c                 | 180 ++++++++++++++++++++++++++++--
 9 files changed, 201 insertions(+), 59 deletions(-)

diff --git a/configure b/configure
index f4c9f36c62a..066a857a49a 100755
--- a/configure
+++ b/configure
@@ -12063,11 +12063,6 @@ LIBOBJS="$LIBOBJS open.$ac_objext"
 LIBOBJS="$LIBOBJS rand.$ac_objext" ;;
 esac
 
-# Win32 can't do rename or unlink on an open file
-case $host_os in mingw*|cygwin*)
-LIBOBJS="$LIBOBJS dirmod.$ac_objext" ;;
-esac
-
 if test "$with_readline" = yes; then
   echo "$as_me:$LINENO: checking for rl_completion_append_character" >&5
 echo $ECHO_N "checking for rl_completion_append_character... $ECHO_C" >&6
diff --git a/configure.in b/configure.in
index e11c1a5dba9..fb221e6397b 100644
--- a/configure.in
+++ b/configure.in
@@ -1,5 +1,5 @@
 dnl Process this file with autoconf to produce a configure script.
-dnl $PostgreSQL: pgsql/configure.in,v 1.369 2004/07/20 20:37:13 momjian Exp $
+dnl $PostgreSQL: pgsql/configure.in,v 1.370 2004/08/01 06:19:16 momjian Exp $
 dnl
 dnl Developers, please strive to achieve this order:
 dnl
@@ -911,11 +911,6 @@ AC_LIBOBJ(open)
 AC_LIBOBJ(rand) ;;
 esac
 
-# Win32 can't do rename or unlink on an open file
-case $host_os in mingw*|cygwin*)
-AC_LIBOBJ(dirmod) ;;
-esac
-
 if test "$with_readline" = yes; then
   PGAC_VAR_RL_COMPLETION_APPEND_CHARACTER
   AC_CHECK_FUNCS([rl_completion_matches rl_filename_completion_function])
diff --git a/doc/src/sgml/ref/initdb.sgml b/doc/src/sgml/ref/initdb.sgml
index bc92cedd18b..10d65030e4f 100644
--- a/doc/src/sgml/ref/initdb.sgml
+++ b/doc/src/sgml/ref/initdb.sgml
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/initdb.sgml,v 1.31 2004/07/14 17:55:09 petere Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/initdb.sgml,v 1.32 2004/08/01 06:19:18 momjian Exp $
 PostgreSQL documentation
 -->
 
@@ -98,6 +98,19 @@ PostgreSQL documentation
 
    <para>
     <variablelist>
+     <varlistentry>
+      <term><option>-A <replaceable class="parameter">authmethod</replaceable></option></term>
+      <term><option>--auth=<replaceable class="parameter">authmethod</replaceable></option></term>
+      <listitem>
+       <para>
+        This option specifies the authentication method for local users
+        used in <filename>pg_hba.conf</>.  Do not use <literal>trust</>
+        unless you trust all local users on your system.  <literal>Trust</> 
+        is the default for ease of installation.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><option>-D <replaceable class="parameter">directory</replaceable></option></term>
       <term><option>--pgdata=<replaceable class="parameter">directory</replaceable></option></term>
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index 7ccf9b00efa..ab2d600174b 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -1,5 +1,5 @@
 # -*-makefile-*-
-# $PostgreSQL: pgsql/src/Makefile.global.in,v 1.190 2004/07/30 12:26:40 petere Exp $
+# $PostgreSQL: pgsql/src/Makefile.global.in,v 1.191 2004/08/01 06:19:19 momjian Exp $
 
 #------------------------------------------------------------------------------
 # All PostgreSQL makefiles include this file and use the variables it sets,
@@ -347,7 +347,7 @@ endif
 #
 # substitute implementations of the C library
 
-LIBOBJS = @LIBOBJS@ exec.o noblock.o path.o pipe.o pgsleep.o pgstrcasecmp.o sprompt.o thread.o
+LIBOBJS = @LIBOBJS@ dirmod.o exec.o noblock.o path.o pipe.o pgsleep.o pgstrcasecmp.o sprompt.o thread.o
 
 ifneq (,$(LIBOBJS))
 LIBS := -lpgport $(LIBS)
diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c
index b9e8c836274..bacf5aa31af 100644
--- a/src/backend/commands/dbcommands.c
+++ b/src/backend/commands/dbcommands.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.137 2004/06/25 21:55:53 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.138 2004/08/01 06:19:22 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -915,7 +915,6 @@ remove_dbtablespaces(Oid db_id)
 	Relation rel;
 	HeapScanDesc scan;
 	HeapTuple tuple;
-	char buf[MAXPGPATH + 100];
 
 	rel = heap_openr(TableSpaceRelationName, AccessShareLock);
 	scan = heap_beginscan(rel, SnapshotNow, 0, NULL);
@@ -938,17 +937,11 @@ remove_dbtablespaces(Oid db_id)
 			continue;
 		}
 
-#ifndef WIN32
-		snprintf(buf, sizeof(buf), "rm -rf '%s'", dstpath);
-#else
-		snprintf(buf, sizeof(buf), "rmdir /s /q \"%s\"", dstpath);
-#endif
-		if (system(buf) != 0)
+		if (!rmtree(dstpath, true))
 		{
 			ereport(WARNING,
 				(errmsg("could not remove database directory \"%s\"",
 						dstpath),
-				 errdetail("Failing system command was: %s", buf),
 				 errhint("Look in the postmaster's stderr log for more information.")));
 		}
 
diff --git a/src/bin/initdb/Makefile b/src/bin/initdb/Makefile
index 82f3a8ba41b..fbfcf9833d6 100644
--- a/src/bin/initdb/Makefile
+++ b/src/bin/initdb/Makefile
@@ -5,7 +5,7 @@
 # Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
 # Portions Copyright (c) 1994, Regents of the University of California
 #
-# $PostgreSQL: pgsql/src/bin/initdb/Makefile,v 1.41 2004/05/24 01:01:37 momjian Exp $
+# $PostgreSQL: pgsql/src/bin/initdb/Makefile,v 1.42 2004/08/01 06:19:23 momjian Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -15,13 +15,16 @@ include $(top_builddir)/src/Makefile.global
 
 override CPPFLAGS := -DFRONTEND -I$(libpq_srcdir) $(CPPFLAGS)
 
-OBJS=	initdb.o exec.o
+OBJS=	initdb.o dirmod.o exec.o
 
 all: submake-libpq submake-libpgport initdb
 
 initdb: $(OBJS) $(libpq_builddir)/libpq.a
 	$(CC) $(CFLAGS) $(OBJS) $(libpq) $(LDFLAGS) $(LIBS) -o $@$(X)
 
+dirmod.c: % : $(top_srcdir)/src/port/%
+	rm -f $@ && $(LN_S) $< .
+
 exec.c: % : $(top_srcdir)/src/port/%
 	rm -f $@ && $(LN_S) $< .
 
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index cd830ecda7a..55b782004c4 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -39,7 +39,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  * Portions taken from FreeBSD.
  *
- * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.45 2004/08/01 05:59:13 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.46 2004/08/01 06:19:23 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -146,7 +146,6 @@ char	   backend_exec[MAXPGPATH];
 
 static void *xmalloc(size_t size);
 static char *xstrdup(const char *s);
-static bool rmtree(char *path, bool rmtopdir);
 static char **replace_token(char **lines, char *token, char *replacement);
 static char **readfile(char *path);
 static void writefile(char *path, char **lines);
@@ -251,30 +250,6 @@ xstrdup(const char *s)
 	return result;
 }
 
-/*
- * delete a directory tree recursively
- * assumes path points to a valid directory
- * deletes everything under path
- * if rmtopdir is true deletes the directory too
- */
-static bool
-rmtree(char *path, bool rmtopdir)
-{
-	char		buf[MAXPGPATH + 64];
-
-#ifndef WIN32
-	/* doesn't handle .* files, but we don't make any... */
-	snprintf(buf, sizeof(buf), "rm -rf \"%s\"%s", path,
-			 rmtopdir ? "" : "/*");
-#else
-	snprintf(buf, sizeof(buf), "%s /s /q \"%s\"",
-			 rmtopdir ? "rmdir" : "del", path);
-#endif
-
-	return !system(buf);
-}
-
-
 /*
  * make a copy of the array of lines, with token replaced by replacement
  * the first time it occurs on each line.
diff --git a/src/include/port.h b/src/include/port.h
index 9869674a362..ac3634e0eef 100644
--- a/src/include/port.h
+++ b/src/include/port.h
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/port.h,v 1.45 2004/07/23 01:58:36 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/port.h,v 1.46 2004/08/01 06:19:24 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -148,6 +148,8 @@ extern int	pgunlink(const char *path);
 #define unlink(path)		pgunlink(path)
 #endif
 
+extern bool rmtree(char *path, bool rmtopdir);
+
 #ifdef WIN32
 
 /* open() replacement to allow delete of held files */
diff --git a/src/port/dirmod.c b/src/port/dirmod.c
index a0ab8a7a938..912a0c1ca8e 100644
--- a/src/port/dirmod.c
+++ b/src/port/dirmod.c
@@ -10,21 +10,28 @@
  *	Win32 (NT, Win2k, XP).	replace() doesn't work on Win95/98/Me.
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/port/dirmod.c,v 1.12 2004/02/26 02:59:26 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/port/dirmod.c,v 1.13 2004/08/01 06:19:26 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 
-#ifndef TEST_VERSION
-
-#if defined(WIN32) || defined(__CYGWIN__)
-
-
 #ifndef FRONTEND
 #include "postgres.h"
 #else
 #include "postgres_fe.h"
 #endif
+
+#include <unistd.h>
+#include <dirent.h>
+#include <sys/stat.h>
+
+#define _(x) gettext((x))
+
+#ifndef TEST_VERSION
+
+#if defined(WIN32) || defined(__CYGWIN__)
+
+
 #include "miscadmin.h"
 
 #undef rename
@@ -82,7 +89,7 @@ pgunlink(const char *path)
 		if (errno != EACCES)
 			/* set errno? */
 			return -1;
-		pg_usleep(100000);				/* us */
+		pg_usleep(100000);		/* us */
 		if (loops == 30)
 #ifndef FRONTEND
 			elog(LOG, "could not unlink \"%s\", continuing to try",
@@ -105,6 +112,165 @@ pgunlink(const char *path)
 
 #endif
 
+#if defined(WIN32) || defined(__CYGWIN__)
+#define rmt_unlink(path) pgunlink(path)
+#else
+#define rmt_unlink(path) unlink(path)
+#endif
+
+#ifdef FRONTEND
+
+static void *
+xmalloc(size_t size)
+{
+    void       *result;
+
+    result = malloc(size);
+    if (!result)
+    {
+        fprintf(stderr, _("out of memory\n"));
+        exit(1);
+    }
+    return result;
+}
+
+static char *
+xstrdup(const char *s)
+{
+    char       *result;
+
+    result = strdup(s);
+    if (!result)
+    {
+        fprintf(stderr, _("out of memory\n"));
+        exit(1);
+    }
+    return result;
+}
+
+#define xfree(n) free(n)
+
+#else
+
+/* on the backend, use palloc and friends */
+
+#define xmalloc(n)	palloc(n)
+#define xstrdup(n)	pstrdup(n)
+#define xfree(n)	pfree(n)
+
+#endif
+
+/*
+ * deallocate memory used for filenames
+ */
+
+static void
+rmt_cleanup(char ** filenames)
+{
+	char ** fn;
+
+	for (fn = filenames; *fn; fn++)
+		xfree(*fn);
+
+	xfree(filenames);
+}
+
+
+
+/*
+ * delete a directory tree recursively
+ * assumes path points to a valid directory
+ * deletes everything under path
+ * if rmtopdir is true deletes the directory too
+ *
+ */
+
+bool
+rmtree(char *path, bool rmtopdir)
+{
+	char		filepath[MAXPGPATH];
+	DIR		   *dir;
+	struct dirent *file;
+	char	  **filenames;
+	char	  **filename;
+	int			numnames = 0;
+	struct stat statbuf;
+
+	/*
+	 * we copy all the names out of the directory before we start
+	 * modifying it.
+	 */
+
+	dir = opendir(path);
+	if (dir == NULL)
+		return false;
+
+	while ((file = readdir(dir)) != NULL)
+	{
+		if (strcmp(file->d_name, ".") != 0 && strcmp(file->d_name, "..") != 0)
+			numnames++;
+	}
+
+	rewinddir(dir);
+
+	filenames = xmalloc((numnames + 2) * sizeof(char *));
+	numnames = 0;
+
+	while ((file = readdir(dir)) != NULL)
+	{
+		if (strcmp(file->d_name, ".") != 0 && strcmp(file->d_name, "..") != 0)
+			filenames[numnames++] = xstrdup(file->d_name);
+	}
+
+	filenames[numnames] = NULL;
+
+	closedir(dir);
+
+	/* now we have the names we can start removing things */
+
+	for (filename = filenames; *filename; filename++)
+	{
+		snprintf(filepath, MAXPGPATH, "%s/%s", path, *filename);
+
+		if (stat(filepath, &statbuf) != 0)
+		{
+			rmt_cleanup(filenames);
+			return false;
+		}
+
+		if (S_ISDIR(statbuf.st_mode))
+		{
+			/* call ourselves recursively for a directory */
+			if (!rmtree(filepath, true))
+			{
+				rmt_cleanup(filenames);
+				return false;
+			}
+		}
+		else
+		{
+			if (rmt_unlink(filepath) != 0)
+			{
+				rmt_cleanup(filenames);
+				return false;
+			}
+		}
+	}
+
+	if (rmtopdir)
+	{
+		if (rmdir(path) != 0)
+		{
+			rmt_cleanup(filenames);
+			return false;
+		}
+	}
+
+	rmt_cleanup(filenames);
+	return true;
+}
+
+
 #else
 
 
-- 
GitLab