diff options
author | Bruce Momjian <bruce@momjian.us> | 2005-06-10 03:02:30 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2005-06-10 03:02:30 +0000 |
commit | 453d74b99c9ba6e5e75d214b0d7bec13553ded89 (patch) | |
tree | fd1cb84cf83123f083156542cfe770ce5c276d70 /src | |
parent | 3b167a4099c9ea2e86cd536afb75becd1f3f3875 (diff) | |
download | postgresql-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.c | 33 |
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)) |