Thread: Re: [BUGS] Bug #756: suggestion: file with password instead of

Re: [BUGS] Bug #756: suggestion: file with password instead of

From
Bruce Momjian
Date:
Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > OK, next question.  Is this something that can be fixed during beta.
>
> Yeah, I think so --- it's not forcing an initdb, so it won't be too
> painful for beta testers.  And once we release it will be very hard
> to change the definition of the feature; better to get it right now.

OK, patch applied.  I will update HISTORY now and send an email to
hackers outlining the change.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
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 ****
  </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>
--- 2052,2057 ----
***************
*** 2139,2144 ****
--- 2122,2148 ----
  for information on correct values for these environment variables.
  </para>

+ </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">
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 ****
    </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.
    </para>

   </refsect1>
--- 54,63 ----
    </para>

    <para>
!   <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>
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.
    </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>
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 ****


    <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.
    </para>

   </refsect1>
--- 62,71 ----


    <para>
!   <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>
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 <pgdatabase>
   *                   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;


Re: [BUGS] Bug #756: suggestion: file with password instead of

From
Tom Lane
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> + #define PSQLHISTORY    "/.psql_history"
> ...
> !             char       *psql_history = (char *) malloc(strlen(home) +
> !                                                 strlen(PSQLHISTORY) + 1);

> !                 sprintf(psql_history, "%s" PSQLHISTORY, home);

This seems like a really ugly coding practice.  The sprintf is hard to
read and absolutely dependent on the assumption that PSQLHISTORY
contains no %.  I'd suggest this pattern:

#define PSQLHISTORY    ".psql_history"
> ...
> !             char       *psql_history = (char *) malloc(strlen(home) +
> !                                                 strlen(PSQLHISTORY) + 2);

> !                 sprintf(psql_history, "%s/%s", home, PSQLHISTORY);

as being easier to read and safer.

In PasswordFromFile():

> +     /* 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;

libpq has no business calling exit().  How about just "return NULL" like
all the other failure cases in that routine?

            regards, tom lane

Re: [BUGS] Bug #756: suggestion: file with password instead

From
Bruce Momjian
Date:
OK, I will make those changes.  Thanks.

---------------------------------------------------------------------------

Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > + #define PSQLHISTORY    "/.psql_history"
> > ...
> > !             char       *psql_history = (char *) malloc(strlen(home) +
> > !                                                 strlen(PSQLHISTORY) + 1);
>
> > !                 sprintf(psql_history, "%s" PSQLHISTORY, home);
>
> This seems like a really ugly coding practice.  The sprintf is hard to
> read and absolutely dependent on the assumption that PSQLHISTORY
> contains no %.  I'd suggest this pattern:
>
> #define PSQLHISTORY    ".psql_history"
> > ...
> > !             char       *psql_history = (char *) malloc(strlen(home) +
> > !                                                 strlen(PSQLHISTORY) + 2);
>
> > !                 sprintf(psql_history, "%s/%s", home, PSQLHISTORY);
>
> as being easier to read and safer.
>
> In PasswordFromFile():
>
> > +     /* 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;
>
> libpq has no business calling exit().  How about just "return NULL" like
> all the other failure cases in that routine?
>
>             regards, tom lane
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: [BUGS] Bug #756: suggestion: file with password instead

From
Bruce Momjian
Date:
OK, changes made.  The pasting wasn't my idea but was there as part of
the original source:

    sprintf(psqlrc, "%s/.psqlrc-" PG_VERSION, home);

I thought that was the way to do it so I propogated it consistenly.

No unpropoaged.  Thanks for the code review.

---------------------------------------------------------------------------

Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > + #define PSQLHISTORY    "/.psql_history"
> > ...
> > !             char       *psql_history = (char *) malloc(strlen(home) +
> > !                                                 strlen(PSQLHISTORY) + 1);
>
> > !                 sprintf(psql_history, "%s" PSQLHISTORY, home);
>
> This seems like a really ugly coding practice.  The sprintf is hard to
> read and absolutely dependent on the assumption that PSQLHISTORY
> contains no %.  I'd suggest this pattern:
>
> #define PSQLHISTORY    ".psql_history"
> > ...
> > !             char       *psql_history = (char *) malloc(strlen(home) +
> > !                                                 strlen(PSQLHISTORY) + 2);
>
> > !                 sprintf(psql_history, "%s/%s", home, PSQLHISTORY);
>
> as being easier to read and safer.
>
> In PasswordFromFile():
>
> > +     /* 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;
>
> libpq has no business calling exit().  How about just "return NULL" like
> all the other failure cases in that routine?
>
>             regards, tom lane
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/bin/psql/input.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/psql/input.c,v
retrieving revision 1.20
diff -c -c -r1.20 input.c
*** src/bin/psql/input.c    5 Sep 2002 22:05:50 -0000    1.20
--- src/bin/psql/input.c    6 Sep 2002 02:27:37 -0000
***************
*** 30,36 ****
  static void finishInput(int, void *);
  #endif

! #define PSQLHISTORY    "/.psql_history"


  /*
--- 30,36 ----
  static void finishInput(int, void *);
  #endif

! #define PSQLHISTORY    ".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);
              }
--- 144,155 ----
          home = getenv("HOME");
          if (home)
          {
!             char       *psql_history = (char *) malloc(strlen(home) + 1 +
                                                  strlen(PSQLHISTORY) + 1);

              if (psql_history)
              {
!                 sprintf(psql_history, "%s/%s", home, PSQLHISTORY);
                  read_history(psql_history);
                  free(psql_history);
              }
***************
*** 204,210 ****
          home = getenv("HOME");
          if (home)
          {
!             psql_history = (char *) malloc(strlen(home) +
                                      strlen(PSQLHISTORY) + 1);
              if (psql_history)
              {
--- 204,210 ----
          home = getenv("HOME");
          if (home)
          {
!             psql_history = (char *) malloc(strlen(home) + 1 +
                                      strlen(PSQLHISTORY) + 1);
              if (psql_history)
              {
***************
*** 212,218 ****

                  if (var)
                      stifle_history(atoi(var));
!                 sprintf(psql_history, "%s" PSQLHISTORY, home);
                  write_history(psql_history);
                  free(psql_history);
              }
--- 212,218 ----

                  if (var)
                      stifle_history(atoi(var));
!                 sprintf(psql_history, "%s/%s", home, PSQLHISTORY);
                  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.65
diff -c -c -r1.65 startup.c
*** src/bin/psql/startup.c    5 Sep 2002 22:05:50 -0000    1.65
--- src/bin/psql/startup.c    6 Sep 2002 02:27:39 -0000
***************
*** 42,48 ****
   */
  PsqlSettings pset;

! #define PSQLRC "/.psqlrc"

  /*
   * Structures to pass information between the option parsing routine
--- 42,48 ----
   */
  PsqlSettings pset;

! #define PSQLRC ".psqlrc"

  /*
   * Structures to pass information between the option parsing routine
***************
*** 605,611 ****

      if (home)
      {
!         psqlrc = malloc(strlen(home) + strlen(PSQLRC) + 1 +
                   strlen(PG_VERSION) + 1);
          if (!psqlrc)
          {
--- 605,611 ----

      if (home)
      {
!         psqlrc = malloc(strlen(home) + 1 + strlen(PSQLRC) + 1 +
                   strlen(PG_VERSION) + 1);
          if (!psqlrc)
          {
***************
*** 613,624 ****
              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);
          }
--- 613,624 ----
              exit(EXIT_FAILURE);
          }

!         sprintf(psqlrc, "%s/%s-%s", home, PSQLRC, PG_VERSION);
          if (access(psqlrc, R_OK) == 0)
              process_file(psqlrc);
          else
          {
!             sprintf(psqlrc, "%s/%s", home, PSQLRC);
              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.203
diff -c -c -r1.203 fe-connect.c
*** src/interfaces/libpq/fe-connect.c    5 Sep 2002 22:24:23 -0000    1.203
--- src/interfaces/libpq/fe-connect.c    6 Sep 2002 02:27:50 -0000
***************
*** 66,72 ****
  #define NOTIFYLIST_INITIAL_SIZE 10
  #define NOTIFYLIST_GROWBY 10

! #define PGPASSFILE "/.pgpass"

  /* ----------
   * Definition of the conninfo parameters and their fallback resources.
--- 66,72 ----
  #define NOTIFYLIST_INITIAL_SIZE 10
  #define NOTIFYLIST_GROWBY 10

! #define PGPASSFILE ".pgpass"

  /* ----------
   * Definition of the conninfo parameters and their fallback resources.
***************
*** 2927,2944 ****
      home = getenv("HOME");
      if (home)
      {
!         pgpassfile = malloc(strlen(home) + strlen(PGPASSFILE) + 1);
          if (!pgpassfile)
          {
-
              fprintf(stderr, libpq_gettext("out of memory\n"));
!             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)
--- 2927,2943 ----
      home = getenv("HOME");
      if (home)
      {
!         pgpassfile = malloc(strlen(home) + 1 + strlen(PGPASSFILE) + 1);
          if (!pgpassfile)
          {
              fprintf(stderr, libpq_gettext("out of memory\n"));
!             return NULL;
          }
      }
      else
          return NULL;

!     sprintf(pgpassfile, "%s/%s", home, PGPASSFILE);

      /* If password file cannot be opened, ignore it. */
      if (stat(pgpassfile, &stat_buf) == -1)
Index: src/bin/psql/input.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/psql/input.c,v
retrieving revision 1.20
diff -c -c -r1.20 input.c
*** src/bin/psql/input.c    5 Sep 2002 22:05:50 -0000    1.20
--- src/bin/psql/input.c    6 Sep 2002 02:27:37 -0000
***************
*** 30,36 ****
  static void finishInput(int, void *);
  #endif

! #define PSQLHISTORY    "/.psql_history"


  /*
--- 30,36 ----
  static void finishInput(int, void *);
  #endif

! #define PSQLHISTORY    ".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);
              }
--- 144,155 ----
          home = getenv("HOME");
          if (home)
          {
!             char       *psql_history = (char *) malloc(strlen(home) + 1 +
                                                  strlen(PSQLHISTORY) + 1);

              if (psql_history)
              {
!                 sprintf(psql_history, "%s/%s", home, PSQLHISTORY);
                  read_history(psql_history);
                  free(psql_history);
              }
***************
*** 204,210 ****
          home = getenv("HOME");
          if (home)
          {
!             psql_history = (char *) malloc(strlen(home) +
                                      strlen(PSQLHISTORY) + 1);
              if (psql_history)
              {
--- 204,210 ----
          home = getenv("HOME");
          if (home)
          {
!             psql_history = (char *) malloc(strlen(home) + 1 +
                                      strlen(PSQLHISTORY) + 1);
              if (psql_history)
              {
***************
*** 212,218 ****

                  if (var)
                      stifle_history(atoi(var));
!                 sprintf(psql_history, "%s" PSQLHISTORY, home);
                  write_history(psql_history);
                  free(psql_history);
              }
--- 212,218 ----

                  if (var)
                      stifle_history(atoi(var));
!                 sprintf(psql_history, "%s/%s", home, PSQLHISTORY);
                  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.65
diff -c -c -r1.65 startup.c
*** src/bin/psql/startup.c    5 Sep 2002 22:05:50 -0000    1.65
--- src/bin/psql/startup.c    6 Sep 2002 02:27:39 -0000
***************
*** 42,48 ****
   */
  PsqlSettings pset;

! #define PSQLRC "/.psqlrc"

  /*
   * Structures to pass information between the option parsing routine
--- 42,48 ----
   */
  PsqlSettings pset;

! #define PSQLRC ".psqlrc"

  /*
   * Structures to pass information between the option parsing routine
***************
*** 605,611 ****

      if (home)
      {
!         psqlrc = malloc(strlen(home) + strlen(PSQLRC) + 1 +
                   strlen(PG_VERSION) + 1);
          if (!psqlrc)
          {
--- 605,611 ----

      if (home)
      {
!         psqlrc = malloc(strlen(home) + 1 + strlen(PSQLRC) + 1 +
                   strlen(PG_VERSION) + 1);
          if (!psqlrc)
          {
***************
*** 613,624 ****
              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);
          }
--- 613,624 ----
              exit(EXIT_FAILURE);
          }

!         sprintf(psqlrc, "%s/%s-%s", home, PSQLRC, PG_VERSION);
          if (access(psqlrc, R_OK) == 0)
              process_file(psqlrc);
          else
          {
!             sprintf(psqlrc, "%s/%s", home, PSQLRC);
              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.203
diff -c -c -r1.203 fe-connect.c
*** src/interfaces/libpq/fe-connect.c    5 Sep 2002 22:24:23 -0000    1.203
--- src/interfaces/libpq/fe-connect.c    6 Sep 2002 02:27:50 -0000
***************
*** 66,72 ****
  #define NOTIFYLIST_INITIAL_SIZE 10
  #define NOTIFYLIST_GROWBY 10

! #define PGPASSFILE "/.pgpass"

  /* ----------
   * Definition of the conninfo parameters and their fallback resources.
--- 66,72 ----
  #define NOTIFYLIST_INITIAL_SIZE 10
  #define NOTIFYLIST_GROWBY 10

! #define PGPASSFILE ".pgpass"

  /* ----------
   * Definition of the conninfo parameters and their fallback resources.
***************
*** 2927,2944 ****
      home = getenv("HOME");
      if (home)
      {
!         pgpassfile = malloc(strlen(home) + strlen(PGPASSFILE) + 1);
          if (!pgpassfile)
          {
-
              fprintf(stderr, libpq_gettext("out of memory\n"));
!             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)
--- 2927,2943 ----
      home = getenv("HOME");
      if (home)
      {
!         pgpassfile = malloc(strlen(home) + 1 + strlen(PGPASSFILE) + 1);
          if (!pgpassfile)
          {
              fprintf(stderr, libpq_gettext("out of memory\n"));
!             return NULL;
          }
      }
      else
          return NULL;

!     sprintf(pgpassfile, "%s/%s", home, PGPASSFILE);

      /* If password file cannot be opened, ignore it. */
      if (stat(pgpassfile, &stat_buf) == -1)