]> granicus.if.org Git - postgresql/commitdiff
Remove pstrdup() call from exec.c because DLLIMPORT flag on
authorBruce Momjian <bruce@momjian.us>
Mon, 24 May 2004 22:35:37 +0000 (22:35 +0000)
committerBruce Momjian <bruce@momjian.us>
Mon, 24 May 2004 22:35:37 +0000 (22:35 +0000)
CurrentMemoryContext caused compile problems.

Recode to not make a copy of the PATH but copy parts out into MAXPGPATH
variables.

src/port/exec.c

index 5da1b0811fe41479d945ea59cd84c4575fdafcff..dbdc04b0ba27ef3b096394a5e382db57b2f1070d 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/port/exec.c,v 1.14 2004/05/24 20:23:50 momjian Exp $
+ *       $PostgreSQL: pgsql/src/port/exec.c,v 1.15 2004/05/24 22:35:37 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 
 #define _(x) gettext(x)
 
-#ifdef FRONTEND
-#undef pstrdup
-#define pstrdup(p)     strdup(p)
-#define pfree(p)       free(p)
-#endif
-
 /* $PATH (or %PATH%) path separator */
 #ifdef WIN32
 #define PATHSEP ';'
@@ -185,11 +179,8 @@ validate_exec(const char *path)
 int
 find_my_exec(const char *argv0, char *retpath)
 {
-       char            cwd[MAXPGPATH];
-       char       *p;
-       char       *path,
-                          *startp,
-                          *endp;
+       char            cwd[MAXPGPATH], test_path[MAXPGPATH];
+       char       *path;
 
        if (!getcwd(cwd, MAXPGPATH))
                cwd[0] = '\0';
@@ -205,9 +196,9 @@ find_my_exec(const char *argv0, char *retpath)
         * it).
         */
        /* Does argv0 have a separator? */
-       if ((p = last_path_separator(argv0)))
+       if ((path = last_path_separator(argv0)))
        {
-               if (*++p == '\0')
+               if (*++path == '\0')
                {
                        log_error("argv[0] ends with a path separator \"%s\"", argv0);
                        return -1;
@@ -245,41 +236,41 @@ find_my_exec(const char *argv0, char *retpath)
         * Second try: since no explicit path was supplied, the user must have
         * been relying on PATH.  We'll use the same PATH.
         */
-       if ((p = getenv("PATH")) && *p)
+       if ((path = getenv("PATH")) && *path)
        {
-               path = pstrdup(p);              /* make a modifiable copy */
-               for (startp = path, endp = strchr(path, PATHSEP);
-                        startp && *startp;
-                        startp = endp + 1, endp = strchr(startp, PATHSEP))
+               char       *startp = NULL, *endp = NULL;
+
+               do
                {
-                       if (startp == endp) /* it's a "::" */
-                               continue;
-                       if (endp)
-                               *endp = '\0';
+                       if (!startp)
+                               startp = path;
+                       else
+                               startp = endp + 1;
 
-                       if (is_absolute_path(startp))
-                               snprintf(retpath, MAXPGPATH, "%s/%s", startp, argv0);
+                       endp = strchr(startp, PATHSEP);
+                       if (!endp)
+                               endp = startp + strlen(startp); /* point to end */
+
+                       StrNCpy(test_path, startp, Min(endp - startp + 1, MAXPGPATH));
+
+                       if (is_absolute_path(test_path))
+                               snprintf(retpath, MAXPGPATH, "%s/%s", test_path, argv0);
                        else
-                               snprintf(retpath, MAXPGPATH, "%s/%s/%s", cwd, startp, argv0);
+                               snprintf(retpath, MAXPGPATH, "%s/%s/%s", cwd, test_path, argv0);
 
                        canonicalize_path(retpath);
                        switch (validate_exec(retpath))
                        {
                                case 0: /* found ok */
                                        win32_make_absolute(retpath);
-                                       pfree(path);
                                        return 0;
                                case -1:                /* wasn't even a candidate, keep looking */
-                                       break;
+                                       continue;
                                case -2:                /* found but disqualified */
                                        log_error("could not read binary \"%s\"", retpath);
-                                       pfree(path);
-                                       return -1;
+                                       continue;
                        }
-                       if (!endp)                      /* last one */
-                               break;
-               }
-               pfree(path);
+               } while (*endp);
        }
 
        log_error("could not find a \"%s\" to execute", argv0);