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