diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml
index adee93a8853ea05505612f93bc915208cf59778b..be92de3e701ef3624644e49aa4413e6b99afd0f4 100644
--- a/doc/src/sgml/libpq.sgml
+++ b/doc/src/sgml/libpq.sgml
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/libpq.sgml,v 1.183 2005/06/09 19:08:28 tgl Exp $
+$PostgreSQL: pgsql/doc/src/sgml/libpq.sgml,v 1.184 2005/06/10 03:02:01 momjian Exp $
 -->
 
  <chapter id="libpq">
@@ -3712,6 +3712,17 @@ allow non-root users to see process environment variables via
 </listitem>
 <listitem>
 <para>
+<indexterm>
+ <primary><envar>PGPASSFILE</envar></primary>
+</indexterm>
+<envar>PGPASSFILE</envar>
+specifies the name of the password file to use for lookups.
+If not set, it defaults to <filename>~/.pgpass</>
+(see <xref linkend="libpq-pgpass">).
+</para>
+</listitem>
+<listitem>
+<para>
 <indexterm>
  <primary><envar>PGSERVICE</envar></primary>
 </indexterm>
@@ -3902,12 +3913,13 @@ internationalization.
 </indexterm>
 
 <para>
-The file <filename>.pgpass</filename> in a user's home directory is a file
-that can contain passwords to be used if the connection requires a
-password (and no password has been specified otherwise).
-On Microsoft Windows the file is named
-<filename>%APPDATA%\postgresql\pgpass.conf</> (where <filename>%APPDATA%</>
-refers to the Application Data subdirectory in the user's profile).
+The file <filename>.pgpass</filename> in a user's home directory or the
+file referenced by <envar>PGPASSFILE</envar> can contain passwords to
+be used if the connection requires a password (and no password has been
+specified  otherwise). On Microsoft Windows the file is named
+<filename>%APPDATA%\postgresql\pgpass.conf</> (where
+<filename>%APPDATA%</> refers to the Application Data subdirectory in
+the user's profile).
 </para>
 
 <para>
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 05899450237f8d3345306702c26bf8b727976452..8c9a005602f900447f39a7f5f8871c6c80e92207 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.307 2005/06/04 20:42:43 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.308 2005/06/10 03:02:30 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -3217,9 +3217,9 @@ static char *
 PasswordFromFile(char *hostname, char *port, char *dbname, char *username)
 {
 	FILE	   *fp;
-	char		homedir[MAXPGPATH];
 	char		pgpassfile[MAXPGPATH];
 	struct stat stat_buf;
+	char       *passfile_env;
 
 #define LINELEN NAMEDATALEN*5
 	char		buf[LINELEN];
@@ -3236,15 +3236,38 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username)
 	if (port == NULL)
 		port = DEF_PGPORT_STR;
 
-	if (!pqGetHomeDirectory(homedir, sizeof(homedir)))
-		return NULL;
+	if ((passfile_env = getenv("PGPASSFILE")) != NULL)
+	{
+		/* use the literal path from the environment, if set */
+		StrNCpy(pgpassfile, passfile_env, MAXPGPATH);
+		if (!pgpassfile)
+		{
+			fprintf(stderr, libpq_gettext("out of memory\n"));
+			return NULL;
+		}
+	}
+	else
+	{
+		char		homedir[MAXPGPATH];
 
-	snprintf(pgpassfile, sizeof(pgpassfile), "%s/%s", homedir, PGPASSFILE);
+		if (!pqGetHomeDirectory(homedir, sizeof(homedir)))
+			return NULL;
+		snprintf(pgpassfile, sizeof(pgpassfile), "%s/%s", homedir, PGPASSFILE);
+	}
 
 	/* If password file cannot be opened, ignore it. */
 	if (stat(pgpassfile, &stat_buf) == -1)
 		return NULL;
 
+	if (!S_ISREG(stat_buf.st_mode))
+	{
+		fprintf(stderr,
+				libpq_gettext("WARNING: Password file %s is not a plain file.\n"),
+				pgpassfile);
+		free(pgpassfile);
+		return NULL;
+	}
+
 #ifndef WIN32
 	/* If password file is insecure, alert the user and ignore it. */
 	if (stat_buf.st_mode & (S_IRWXG | S_IRWXO))