Index: doc/src/sgml/libpq.sgml =================================================================== RCS file: /cvsroot/pgsql/doc/src/sgml/libpq.sgml,v retrieving revision 1.182 diff -c -c -r1.182 libpq.sgml *** doc/src/sgml/libpq.sgml 4 Jun 2005 20:42:41 -0000 1.182 --- doc/src/sgml/libpq.sgml 10 Jun 2005 02:55:48 -0000 *************** *** 3713,3718 **** --- 3713,3729 ---- + PGPASSFILE + + PGPASSFILE + specifies the name of the password file to use for lookups. + If not set, it defaults to ~/.pgpass + (see ). + + + + + PGSERVICE PGSERVICE *************** *** 3902,3913 **** ! The file .pgpass 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 ! %APPDATA%\postgresql\pgpass.conf (where %APPDATA% ! refers to the Application Data subdirectory in the user's profile). --- 3913,3925 ---- ! The file .pgpass in a user's home directory or the ! file referenced by PGPASSFILE 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 ! %APPDATA%\postgresql\pgpass.conf (where ! %APPDATA% refers to the Application Data subdirectory in ! the user's profile). Index: src/interfaces/libpq/fe-connect.c =================================================================== RCS file: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v retrieving revision 1.307 diff -c -c -r1.307 fe-connect.c *** src/interfaces/libpq/fe-connect.c 4 Jun 2005 20:42:43 -0000 1.307 --- src/interfaces/libpq/fe-connect.c 10 Jun 2005 02:55:52 -0000 *************** *** 3217,3225 **** PasswordFromFile(char *hostname, char *port, char *dbname, char *username) { FILE *fp; - char homedir[MAXPGPATH]; char pgpassfile[MAXPGPATH]; struct stat stat_buf; #define LINELEN NAMEDATALEN*5 char buf[LINELEN]; --- 3217,3225 ---- PasswordFromFile(char *hostname, char *port, char *dbname, char *username) { FILE *fp; char pgpassfile[MAXPGPATH]; struct stat stat_buf; + char *passfile_env; #define LINELEN NAMEDATALEN*5 char buf[LINELEN]; *************** *** 3236,3250 **** if (port == NULL) port = DEF_PGPORT_STR; ! 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; #ifndef WIN32 /* If password file is insecure, alert the user and ignore it. */ if (stat_buf.st_mode & (S_IRWXG | S_IRWXO)) --- 3236,3273 ---- if (port == NULL) port = DEF_PGPORT_STR; ! 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]; ! 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))