aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2005-06-10 03:02:30 +0000
committerBruce Momjian <bruce@momjian.us>2005-06-10 03:02:30 +0000
commit453d74b99c9ba6e5e75d214b0d7bec13553ded89 (patch)
treefd1cb84cf83123f083156542cfe770ce5c276d70 /src
parent3b167a4099c9ea2e86cd536afb75becd1f3f3875 (diff)
downloadpostgresql-453d74b99c9ba6e5e75d214b0d7bec13553ded89.tar.gz
postgresql-453d74b99c9ba6e5e75d214b0d7bec13553ded89.zip
Add the "PGPASSFILE" environment variable to specify to the password
file. Andrew Dunstan
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/libpq/fe-connect.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 05899450237..8c9a005602f 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))