Index: doc/src/sgml/libpq.sgml =================================================================== RCS file: /cvsroot/pgsql-server/doc/src/sgml/libpq.sgml,v retrieving revision 1.94 diff -c -c -r1.94 libpq.sgml *** doc/src/sgml/libpq.sgml 2 Sep 2002 20:21:32 -0000 1.94 --- doc/src/sgml/libpq.sgml 5 Sep 2002 21:46:31 -0000 *************** *** 2052,2074 **** - - PGPASSWORDFILE - - PGPASSWORDFILE - sets the password file used if the backend demands password authentication. - This file should have the format - - hostname:port:database:username:password - - Any of these may be a literal name, or a * that matches - anything. The first match will be the one used, so put more specific entries first. - Entries with : or \ should be escaped - with \. - - - - PGREALM sets the Kerberos realm to use with PostgreSQL, if it is different from the local realm. If PGREALM is set, PostgreSQL --- 2052,2057 ---- *************** *** 2139,2144 **** --- 2122,2148 ---- for information on correct values for these environment variables. + + + + + Files + + + files + + + $HOME/.pgpass is a file that can contain passwords + to be used if the connection requires a password. This file should have the + format: + + hostname:port:database:username:password + + Any of these may be a literal name, or *, which matches + anything. The first match will be used so put more specific entries first. + Entries with : or \ should be escaped + with \. + Index: doc/src/sgml/ref/clusterdb.sgml =================================================================== RCS file: /cvsroot/pgsql-server/doc/src/sgml/ref/clusterdb.sgml,v retrieving revision 1.2 diff -c -c -r1.2 clusterdb.sgml *** doc/src/sgml/ref/clusterdb.sgml 3 Sep 2002 01:11:37 -0000 1.2 --- doc/src/sgml/ref/clusterdb.sgml 5 Sep 2002 21:46:32 -0000 *************** *** 54,63 **** ! clusterdb will need to connect several times to the ! PostgreSQL server. If you are using password ! authentication, it will ask for the password each time. It will probably be ! very convenient to have a PGPASSWORDFILE in that case. --- 54,63 ---- ! clusterdb might need to connect several ! times to the PostgreSQL server, asking for ! a password each time. It is convenient to have a ! $HOME/.pgpass file in such cases. Index: doc/src/sgml/ref/pg_dumpall.sgml =================================================================== RCS file: /cvsroot/pgsql-server/doc/src/sgml/ref/pg_dumpall.sgml,v retrieving revision 1.32 diff -c -c -r1.32 pg_dumpall.sgml *** doc/src/sgml/ref/pg_dumpall.sgml 27 Aug 2002 18:57:26 -0000 1.32 --- doc/src/sgml/ref/pg_dumpall.sgml 5 Sep 2002 21:46:34 -0000 *************** *** 61,66 **** --- 61,74 ---- The SQL script will be written to the standard output. Shell operators should be used to redirect it into a file. + + + pg_dumpall might need to connect several + times to the PostgreSQL server, asking for + a password each time. It is convenient to have a + $HOME/.pgpass file in such cases. + + Index: doc/src/sgml/ref/vacuumdb.sgml =================================================================== RCS file: /cvsroot/pgsql-server/doc/src/sgml/ref/vacuumdb.sgml,v retrieving revision 1.24 diff -c -c -r1.24 vacuumdb.sgml *** doc/src/sgml/ref/vacuumdb.sgml 27 Aug 2002 03:55:17 -0000 1.24 --- doc/src/sgml/ref/vacuumdb.sgml 5 Sep 2002 21:46:34 -0000 *************** *** 62,70 **** ! vacuumdb will need to connect several times to the ! PostgreSQL server, asking for the password each ! time. It will probably be very convenient to have a PGPASSWORDFILE in that case. --- 62,71 ---- ! vacuumdb might need to connect several ! times to the PostgreSQL server, asking for ! a password each time. It is convenient to have a ! $HOME/.pgpass file in such cases. Index: src/bin/psql/input.c =================================================================== RCS file: /cvsroot/pgsql-server/src/bin/psql/input.c,v retrieving revision 1.19 diff -c -c -r1.19 input.c *** src/bin/psql/input.c 10 Apr 2002 22:46:58 -0000 1.19 --- src/bin/psql/input.c 5 Sep 2002 21:46:38 -0000 *************** *** 30,35 **** --- 30,37 ---- static void finishInput(int, void *); #endif + #define PSQLHISTORY "/.psql_history" + /* * gets_interactive() *************** *** 142,152 **** home = getenv("HOME"); if (home) { ! char *psql_history = (char *) malloc(strlen(home) + 20); if (psql_history) { ! sprintf(psql_history, "%s/.psql_history", home); read_history(psql_history); free(psql_history); } --- 144,155 ---- home = getenv("HOME"); if (home) { ! char *psql_history = (char *) malloc(strlen(home) + ! strlen(PSQLHISTORY) + 1); if (psql_history) { ! sprintf(psql_history, "%s" PSQLHISTORY, home); read_history(psql_history); free(psql_history); } *************** *** 201,214 **** home = getenv("HOME"); if (home) { ! psql_history = (char *) malloc(strlen(home) + 20); if (psql_history) { const char *var = GetVariable(pset.vars, "HISTSIZE"); if (var) stifle_history(atoi(var)); ! sprintf(psql_history, "%s/.psql_history", home); write_history(psql_history); free(psql_history); } --- 204,218 ---- home = getenv("HOME"); if (home) { ! psql_history = (char *) malloc(strlen(home) + ! strlen(PSQLHISTORY) + 1); if (psql_history) { const char *var = GetVariable(pset.vars, "HISTSIZE"); if (var) stifle_history(atoi(var)); ! sprintf(psql_history, "%s" PSQLHISTORY, home); write_history(psql_history); free(psql_history); } Index: src/bin/psql/startup.c =================================================================== RCS file: /cvsroot/pgsql-server/src/bin/psql/startup.c,v retrieving revision 1.64 diff -c -c -r1.64 startup.c *** src/bin/psql/startup.c 4 Sep 2002 20:31:36 -0000 1.64 --- src/bin/psql/startup.c 5 Sep 2002 21:46:41 -0000 *************** *** 599,622 **** #define R_OK 0 #endif /* Look for one in the home dir */ home = getenv("HOME"); if (home) { ! psqlrc = malloc(strlen(home) + 20); if (!psqlrc) { fprintf(stderr, gettext("%s: out of memory\n"), pset.progname); exit(EXIT_FAILURE); } ! sprintf(psqlrc, "%s/.psqlrc-" PG_VERSION, home); if (access(psqlrc, R_OK) == 0) process_file(psqlrc); else { ! sprintf(psqlrc, "%s/.psqlrc", home); if (access(psqlrc, R_OK) == 0) process_file(psqlrc); } --- 599,625 ---- #define R_OK 0 #endif + #define PSQLRC "/.psqlrc" + /* Look for one in the home dir */ home = getenv("HOME"); if (home) { ! psqlrc = malloc(strlen(home) + strlen(PSQLRC) + 1 + ! strlen(PG_VERSION) + 1); if (!psqlrc) { fprintf(stderr, gettext("%s: out of memory\n"), pset.progname); exit(EXIT_FAILURE); } ! sprintf(psqlrc, "%s" PSQLRC "-" PG_VERSION, home); if (access(psqlrc, R_OK) == 0) process_file(psqlrc); else { ! sprintf(psqlrc, "%s" PSQLRC, home); if (access(psqlrc, R_OK) == 0) process_file(psqlrc); } Index: src/interfaces/libpq/fe-connect.c =================================================================== RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/fe-connect.c,v retrieving revision 1.201 diff -c -c -r1.201 fe-connect.c *** src/interfaces/libpq/fe-connect.c 4 Sep 2002 20:31:46 -0000 1.201 --- src/interfaces/libpq/fe-connect.c 5 Sep 2002 21:46:55 -0000 *************** *** 66,71 **** --- 66,72 ---- #define NOTIFYLIST_INITIAL_SIZE 10 #define NOTIFYLIST_GROWBY 10 + #define PGPASSFILE "/.pgpass" /* ---------- * Definition of the conninfo parameters and their fallback resources. *************** *** 186,192 **** PQExpBuffer errorMessage); char *pwdfMatchesString(char *buf, char *token); char *PasswordFromFile(char *hostname, char *port, char *dbname, ! char *username, char *pwdfile); /* * Connecting to a Database --- 187,193 ---- PQExpBuffer errorMessage); char *pwdfMatchesString(char *buf, char *token); char *PasswordFromFile(char *hostname, char *port, char *dbname, ! char *username); /* * Connecting to a Database *************** *** 395,404 **** * * PGPASSWORD The user's password. * - * PGPASSWORDFILE - * A file that contains host:port:database:user:password - * for authentication - * * PGDATABASE name of database to which to connect if * argument is NULL or a null string * --- 396,401 ---- *************** *** 506,513 **** else if ((tmp = getenv("PGPASSWORD")) != NULL) conn->pgpass = strdup(tmp); else if ((tmp = PasswordFromFile(conn->pghost, conn->pgport, ! conn->dbName, conn->pguser, ! getenv("PGPASSWORDFILE"))) != NULL) conn->pgpass = tmp; else conn->pgpass = strdup(DefaultPassword); --- 503,509 ---- else if ((tmp = getenv("PGPASSWORD")) != NULL) conn->pgpass = strdup(tmp); else if ((tmp = PasswordFromFile(conn->pghost, conn->pgport, ! conn->dbName, conn->pguser))) conn->pgpass = tmp; else conn->pgpass = strdup(DefaultPassword); *************** *** 2905,2926 **** /* get a password from the password file. */ char * ! PasswordFromFile(char *hostname, char *port, char *dbname, ! char *username, char *pwdfile) { FILE *fp; #define LINELEN NAMEDATALEN*5 char buf[LINELEN]; - struct stat stat_buf; - - if (pwdfile == NULL || strcmp(pwdfile, "") == 0) - return NULL; ! if (dbname == NULL || strcmp(dbname, "") == 0) return NULL; ! if (username == NULL || strcmp(username, "") == 0) return NULL; if (hostname == NULL) --- 2901,2920 ---- /* get a password from the password file. */ char * ! PasswordFromFile(char *hostname, char *port, char *dbname, char *username) { FILE *fp; + char *pgpassfile; + char *home; + struct stat stat_buf; #define LINELEN NAMEDATALEN*5 char buf[LINELEN]; ! if (dbname == NULL || strlen(dbname) == 0) return NULL; ! if (username == NULL || strlen(username) == 0) return NULL; if (hostname == NULL) *************** *** 2929,2948 **** if (port == NULL) port = DEF_PGPORT_STR; /* If password file cannot be opened, ignore it. */ ! if (stat(pwdfile, &stat_buf) == -1) return NULL; /* If password file is insecure, alert the user and ignore it. */ if (stat_buf.st_mode & (S_IRWXG | S_IRWXO)) { fprintf(stderr, libpq_gettext("WARNING: Password file %s has world or group read access; permission should be u=rw (0600)"), ! pwdfile); return NULL; } ! fp = fopen(pwdfile, "r"); if (fp == NULL) return NULL; --- 2923,2963 ---- if (port == NULL) port = DEF_PGPORT_STR; + /* Look for it in the home dir */ + home = getenv("HOME"); + if (home) + { + pgpassfile = malloc(strlen(home) + strlen(PGPASSFILE) + 1); + if (!pgpassfile) + { + fprintf(stderr, gettext("%s: out of memory\n"), pset.progname); + exit(EXIT_FAILURE); + } + } + else + return NULL; + + sprintf(pgpassfile, "%s" PGPASSFILE, home); + /* If password file cannot be opened, ignore it. */ ! if (stat(pgpassfile, &stat_buf) == -1) ! { ! free(pgpassfile); return NULL; + } /* If password file is insecure, alert the user and ignore it. */ if (stat_buf.st_mode & (S_IRWXG | S_IRWXO)) { fprintf(stderr, libpq_gettext("WARNING: Password file %s has world or group read access; permission should be u=rw (0600)"), ! pgpassfile); ! free(pgpassfile); return NULL; } ! fp = fopen(pgpassfile, "r"); ! free(pgpassfile); if (fp == NULL) return NULL; *************** *** 2965,2970 **** --- 2980,2986 ---- fclose(fp); return ret; } + fclose(fp); return NULL;