After digging, I found START can accept a quoted executable name if you
put a title of "" before it. I have remove the batch file hack and
documented this requirement.
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (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.15
diff -c -c -r1.15 pg_ctl.c
*** src/bin/pg_ctl/pg_ctl.c 11 Jun 2004 04:17:21 -0000 1.15
--- src/bin/pg_ctl/pg_ctl.c 11 Jun 2004 16:32:45 -0000
***************
*** 221,291 ****
* 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 "&" */
#ifndef WIN32
snprintf(cmd, MAXPGPATH, "%s\"%s\" %s < \"%s\" >> \"%s\" 2>&1 &%s",
#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
snprintf(cmd, MAXPGPATH, "%s\"%s\" %s < \"%s\" 2>&1 &%s",
#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;
}
--- 221,253 ----
* to pass everything to a shell to process them.
*/
char cmd[MAXPGPATH];
/*
! * Win32 needs START /B rather than "&".
! *
! * Win32 has a problem with START and quoted executable names.
! * You must add a "" as the title at the beginning so you can quote
! * the executable name:
! * http://www.winnetmag.com/Article/ArticleID/14589/14589.html
! * http://dev.remotenetworktechnology.com/cmd/cmdfaq.htm
*/
if (log_file != NULL)
#ifndef WIN32
snprintf(cmd, MAXPGPATH, "%s\"%s\" %s < \"%s\" >> \"%s\" 2>&1 &%s",
#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
snprintf(cmd, MAXPGPATH, "%s\"%s\" %s < \"%s\" 2>&1 &%s",
#else
! snprintf(cmd, MAXPGPATH, "%sSTART /B \"\" \"%s\" %s < \"%s\" 2>&1%s",
#endif
! SYSTEMQUOTE, postgres_path, post_opts, DEVNULL, SYSTEMQUOTE);
! return system(cmd);
}