Tom Lane wrote:
> [EMAIL PROTECTED] (Bruce Momjian) writes:
> >     pgsql-server/src/backend/postmaster:
> >         postmaster.c (r1.407 -> r1.408)
> >         
> > (http://developer.postgresql.org/cvsweb.cgi/pgsql-server/src/backend/postmaster/postmaster.c.diff?r1=1.407&r2=1.408)
> 
> You can't do that.  In the first place it will dump core if PGDATA isn't
> set, and in the second place it is not kosher to scribble on environment
> values.

OK, I added a strdup to make a copy of the environment variable.  I also
moved the canonicialize_path down so it will process both PGDATA and -D.
Patch attached and applied.

> This is the wrong place to do it anyway.  It is necessary, sufficient,
> and already done to do it in SetDataDir.

The problem is that checkDataDir() (called before SetDataDir()) does a
stat() on that value, and this is the failure Magnus was seeing.  This
requirement is new because onlyConfigSpecified() does a stat() to test
to see if we are are pointing to a config file/dir or the data directory
before calling SetDataDir().  However, we can't remove the
canonicalize_path() from SetDataDir() because postgres and bootstrap
call that directly.

> >     pgsql-server/src/backend/utils/misc:
> >         guc.c (r1.214 -> r1.215)
> >         
> > (http://developer.postgresql.org/cvsweb.cgi/pgsql-server/src/backend/utils/misc/guc.c.diff?r1=1.214&r2=1.215)
> 
> Could we not have FATAL here, please?

OK, changed to ERROR, but there are alot of similar calls which used
FATAL for that call in that file.

> >     pgsql-server/src/bin/psql:
> >         command.c (r1.119 -> r1.120)
> >         
> > (http://developer.postgresql.org/cvsweb.cgi/pgsql-server/src/bin/psql/command.c.diff?r1=1.119&r2=1.120)
> 
> None of these are correct.  canonicalize_path is only intended for
> directory names not file names.  (I think the same problem applies
> to several of your GUC variable changes, too.)

canonicalize_path changes \ to /, and trims the trailing slash. 
Filenames do not need trimming, but they might need the slash change.  I
think we found that a filename with mixed / and \ will not work.

> >         copy.c (r1.49 -> r1.50)
> >         
> > (http://developer.postgresql.org/cvsweb.cgi/pgsql-server/src/bin/psql/copy.c.diff?r1=1.49&r2=1.50)
> 
> As above.
> 
>                       regards, tom lane
> 

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  [EMAIL PROTECTED]               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/postmaster/postmaster.c,v
retrieving revision 1.408
diff -c -c -r1.408 postmaster.c
*** src/backend/postmaster/postmaster.c 11 Jul 2004 21:33:59 -0000      1.408
--- src/backend/postmaster/postmaster.c 11 Jul 2004 23:46:38 -0000
***************
*** 372,378 ****
        InitializeGUCOptions();
  
        userPGDATA = getenv("PGDATA");          /* default value */
-       canonicalize_path(userPGDATA);
        
        opterr = 1;
  
--- 372,377 ----
***************
*** 524,529 ****
--- 523,534 ----
                write_stderr("Try \"%s --help\" for more information.\n",
                                         progname);
                ExitPostmaster(1);
+       }
+ 
+       if (userPGDATA)
+       {
+               userPGDATA = strdup(userPGDATA);
+               canonicalize_path(userPGDATA);
        }
  
        if (onlyConfigSpecified(userPGDATA))
Index: src/backend/utils/init/miscinit.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/utils/init/miscinit.c,v
retrieving revision 1.127
diff -c -c -r1.127 miscinit.c
*** src/backend/utils/init/miscinit.c   18 Jun 2004 06:13:54 -0000      1.127
--- src/backend/utils/init/miscinit.c   11 Jul 2004 23:46:39 -0000
***************
*** 207,216 ****
                                         errmsg("out of memory")));
        }
  
-       /*
-        * Strip any trailing slash.  Not strictly necessary, but avoids
-        * generating funny-looking paths to individual files.
-        */
        canonicalize_path(new);
  
        if (DataDir)
--- 207,212 ----
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/utils/misc/guc.c,v
retrieving revision 1.216
diff -c -c -r1.216 guc.c
*** src/backend/utils/misc/guc.c        11 Jul 2004 21:48:25 -0000      1.216
--- src/backend/utils/misc/guc.c        11 Jul 2004 23:46:43 -0000
***************
*** 5441,5447 ****
        if (doit)
        {
                /* We have to create a new pointer to force the change */
!               char *canon_val = guc_strdup(FATAL, newval);
                canonicalize_path(canon_val);
                return canon_val;
        }
--- 5441,5447 ----
        if (doit)
        {
                /* We have to create a new pointer to force the change */
!               char *canon_val = guc_strdup(ERROR, newval);
                canonicalize_path(canon_val);
                return canon_val;
        }
---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?

               http://archives.postgresql.org

Reply via email to