*
* 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 $
*
*-------------------------------------------------------------------------
*/
* 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 "&" */
#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
#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;
}