Attached is a patch that takes care of the PATHSEP issue. I made a more
authorBruce Momjian
Thu, 10 Jun 2004 22:26:24 +0000 (22:26 +0000)
committerBruce Momjian
Thu, 10 Jun 2004 22:26:24 +0000 (22:26 +0000)
extensive change then what was suggested. I found the file path.c that
contained a lot of "Unix/Windows" agnostic functions so I added a function
there instead and removed the PATHSEP declaration in exec.c altogether. All
to keep things from scattering all over the code.

I also took the liberty of changing the name of the functions
"first_path_sep" and "last_path_sep". Where I come from (and I'm apparently
not alone given the former macro name PATHSEP), they should be called
"first_dir_sep" and "last_dir_sep". The new function I introduced, that
actually finds path separators, is now the "first_path_sep". The patch
contains changes on all affected places of course.

I also changed the documentation on dynamic_library_path to reflect the
chagnes.

Thomas Hallgren

doc/src/sgml/runtime.sgml
src/backend/commands/dbcommands.c
src/backend/utils/fmgr/dfmgr.c
src/bin/initdb/initdb.c
src/include/port.h
src/interfaces/ecpg/ecpglib/connect.c
src/interfaces/ecpg/preproc/ecpg.c
src/interfaces/libpq/fe-connect.c
src/port/exec.c
src/port/path.c

index 2a9177170c7ca3d315f8fbab5ed509cb25f460d8..59d59a5e6f0b6e00e409755c47c435450078f4f3 100644 (file)
@@ -1,5 +1,5 @@
 
 
 
@@ -2617,8 +2617,9 @@ SET ENABLE_SEQSCAN TO OFF;
        
 
        
-        The value for dynamic_library_path has to be a colon-separated
-        list of absolute directory names. If a directory name starts
+        The value for dynamic_library_path has to be a
+        list of absolute directory names separated by colon or, in windows
+        environments with semi-colon. If a directory name starts
         with the special value $libdir, the
         compiled-in PostgreSQL package
         library directory is substituted. This where the modules
@@ -2628,6 +2629,10 @@ SET ENABLE_SEQSCAN TO OFF;
         example:
 
 dynamic_library_path = '/usr/local/lib/postgresql:/home/my_project/lib:$libdir'
+
+        or, in a windows environment:
+
+dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
 
        
 
index 02c1bf8e2042a9441486593ba0229765eab049fc..337ec5395fbe9ad639740cb45536d4b763843ef6 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.134 2004/05/26 13:56:45 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.135 2004/06/10 22:26:18 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -941,7 +941,7 @@ resolve_alt_dbpath(const char *dbpath, Oid dboid)
    if (dbpath == NULL || dbpath[0] == '\0')
        return NULL;
 
-   if (first_path_separator(dbpath))
+   if (first_dir_separator(dbpath))
    {
        if (!is_absolute_path(dbpath))
            ereport(ERROR,
index 0d1bfc3b20b19bf895fab71e1a2b01a1675e9d66..6be4093166e4ff61f24c78e36ad4e847fd3eed9e 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/fmgr/dfmgr.c,v 1.73 2004/05/26 18:35:39 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/fmgr/dfmgr.c,v 1.74 2004/06/10 22:26:19 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -288,7 +288,7 @@ expand_dynamic_library_name(const char *name)
 
    AssertArg(name);
 
-   have_slash = (first_path_separator(name) != NULL);
+   have_slash = (first_dir_separator(name) != NULL);
 
    if (!have_slash)
    {
@@ -343,7 +343,7 @@ substitute_libpath_macro(const char *name)
    if (name[0] != '$')
        return pstrdup(name);
 
-   if ((sep_ptr = first_path_separator(name)) == NULL)
+   if ((sep_ptr = first_dir_separator(name)) == NULL)
        sep_ptr = name + strlen(name);
        
    if (strlen("$libdir") != sep_ptr - name ||
@@ -374,7 +374,7 @@ find_in_dynamic_libpath(const char *basename)
    size_t      baselen;
 
    AssertArg(basename != NULL);
-   AssertArg(first_path_separator(basename) == NULL);
+   AssertArg(first_dir_separator(basename) == NULL);
    AssertState(Dynamic_library_path != NULL);
 
    p = Dynamic_library_path;
@@ -390,13 +390,17 @@ find_in_dynamic_libpath(const char *basename)
        char       *mangled;
        char       *full;
 
-       len = strcspn(p, ":");
-
-       if (len == 0)
+       piece = first_path_separator(p);
+       if(piece == p)
            ereport(ERROR,
                    (errcode(ERRCODE_INVALID_NAME),
               errmsg("zero-length component in parameter \"dynamic_library_path\"")));
 
+       if(piece == 0)
+          len = strlen(p);
+       else
+          len = piece - p;
+
        piece = palloc(len + 1);
        strncpy(piece, p, len);
        piece[len] = '\0';
index 726e4658fd72dd4c750ea08475d0b640b8def5ff..3ded3d8775b46da0f5df87d3910603cd00993c97 100644 (file)
@@ -39,7 +39,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  * Portions taken from FreeBSD.
  *
- * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.36 2004/06/10 16:35:16 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.37 2004/06/10 22:26:20 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1934,7 +1934,7 @@ main(int argc, char *argv[])
 
    /* store binary directory */
    strcpy(bin_path, backend_exec);
-   *last_path_separator(bin_path) = '\0';
+   *last_dir_separator(bin_path) = '\0';
 
    if (!share_path)
    {
index 8d089a8e23e69ae9715b15d3507f0acbf777c5fe..1a4a4d4336144d63f50ffe581f494c92d5f62c17 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/port.h,v 1.41 2004/06/10 16:35:18 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/port.h,v 1.42 2004/06/10 22:26:20 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 bool set_noblock(int sock);
 
 /* Portable path handling for Unix/Win32 */
+
+/* Find the location of the first directory separator, return
+ * NULL if not found.
+ */
+extern char *first_dir_separator(const char *filename);
+
+/* Find the location of the last directory separator, return
+ * NULL if not found.
+ */
+extern char *last_dir_separator(const char *filename);
+
+/* Find the location of the first path separator (i.e. ':' on
+ * Unix, ';' on Windows), return NULL if not found.
+ */
 extern char *first_path_separator(const char *filename);
-extern char *last_path_separator(const char *filename);
+
 extern void canonicalize_path(char *path);
 extern const char *get_progname(const char *argv0);
 extern void get_share_path(const char *my_exec_path, char *ret_path);
index 82504723d12e5f5fba2edfcc3cc0dd46c65ec41f..838cedf5c94ac647204ea1b79413001eb205ddba 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/connect.c,v 1.21 2004/03/15 16:27:43 momjian Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/connect.c,v 1.22 2004/06/10 22:26:21 momjian Exp $ */
 
 #define POSTGRES_ECPG_INTERNAL
 #include "postgres_fe.h"
@@ -323,7 +323,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
                *tmp = '\0';
            }
 
-           tmp = last_path_separator(dbname + offset);
+           tmp = last_dir_separator(dbname + offset);
            if (tmp != NULL)    /* database name given */
            {
                realname = strdup(tmp + 1);
index fb2f14a20f077b9e64503be8f799099845bfe3a8..f8013e487c36d5b23c103bc512db7370ef29c5b6 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.87 2004/05/17 14:35:34 momjian Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.88 2004/06/10 22:26:23 momjian Exp $ */
 
 /* New main for ecpg, the PostgreSQL embedded SQL precompiler. */
 /* (C) Michael Meskes  Feb 5th, 1998 */
@@ -268,7 +268,7 @@ main(int argc, char *const argv[])
                strcpy(input_filename, argv[fnr]);
 
                /* take care of relative paths */
-               ptr2ext = last_path_separator(input_filename);
+               ptr2ext = last_dir_separator(input_filename);
                ptr2ext = (ptr2ext ? strrchr(ptr2ext, '.') : strrchr(input_filename, '.'));
 
                /* no extension? */
index f741509d080772b4d8f507a83e6c3c9ce301384e..720c47fb86b946bb52f6565373bdcd2ef0157737 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.273 2004/06/08 13:49:23 momjian Exp $
+ *   $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.274 2004/06/10 22:26:24 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -679,7 +679,7 @@ update_db_info(PGconn *conn)
                *tmp = '\0';
            }
 
-           tmp = last_path_separator(conn->dbName + offset);
+           tmp = last_dir_separator(conn->dbName + offset);
            if (tmp != NULL)    /* database name given */
            {
                if (conn->dbName)
index dbdc04b0ba27ef3b096394a5e382db57b2f1070d..c8ba1227a15e93681e60fdae5dbbdb53c22692c6 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/port/exec.c,v 1.15 2004/05/24 22:35:37 momjian Exp $
+ *   $PostgreSQL: pgsql/src/port/exec.c,v 1.16 2004/06/10 22:26:24 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 
 #define _(x) gettext(x)
 
-/* $PATH (or %PATH%) path separator */
-#ifdef WIN32
-#define PATHSEP ';'
-#else
-#define PATHSEP ':'
-#endif
-
 #ifndef S_IRUSR                    /* XXX [TRH] should be in a header */
 #define S_IRUSR         S_IREAD
 #define S_IWUSR         S_IWRITE
@@ -196,7 +189,7 @@ find_my_exec(const char *argv0, char *retpath)
     * it).
     */
    /* Does argv0 have a separator? */
-   if ((path = last_path_separator(argv0)))
+   if ((path = last_dir_separator(argv0)))
    {
        if (*++path == '\0')
        {
@@ -247,7 +240,7 @@ find_my_exec(const char *argv0, char *retpath)
            else
                startp = endp + 1;
 
-           endp = strchr(startp, PATHSEP);
+           endp = first_path_separator(startp);
            if (!endp)
                endp = startp + strlen(startp); /* point to end */
 
@@ -303,7 +296,7 @@ find_other_exec(const char *argv0, const char *target,
        return -1;
 
    /* Trim off program name and keep just directory */ 
-   *last_path_separator(retpath) = '\0';
+   *last_dir_separator(retpath) = '\0';
 
    snprintf(retpath + strlen(retpath), MAXPGPATH - strlen(retpath),
             "/%s%s", target, EXE);
index 7e6f5b4b73726557568245283955e3194238f8c8..864cb1e3a6abc1f7e83d90002ed00722e6bb3727 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/port/path.c,v 1.18 2004/06/08 13:49:23 momjian Exp $
+ *   $PostgreSQL: pgsql/src/port/path.c,v 1.19 2004/06/10 22:26:24 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 
 
 #ifndef WIN32
-#define    ISSEP(ch)   ((ch) == '/')
+#define    IS_DIR_SEP(ch)  ((ch) == '/')
 #else
-#define    ISSEP(ch)   ((ch) == '/' || (ch) == '\\')
+#define    IS_DIR_SEP(ch)  ((ch) == '/' || (ch) == '\\')
+#endif
+
+#ifndef WIN32
+#define    IS_PATH_SEP(ch) ((ch) == ':')
+#else
+#define    IS_PATH_SEP(ch) ((ch) == ';')
 #endif
 
 const static char *relative_path(const char *bin_path, const char *other_path);
@@ -33,7 +39,7 @@ static void trim_trailing_separator(char *path);
 /* Move to last of consecutive separators or to null byte */
 #define MOVE_TO_SEP_END(p) \
 { \
-   while (ISSEP((p)[0]) && (ISSEP((p)[1]) || !(p)[1])) \
+   while (IS_DIR_SEP((p)[0]) && (IS_DIR_SEP((p)[1]) || !(p)[1])) \
        (p)++; \
 }
 
@@ -46,6 +52,20 @@ do { \
        snprintf(ret_path, MAXPGPATH, "%s/%s", path, p); \
 } while (0)
 
+/*
+ * first_dir_separator
+ */
+char *
+first_dir_separator(const char *filename)
+{
+   char       *p;
+
+   for (p = (char *)filename; *p; p++)
+       if (IS_DIR_SEP(*p))
+           return p;
+   return NULL;
+}
+
 /*
  * first_path_separator
  */
@@ -55,22 +75,21 @@ first_path_separator(const char *filename)
    char       *p;
 
    for (p = (char *)filename; *p; p++)
-       if (ISSEP(*p))
+       if (IS_PATH_SEP(*p))
            return p;
    return NULL;
 }
 
-
 /*
- * last_path_separator
+ * last_dir_separator
  */
 char *
-last_path_separator(const char *filename)
+last_dir_separator(const char *filename)
 {
    char       *p, *ret = NULL;
 
    for (p = (char *)filename; *p; p++)
-       if (ISSEP(*p))
+       if (IS_DIR_SEP(*p))
            ret = p;
    return ret;
 }
@@ -108,10 +127,10 @@ canonicalize_path(char *path)
 const char *
 get_progname(const char *argv0)
 {
-   if (!last_path_separator(argv0))
+   if (!last_dir_separator(argv0))
        return argv0;
    else
-       return last_path_separator(argv0) + 1;
+       return last_dir_separator(argv0) + 1;
 }
 
 
@@ -307,7 +326,7 @@ relative_path(const char *bin_path, const char *other_path)
            break;
 
        /* Win32 filesystem is case insensitive */
-       if ((!ISSEP(*bin_path) || !ISSEP(*other_path)) &&
+       if ((!IS_DIR_SEP(*bin_path) || !IS_DIR_SEP(*other_path)) &&
 #ifndef WIN32
            *bin_path != *other_path)
 #else
@@ -315,7 +334,7 @@ relative_path(const char *bin_path, const char *other_path)
 #endif
                break;
 
-       if (ISSEP(*other_path))
+       if (IS_DIR_SEP(*other_path))
            other_sep = other_path + 1;     /* past separator */
            
        bin_path++;
@@ -327,7 +346,7 @@ relative_path(const char *bin_path, const char *other_path)
        return NULL;
 
    /* advance past directory name */   
-   while (!ISSEP(*bin_path) && *bin_path)
+   while (!IS_DIR_SEP(*bin_path) && *bin_path)
        bin_path++;
 
    MOVE_TO_SEP_END(bin_path);
@@ -353,9 +372,9 @@ trim_directory(char *path)
    if (path[0] == '\0')
        return;
 
-   for (p = path + strlen(path) - 1; ISSEP(*p) && p > path; p--)
+   for (p = path + strlen(path) - 1; IS_DIR_SEP(*p) && p > path; p--)
        ;
-   for (; !ISSEP(*p) && p > path; p--)
+   for (; !IS_DIR_SEP(*p) && p > path; p--)
        ;
    *p = '\0';
    return;
@@ -373,6 +392,6 @@ trim_trailing_separator(char *path)
    
    /* trim off trailing slashes */
    if (p > path)
-       for (p--; p >= path && ISSEP(*p); p--)
+       for (p--; p >= path && IS_DIR_SEP(*p); p--)
            *p = '\0';
 }