Обсуждение: Fix for file names with spaces

Поиск
Список
Период
Сортировка

Fix for file names with spaces

От
Bruce Momjian
Дата:
Sorry, this is the same patch with the proper subject line.

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

Bruce Momjian wrote:
>
> Patch applied.  Thanks.
>
> ---------------------------------------------------------------------------
>
>
> Bruce Momjian wrote:
> >
> > Oh, good, I missed that patch.
> >
> > Your patch has been added to the PostgreSQL unapplied patches list at:
> >
> >     http://momjian.postgresql.org/cgi-bin/pgpatches
> >
> > It will be applied as soon as one of the PostgreSQL committers reviews
> > and approves it.
> >
> > ---------------------------------------------------------------------------
> >
> >
> > >
> > >
> > >
> > > -----Original Message-----
> > > From: pgsql-hackers-owner@postgresql.org on behalf of Bruce Momjian
> > > Sent: Sat 10/1/2005 1:16 AM
> > > To: Jim C. Nasby
> > > Cc: Joshua D. Drake; Tony Caduto; pgsql-hackers@postgresql.org
> > > Subject: Re: [HACKERS] Found small issue with OUT params
> > >
> > > > fix pgxs for spaces in file names
> > >
> > > I posted a patch for that.
> > >
> > > http://archives.postgresql.org/pgsql-patches/2005-09/msg00137.php
> > >
> > > Regards, Dave
> > >
> > > ---------------------------(end of broadcast)---------------------------
> > > TIP 4: Have you searched our list archives?
> > >
> > >                http://archives.postgresql.org
> > >
> >
> > --
> >   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/pg_config/pg_config.c
> > ===================================================================
> > RCS file: /projects/cvsroot/pgsql/src/bin/pg_config/pg_config.c,v
> > retrieving revision 1.13
> > diff -u -r1.13 pg_config.c
> > --- src/bin/pg_config/pg_config.c    27 Sep 2005 17:39:33 -0000    1.13
> > +++ src/bin/pg_config/pg_config.c    28 Sep 2005 12:13:13 -0000
> > @@ -31,6 +31,63 @@
> >
> >
> >  /*
> > + * This function cleans up the paths for use with either cmd.exe or Msys
> > + * on Windows. We need them to use double backslashes and filenames without
> > + * spaces (for which a short filename is the safest equivalent) eg:
> > + * C:\\Progra~1\\
> > + *
> > + * This can fail in 2 ways - if the path doesn't exist, or short names are
> > + * disabled. In the first case, don't return any path. In the second case,
> > + * we leave the path in the long form. In this case, it does still seem to
> > + * fix elements containing spaces which is all we actually need.
> > + */
> > +static void
> > +cleanup_path(char *path)
> > +{
> > +#ifdef WIN32
> > +    int    x=0, y=0;
> > +    char    temp[MAXPGPATH];
> > +
> > +    if (GetShortPathName(path, path, MAXPGPATH - 1) == 0)
> > +    {
> > +        /* Ignore ERROR_INVALID_PARAMETER as it almost certainly
> > +         * means that short names are disabled
> > +         */
> > +        if (GetLastError() != ERROR_INVALID_PARAMETER)
> > +        {
> > +            path[0] = '\0';
> > +            return;
> > +        }
> > +    }
> > +
> > +
> > +    /* Replace '\' with '\\'. */
> > +    for (x = 0; x < strlen(path); x++)
> > +        {
> > +        if (path[x] == '/' || path[x] == '\\')
> > +        {
> > +            temp[y] = '\\';
> > +            y++;
> > +            temp[y] = '\\';
> > +        }
> > +        else
> > +        {
> > +            temp[y] = path[x];
> > +        }
> > +
> > +        y++;
> > +
> > +        /* Bail out if we're too close to MAXPGPATH */
> > +        if (y >= MAXPGPATH - 2)
> > +            break;
> > +    }
> > +    temp[y] = '\0';
> > +
> > +    strncpy(path, temp, MAXPGPATH - 1);
> > +#endif
> > +}
> > +
> > +
> > +/*
> >   * For each piece of information known to pg_config, we define a subroutine
> >   * to print it.  This is probably overkill, but it avoids code duplication
> >   * and accidentally omitting items from the "all" display.
> > @@ -39,138 +96,152 @@
> >  static void
> >  show_bindir(bool all)
> >  {
> > -    char        path[MAXPGPATH];
> > -    char       *lastsep;
> > +    char    path[MAXPGPATH];
> > +    char    *lastsep;
> >
> >      if (all)
> >          printf("BINDIR = ");
> >      /* assume we are located in the bindir */
> >      strcpy(path, mypath);
> >      lastsep = strrchr(path, '/');
> > +
> >      if (lastsep)
> >          *lastsep = '\0';
> > +
> > +    cleanup_path(path);
> >      printf("%s\n", path);
> >  }
> >
> >  static void
> >  show_docdir(bool all)
> >  {
> > -    char        path[MAXPGPATH];
> > +    char    path[MAXPGPATH];
> >
> >      if (all)
> >          printf("DOCDIR = ");
> >      get_doc_path(mypath, path);
> > +    cleanup_path(path);
> >      printf("%s\n", path);
> >  }
> >
> >  static void
> >  show_includedir(bool all)
> >  {
> > -    char        path[MAXPGPATH];
> > +    char    path[MAXPGPATH];
> >
> >      if (all)
> >          printf("INCLUDEDIR = ");
> >      get_include_path(mypath, path);
> > +    cleanup_path(path);
> >      printf("%s\n", path);
> >  }
> >
> >  static void
> >  show_pkgincludedir(bool all)
> >  {
> > -    char        path[MAXPGPATH];
> > +    char    path[MAXPGPATH];
> >
> >      if (all)
> >          printf("PKGINCLUDEDIR = ");
> >      get_pkginclude_path(mypath, path);
> > +    cleanup_path(path);
> >      printf("%s\n", path);
> >  }
> >
> >  static void
> >  show_includedir_server(bool all)
> >  {
> > -    char        path[MAXPGPATH];
> > +    char    path[MAXPGPATH];
> >
> >      if (all)
> >          printf("INCLUDEDIR-SERVER = ");
> >      get_includeserver_path(mypath, path);
> > +    cleanup_path(path);
> >      printf("%s\n", path);
> >  }
> >
> >  static void
> >  show_libdir(bool all)
> >  {
> > -    char        path[MAXPGPATH];
> > +    char    path[MAXPGPATH];
> >
> >      if (all)
> >          printf("LIBDIR = ");
> >      get_lib_path(mypath, path);
> > +    cleanup_path(path);
> >      printf("%s\n", path);
> >  }
> >
> >  static void
> >  show_pkglibdir(bool all)
> >  {
> > -    char        path[MAXPGPATH];
> > +    char    path[MAXPGPATH];
> >
> >      if (all)
> >          printf("PKGLIBDIR = ");
> >      get_pkglib_path(mypath, path);
> > +    cleanup_path(path);
> >      printf("%s\n", path);
> >  }
> >
> >  static void
> >  show_localedir(bool all)
> >  {
> > -    char        path[MAXPGPATH];
> > +    char    path[MAXPGPATH];
> >
> >      if (all)
> >          printf("LOCALEDIR = ");
> >      get_locale_path(mypath, path);
> > +    cleanup_path(path);
> >      printf("%s\n", path);
> >  }
> >
> >  static void
> >  show_mandir(bool all)
> >  {
> > -    char        path[MAXPGPATH];
> > +    char    path[MAXPGPATH];
> >
> >      if (all)
> >          printf("MANDIR = ");
> >      get_man_path(mypath, path);
> > +    cleanup_path(path);
> >      printf("%s\n", path);
> >  }
> >
> >  static void
> >  show_sharedir(bool all)
> >  {
> > -    char        path[MAXPGPATH];
> > +    char    path[MAXPGPATH];
> >
> >      if (all)
> >          printf("SHAREDIR = ");
> >      get_share_path(mypath, path);
> > +    cleanup_path(path);
> >      printf("%s\n", path);
> >  }
> >
> >  static void
> >  show_sysconfdir(bool all)
> >  {
> > -    char        path[MAXPGPATH];
> > +    char    path[MAXPGPATH];
> >
> >      if (all)
> >          printf("SYSCONFDIR = ");
> >      get_etc_path(mypath, path);
> > +    cleanup_path(path);
> >      printf("%s\n", path);
> >  }
> >
> >  static void
> >  show_pgxs(bool all)
> >  {
> > -    char        path[MAXPGPATH];
> > +    char    path[MAXPGPATH];
> >
> >      if (all)
> >          printf("PGXS = ");
> >      get_pkglib_path(mypath, path);
> >      strncat(path, "/pgxs/src/makefiles/pgxs.mk", MAXPGPATH - 1);
> > +    cleanup_path(path);
> >      printf("%s\n", path);
> >  }
>
> >
> > ---------------------------(end of broadcast)---------------------------
> > TIP 1: if posting/reading through Usenet, please send an appropriate
> >        subscribe-nomail command to majordomo@postgresql.org so that your
> >        message can get through to the mailing list cleanly
>
> --
>   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
>

--
  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: Fix for file names with spaces

От
Tom Lane
Дата:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> Sorry, this is the same patch with the proper subject line.

Why does this patch convert '\' to '\\' and not to '/' ?
AFAICS that does nothing except to make the code more fragile.

            regards, tom lane

Re: Fix for file names with spaces

От
"Dave Page"
Дата:

> -----Original Message-----
> From: Tom Lane [mailto:tgl@sss.pgh.pa.us]
> Sent: 05 October 2005 16:31
> To: Dave Page
> Cc: Bruce Momjian; PostgreSQL-patches
> Subject: Re: [PATCHES] Fix for file names with spaces
>
> "Dave Page" <dpage@vale-housing.co.uk> writes:
> >> Why does this patch convert '\' to '\\' and not to '/' ?
>
> > Because support on Windows for / is somewhat inconsistent
> outside of the
> > Msys shell.
>
> Do we care about that for the purposes that pg_config will be
> used for?
> It seems more likely to me that emitting \\ will break things
> than that
> it will help.  In particular, we know that the former behavior worked
> fine modulo the pathnames-with-spaces problem.

Well it makes no difference to me, but will might well make pg_config
useless for anyone trying to use it as part of a non-msys/cygwin based
build environment for their projects. I don't know how likely that is
though - certainly I don't try to do anything like that in my own VC++
projects, but then all of those predate 8.0 anyway.

Regards, Dave.

Re: Fix for file names with spaces

От
Tom Lane
Дата:
"Dave Page" <dpage@vale-housing.co.uk> writes:
>> Why does this patch convert '\' to '\\' and not to '/' ?

> Because support on Windows for / is somewhat inconsistent outside of the
> Msys shell.

Do we care about that for the purposes that pg_config will be used for?
It seems more likely to me that emitting \\ will break things than that
it will help.  In particular, we know that the former behavior worked
fine modulo the pathnames-with-spaces problem.

            regards, tom lane

Re: Fix for file names with spaces

От
"Dave Page"
Дата:

> -----Original Message-----
> From: Tom Lane [mailto:tgl@sss.pgh.pa.us]
> Sent: 05 October 2005 16:08
> To: Bruce Momjian
> Cc: PostgreSQL-patches; Dave Page
> Subject: Re: [PATCHES] Fix for file names with spaces
>
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > Sorry, this is the same patch with the proper subject line.
>
> Why does this patch convert '\' to '\\' and not to '/' ?
> AFAICS that does nothing except to make the code more fragile.

Because support on Windows for / is somewhat inconsistent outside of the
Msys shell.

Eg.

C:\Documents and Settings\dpage>cd /

C:\Documents and Settings\dpage>cd \

C:\>

Regards, Dave.