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);
  }
  
  
