diff --git a/doc/src/sgml/ref/initdb.sgml b/doc/src/sgml/ref/initdb.sgml
index 189a42797787e3068a3027d54249ef97429fbc7f..7cd0e699a987f2d332ebaf9d49f655fcfa9f98aa 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.29 2004/03/23 02:47:35 neilc Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/initdb.sgml,v 1.30 2004/06/24 19:26:54 tgl Exp $
 PostgreSQL documentation
 -->
 
@@ -185,6 +185,16 @@ PostgreSQL documentation
        </para>
       </listitem>
      </varlistentry>
+
+     <varlistentry>
+      <term><option>--pwfile=<replaceable>filename</></option></term>
+      <listitem>
+       <para>
+        Makes <command>initdb</command> read the database superuser's password
+        from a file.  The first line of the file is taken as the password.
+       </para>
+      </listitem>
+     </varlistentry>
     </variablelist>
    </para>
 
diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml
index 59d59a5e6f0b6e00e409755c47c435450078f4f3..ae312e01c37a67e184f8f15976f0d71768f0cf12 100644
--- a/doc/src/sgml/runtime.sgml
+++ b/doc/src/sgml/runtime.sgml
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.266 2004/06/10 22:26:17 momjian Exp $
+$PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.267 2004/06/24 19:26:55 tgl Exp $
 -->
 
 <Chapter Id="runtime">
@@ -121,9 +121,9 @@ postgres$ <userinput>initdb -D /usr/local/pgsql/data</userinput>
    However, while the directory contents are secure, the default
    client authentication setup allows any local user to connect to the
    database and even become the database superuser. If you do not
-   trust other local users, we recommend you use
-   <command>initdb</command>'s <option>-W</option> or
-   <option>--pwprompt</option> option to assign a password to the
+   trust other local users, we recommend you use one of
+   <command>initdb</command>'s <option>-W</option>, <option>--pwprompt</option>
+   or <option>--pwfile</option> option to assign a password to the
    database superuser.<indexterm><primary>password</><secondary>of the
    superuser</></indexterm> After <command>initdb</command>, modify
    the <filename>pg_hba.conf</filename> file to use <literal>md5</> or
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index ab49c02bb2a51029ebd93bedf66e1a7e4fb60899..11bc08ed977b8626d9cf0578247b3feddaeb5854 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.39 2004/06/21 01:04:44 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.40 2004/06/24 19:26:59 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -84,6 +84,7 @@ char	   *lc_time = "";
 char	   *lc_messages = "";
 char	   *username = "";
 bool		pwprompt = false;
+char       *pwfilename = NULL;
 bool		debug = false;
 bool		noclean = false;
 bool		show_setting = false;
@@ -1076,15 +1077,55 @@ get_set_pwd(void)
 	char		pwdpath[MAXPGPATH];
 	struct stat statbuf;
 
-	pwd1 = simple_prompt("Enter new superuser password: ", 100, false);
-	pwd2 = simple_prompt("Enter it again: ", 100, false);
-	if (strcmp(pwd1, pwd2) != 0)
+	if (pwprompt)
 	{
-		fprintf(stderr, _("Passwords didn't match.\n"));
-		exit_nicely();
+		/*
+		 * Read password from terminal
+		 */
+		pwd1 = simple_prompt("Enter new superuser password: ", 100, false);
+		pwd2 = simple_prompt("Enter it again: ", 100, false);
+		if (strcmp(pwd1, pwd2) != 0)
+		{
+			fprintf(stderr, _("Passwords didn't match.\n"));
+			exit_nicely();
+		}
+		free(pwd2);
 	}
-	free(pwd2);
+	else
+	{
+		/*
+		 * Read password from file
+		 *
+		 * Ideally this should insist that the file not be world-readable.
+		 * However, this option is mainly intended for use on Windows where
+		 * file permissions may not exist at all, so we'll skip the paranoia
+		 * for now.
+		 */
+		FILE *pwf = fopen(pwfilename,"r");
+		char pwdbuf[MAXPGPATH];
+		int  i;
 
+		if (!pwf)
+		{
+			fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"),
+					progname, pwfilename, strerror(errno));
+			exit_nicely();
+		}
+		if (!fgets(pwdbuf, sizeof(pwdbuf), pwf))
+		{
+			fprintf(stderr, _("%s: could not read password from file \"%s\": %s\n"),
+					progname, pwfilename, strerror(errno));
+			exit_nicely();
+		}
+		fclose(pwf);
+
+		i = strlen(pwdbuf);
+		while (i > 0 && (pwdbuf[i-1] == '\r' || pwdbuf[i-1] == '\n'))
+			pwdbuf[--i] = '\0';
+		
+		pwd1 = xstrdup(pwdbuf);
+		
+	}
 	printf(_("setting password ... "));
 	fflush(stdout);
 
@@ -1737,6 +1778,7 @@ usage(const char *progname)
 	printf(_("  --no-locale               equivalent to --locale=C\n"));
 	printf(_("  -U, --username=NAME       database superuser name\n"));
 	printf(_("  -W, --pwprompt            prompt for a password for the new superuser\n"));
+	printf(_("  --pwfile=filename         read password for the new superuser from file\n"));
 	printf(_("  -?, --help                show this help, then exit\n"));
 	printf(_("  -V, --version             output version information, then exit\n"));
 	printf(_("\nLess commonly used options:\n"));
@@ -1768,6 +1810,7 @@ main(int argc, char *argv[])
 		{"lc-messages", required_argument, NULL, 7},
 		{"no-locale", no_argument, NULL, 8},
 		{"pwprompt", no_argument, NULL, 'W'},
+		{"pwfile", required_argument, NULL, 9},
 		{"username", required_argument, NULL, 'U'},
 		{"help", no_argument, NULL, '?'},
 		{"version", no_argument, NULL, 'V'},
@@ -1857,6 +1900,9 @@ main(int argc, char *argv[])
 			case 8:
 				locale = "C";
 				break;
+			case 9:
+				pwfilename = xstrdup(optarg);
+				break;
 			case 's':
 				show_setting = true;
 				break;
@@ -1882,6 +1928,12 @@ main(int argc, char *argv[])
 				progname);
 	}
 
+	if (pwprompt && pwfilename)
+	{
+		fprintf(stderr, _("%s: you cannot specify both password prompt and password file\n"), progname);
+		exit(1);
+	}
+
 	if (strlen(pg_data) == 0)
 	{
 		pgdenv = getenv("PGDATA");
@@ -2147,7 +2199,7 @@ main(int argc, char *argv[])
 	/* Create the stuff we don't need to use bootstrap mode for */
 
 	setup_shadow();
-	if (pwprompt)
+	if (pwprompt || pwfilename)
 		get_set_pwd();
 
 	unlimit_systables();