diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index d1179fa92fc3fd1c09edc4c1b72b89468a7d45b4..90e1c48125df25c3a383314a77da897cb75117d5 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/libpq.sgml,v 1.94 2002/09/02 20:21:32 tgl Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/libpq.sgml,v 1.95 2002/09/05 22:05:48 momjian Exp $ --> <chapter id="libpq"> @@ -2052,23 +2052,6 @@ reasons; consider migrating to <envar>PGPASSWORDFILE</envar>. </listitem> <listitem> <para> -<indexterm> - <primary><envar>PGPASSWORDFILE</envar></primary> -</indexterm> -<envar>PGPASSWORDFILE</envar> -sets the password file used if the backend demands password authentication. -This file should have the format -<screen> -<replaceable>hostname</replaceable>:<replaceable>port</replaceable>:<replaceable>database</replaceable>:<replaceable>username</replaceable>:<replaceable>password</replaceable> -</screen> -Any of these may be a literal name, or a <literal>*</literal> that matches -anything. The first match will be the one used, so put more specific entries first. -Entries with <literal>:</literal> or <literal>\</literal> should be escaped -with <literal>\</literal>. -</para> -</listitem> -<listitem> -<para> <envar>PGREALM</envar> sets the Kerberos realm to use with <productname>PostgreSQL</productname>, if it is different from the local realm. If <envar>PGREALM</envar> is set, <productname>PostgreSQL</productname> @@ -2141,6 +2124,27 @@ for information on correct values for these environment variables. </sect1> + +<sect1 id="libpq-files"> +<title>Files</title> + +<indexterm zone="libpq-files"> + <primary>files</primary> +</indexterm> +<para> +<filename>$HOME/.pgpass</filename> is a file that can contain passwords +to be used if the connection requires a password. This file should have the +format: +<screen> +<replaceable>hostname</replaceable>:<replaceable>port</replaceable>:<replaceable>database</replaceable>:<replaceable>username</replaceable>:<replaceable>password</replaceable> +</screen> +Any of these may be a literal name, or <literal>*</literal>, which matches +anything. The first match will be used so put more specific entries first. +Entries with <literal>:</literal> or <literal>\</literal> should be escaped +with <literal>\</literal>. +</para> +</sect1> + <sect1 id="libpq-threading"> <title>Threading Behavior</title> diff --git a/doc/src/sgml/ref/clusterdb.sgml b/doc/src/sgml/ref/clusterdb.sgml index 114fbaafa3858ff2891086a096686ac6c3bebcc5..1eae14e9672f21441526fc10793669e97822120b 100644 --- a/doc/src/sgml/ref/clusterdb.sgml +++ b/doc/src/sgml/ref/clusterdb.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/ref/clusterdb.sgml,v 1.2 2002/09/03 01:11:37 tgl Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/ref/clusterdb.sgml,v 1.3 2002/09/05 22:05:50 momjian Exp $ PostgreSQL documentation --> @@ -54,10 +54,10 @@ PostgreSQL documentation </para> <para> - <application>clusterdb</application> will need to connect several times to the - <productname>PostgreSQL</productname> 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. + <application>clusterdb</application> might need to connect several + times to the <productname>PostgreSQL</productname> server, asking for + a password each time. It is convenient to have a + <filename>$HOME/.pgpass</> file in such cases. </para> </refsect1> diff --git a/doc/src/sgml/ref/pg_dumpall.sgml b/doc/src/sgml/ref/pg_dumpall.sgml index 869f480a3416a3161d8c8327bcc29170c392ec2c..e6f156dcc6e9f8218b2290d3a82fc931f86970a1 100644 --- a/doc/src/sgml/ref/pg_dumpall.sgml +++ b/doc/src/sgml/ref/pg_dumpall.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_dumpall.sgml,v 1.32 2002/08/27 18:57:26 petere Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_dumpall.sgml,v 1.33 2002/09/05 22:05:50 momjian Exp $ PostgreSQL documentation --> @@ -61,6 +61,14 @@ PostgreSQL documentation The SQL script will be written to the standard output. Shell operators should be used to redirect it into a file. </para> + + <para> + <application>pg_dumpall</application> might need to connect several + times to the <productname>PostgreSQL</productname> server, asking for + a password each time. It is convenient to have a + <filename>$HOME/.pgpass</> file in such cases. + </para> + </refsect1> <refsect1> diff --git a/doc/src/sgml/ref/vacuumdb.sgml b/doc/src/sgml/ref/vacuumdb.sgml index 286e3de4c75f543ebe136b5e8f729af704b847f0..40e6e0743197228be986c477e4c04b78b0eca0d8 100644 --- a/doc/src/sgml/ref/vacuumdb.sgml +++ b/doc/src/sgml/ref/vacuumdb.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/ref/vacuumdb.sgml,v 1.24 2002/08/27 03:55:17 momjian Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/ref/vacuumdb.sgml,v 1.25 2002/09/05 22:05:50 momjian Exp $ PostgreSQL documentation --> @@ -62,9 +62,10 @@ PostgreSQL documentation <para> - <application>vacuumdb</application> will need to connect several times to the - <productname>PostgreSQL</productname> server, asking for the password each - time. It will probably be very convenient to have a PGPASSWORDFILE in that case. + <application>vacuumdb</application> might need to connect several + times to the <productname>PostgreSQL</productname> server, asking for + a password each time. It is convenient to have a + <filename>$HOME/.pgpass</> file in such cases. </para> </refsect1> diff --git a/src/bin/psql/input.c b/src/bin/psql/input.c index 6e083506f3e84c16fe3501fc71c0a7c88d2b1844..7ac11102669349921b79586e65140d6921f68df9 100644 --- a/src/bin/psql/input.c +++ b/src/bin/psql/input.c @@ -3,7 +3,7 @@ * * Copyright 2000 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/bin/psql/input.c,v 1.19 2002/04/10 22:46:58 petere Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/input.c,v 1.20 2002/09/05 22:05:50 momjian Exp $ */ #include "postgres_fe.h" #include "input.h" @@ -30,6 +30,8 @@ static void finishInput(void); static void finishInput(int, void *); #endif +#define PSQLHISTORY "/.psql_history" + /* * gets_interactive() @@ -142,11 +144,12 @@ initializeInput(int flags) home = getenv("HOME"); if (home) { - char *psql_history = (char *) malloc(strlen(home) + 20); + char *psql_history = (char *) malloc(strlen(home) + + strlen(PSQLHISTORY) + 1); if (psql_history) { - sprintf(psql_history, "%s/.psql_history", home); + sprintf(psql_history, "%s" PSQLHISTORY, home); read_history(psql_history); free(psql_history); } @@ -201,14 +204,15 @@ finishInput(int exitstatus, void *arg) home = getenv("HOME"); if (home) { - psql_history = (char *) malloc(strlen(home) + 20); + 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/.psql_history", home); + sprintf(psql_history, "%s" PSQLHISTORY, home); write_history(psql_history); free(psql_history); } diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c index ef84d9410b6e0ec706fc03c511cf4a1c20fc567f..1ab0ac85243aacc22f351d0a1e008528473b0fab 100644 --- a/src/bin/psql/startup.c +++ b/src/bin/psql/startup.c @@ -3,7 +3,7 @@ * * Copyright 2000 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.64 2002/09/04 20:31:36 momjian Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.65 2002/09/05 22:05:50 momjian Exp $ */ #include "postgres_fe.h" @@ -42,6 +42,7 @@ */ PsqlSettings pset; +#define PSQLRC "/.psqlrc" /* * Structures to pass information between the option parsing routine @@ -604,19 +605,20 @@ process_psqlrc(void) if (home) { - psqlrc = malloc(strlen(home) + 20); + 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); + sprintf(psqlrc, "%s" PSQLRC "-" PG_VERSION, home); if (access(psqlrc, R_OK) == 0) process_file(psqlrc); else { - sprintf(psqlrc, "%s/.psqlrc", home); + sprintf(psqlrc, "%s" PSQLRC, home); if (access(psqlrc, R_OK) == 0) process_file(psqlrc); } diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index c875ce7a60c1b22699329e8a0df45db2809e0c7e..564cbeb04441fe19990d08dec6aa551af6e13cbb 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.201 2002/09/04 20:31:46 momjian Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.202 2002/09/05 22:05:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -66,6 +66,7 @@ inet_aton(const char *cp, struct in_addr * inp) #define NOTIFYLIST_INITIAL_SIZE 10 #define NOTIFYLIST_GROWBY 10 +#define PGPASSFILE "/.pgpass" /* ---------- * Definition of the conninfo parameters and their fallback resources. @@ -186,7 +187,7 @@ static int parseServiceInfo(PQconninfoOption *options, PQExpBuffer errorMessage); char *pwdfMatchesString(char *buf, char *token); char *PasswordFromFile(char *hostname, char *port, char *dbname, - char *username, char *pwdfile); + char *username); /* * Connecting to a Database @@ -395,10 +396,6 @@ PQconndefaults(void) * * 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 <pgdatabase> * argument is NULL or a null string * @@ -506,8 +503,7 @@ PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, 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->dbName, conn->pguser))) conn->pgpass = tmp; else conn->pgpass = strdup(DefaultPassword); @@ -2905,22 +2901,20 @@ pwdfMatchesString(char *buf, char *token) /* get a password from the password file. */ char * -PasswordFromFile(char *hostname, char *port, char *dbname, - char *username, char *pwdfile) +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]; - struct stat stat_buf; - - if (pwdfile == NULL || strcmp(pwdfile, "") == 0) - return NULL; - if (dbname == NULL || strcmp(dbname, "") == 0) + if (dbname == NULL || strlen(dbname) == 0) return NULL; - if (username == NULL || strcmp(username, "") == 0) + if (username == NULL || strlen(username) == 0) return NULL; if (hostname == NULL) @@ -2929,20 +2923,41 @@ PasswordFromFile(char *hostname, char *port, char *dbname, 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(pwdfile, &stat_buf) == -1) + 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)"), - pwdfile); + pgpassfile); + free(pgpassfile); return NULL; } - fp = fopen(pwdfile, "r"); + fp = fopen(pgpassfile, "r"); + free(pgpassfile); if (fp == NULL) return NULL; @@ -2965,6 +2980,7 @@ PasswordFromFile(char *hostname, char *port, char *dbname, fclose(fp); return ret; } + fclose(fp); return NULL;