<!--
-$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">
</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>
</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>
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
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];
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))