This applied patch changes the way pg_ctl starts on Win32.
Using START, it is not possible to quote the executable name, who's
directory might have spaces:
START /B /program files/x.exe
The fix is to create a temporary batch file in C:\ containing:
/program files/x.exe
and run START with the batch name:
START /B C:\PG_CTL_323223.BAT
then unlink the batch file.
--
Bruce Momjian | http://candle.pha.pa.us
[EMAIL PROTECTED] | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
Index: src/bin/pg_ctl/pg_ctl.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/pg_ctl/pg_ctl.c,v
retrieving revision 1.13
diff -c -c -r1.13 pg_ctl.c
*** src/bin/pg_ctl/pg_ctl.c 10 Jun 2004 22:20:53 -0000 1.13
--- src/bin/pg_ctl/pg_ctl.c 11 Jun 2004 00:56:22 -0000
***************
*** 221,226 ****
--- 221,261 ----
* 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,235 ****
#else
snprintf(cmd, MAXPGPATH, "%sSTART /B \"%s\" %s < \"%s\" >> \"%s\"
2>&1%s",
#endif
! SYSTEMQUOTE, postgres_path, post_opts, DEVNULL,
log_file,
SYSTEMQUOTE);
else
#ifndef WIN32
--- 264,270 ----
#else
snprintf(cmd, MAXPGPATH, "%sSTART /B \"%s\" %s < \"%s\" >> \"%s\"
2>&1%s",
#endif
! SYSTEMQUOTE, pgexec, post_opts, DEVNULL, log_file,
SYSTEMQUOTE);
else
#ifndef WIN32
***************
*** 237,244 ****
#else
snprintf(cmd, MAXPGPATH, "%sSTART /B \"%s\" %s < \"%s\" 2>&1%s",
#endif
! SYSTEMQUOTE, postgres_path, post_opts, DEVNULL,
SYSTEMQUOTE);
! return system(cmd);
}
--- 272,291 ----
#else
snprintf(cmd, MAXPGPATH, "%sSTART /B \"%s\" %s < \"%s\" 2>&1%s",
#endif
! 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;
}
---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?
http://archives.postgresql.org