From: Bruce Momjian Date: Wed, 5 Oct 2005 12:16:28 +0000 (+0000) Subject: Fix pgxs for spaces in file names on Win32 X-Git-Tag: REL8_1_0BETA3~47 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f39cfbe4be31c1b6ac399b87f3b03e04ed168613;p=postgresql Fix pgxs for spaces in file names on Win32 Dave Page --- diff --git a/src/bin/pg_config/pg_config.c b/src/bin/pg_config/pg_config.c index 3902f58512..e0f923a5b2 100644 --- a/src/bin/pg_config/pg_config.c +++ b/src/bin/pg_config/pg_config.c @@ -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); }