]> granicus.if.org Git - postgresql/commitdiff
More restructuring to use Win32 START with paths needing quotes.
authorBruce Momjian <bruce@momjian.us>
Fri, 11 Jun 2004 00:57:25 +0000 (00:57 +0000)
committerBruce Momjian <bruce@momjian.us>
Fri, 11 Jun 2004 00:57:25 +0000 (00:57 +0000)
src/bin/pg_ctl/pg_ctl.c

index fbf11fbbe159067b16624ff189d0ee00c0b5cefb..d7d44afbbffceddc362082c89b977d91155c0135 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.13 2004/06/10 22:20:53 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.14 2004/06/11 00:57:25 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -221,6 +221,41 @@ start_postmaster(void)
         * to pass everything to a shell to process them.
         */
        char            cmd[MAXPGPATH];
+       int                     ret;
+       char            *pgexec = postgres_path;
+       
+#ifdef WIN32
+       /*
+        *      Win32 has a problem with the interaction between START and system().
+        *      There is no way to quote the executable name passed to START.
+        *      Therefore, we put the executable name in a temporary batch file
+        *      and run it via START.
+        */
+       char            tmp[MAXPGPATH] = "C:\\PG_CTL_XXXXXX", /* good location? */
+                               bat[MAXPGPATH];
+       int                     fd = mkstemp(tmp);
+
+       if (fd == -1)
+       {
+               fprintf(stderr, _("%s: cannot create batch file %s to start server: %s\n"),
+                                               progname, tmp, strerror(errno));
+               exit(1);
+       }
+       write(fd, postgres_path, strlen(postgres_path));
+       write(fd, "\n", 1);
+       close(fd);
+
+       strcpy(bat, tmp);
+       strcat(bat, ".BAT");
+       pgexec = bat;
+       if (rename(tmp, bat) == -1)
+       {
+               fprintf(stderr, _("%s: cannot rename batch file %s to %s: %s\n"),
+                                               progname, tmp, bat, strerror(errno));
+               unlink(tmp);
+               exit(1);
+       }
+#endif
 
        if (log_file != NULL)
                /* Win32 needs START /B rather than "&" */
@@ -229,7 +264,7 @@ start_postmaster(void)
 #else
                snprintf(cmd, MAXPGPATH, "%sSTART /B \"%s\" %s < \"%s\" >> \"%s\" 2>&1%s",
 #endif
-                                SYSTEMQUOTE, postgres_path, post_opts, DEVNULL, log_file,
+                                SYSTEMQUOTE, pgexec, post_opts, DEVNULL, log_file,
                                 SYSTEMQUOTE);
        else
 #ifndef WIN32
@@ -237,8 +272,20 @@ start_postmaster(void)
 #else
                snprintf(cmd, MAXPGPATH, "%sSTART /B \"%s\" %s < \"%s\" 2>&1%s",
 #endif
-                                SYSTEMQUOTE, postgres_path, post_opts, DEVNULL, SYSTEMQUOTE);
-       return system(cmd);
+                                SYSTEMQUOTE, pgexec, post_opts, DEVNULL, SYSTEMQUOTE);
+
+       ret = system(cmd);
+
+#ifdef WIN32
+       /* We are unlinking it while it is running, but that should be OK */
+       if (unlink(bat))
+       {
+               fprintf(stderr, _("%s: cannot remove batch file %s: %s\n"),
+                                               progname, bat, strerror(errno));
+               exit(1);
+       }
+#endif
+       return ret;
 }