Fix pgxs for spaces in file names on Win32
authorBruce Momjian <bruce@momjian.us>
Wed, 5 Oct 2005 12:16:28 +0000 (12:16 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 5 Oct 2005 12:16:28 +0000 (12:16 +0000)
Dave Page

src/bin/pg_config/pg_config.c

index 3902f585123d938611802e58818151f57e325981..e0f923a5b2d75d6d241b9a3446011c7ae59f4413 100644 (file)
@@ -17,7 +17,7 @@
  *
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/pg_config/pg_config.c,v 1.13 2005/09/27 17:39:33 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_config/pg_config.c,v 1.14 2005/10/05 12:16:28 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -30,6 +30,64 @@ static const char *progname;
 static char        mypath[MAXPGPATH];
 
 
+/*
+ * 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
@@ -39,138 +97,152 @@ static char       mypath[MAXPGPATH];
 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);
 }