Re: [HACKERS] Found small issue with OUT params - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: [HACKERS] Found small issue with OUT params
Date
Msg-id 200510011438.j91EcPU18150@candle.pha.pa.us
Whole thread Raw
Responses Re: Making pgxs builds work with a relocated installation  (Tom Lane <tgl@sss.pgh.pa.us>)
Re: [HACKERS] Found small issue with OUT params  (Bruce Momjian <pgman@candle.pha.pa.us>)
List pgsql-patches
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);
 }

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: fuzzystrmatch URL, spelling corrections
Next
From: Tom Lane
Date:
Subject: Re: Making pgxs builds work with a relocated installation