*** pg_ctl.c.bak	2010-04-07 11:48:51.000000000 +0800
--- pg_ctl.c	2010-08-11 23:07:52.468750000 +0800
***************
*** 69,74 ****
--- 69,82 ----
  	RUN_AS_SERVICE_COMMAND
  } CtlCommand;
  
+ 
+ typedef enum
+ {
+ 	PGCTL_START_AUTO,
+ 	PGCTL_START_DEMAND
+ } PgctlWin32StartType;
+ 
+ 
  #define DEFAULT_WAIT	60
  
  static bool do_wait = false;
***************
*** 87,92 ****
--- 95,101 ----
  static char *register_servicename = "PostgreSQL";		/* FIXME: + version ID? */
  static char *register_username = NULL;
  static char *register_password = NULL;
+ static PgctlWin32StartType win32_start_type = PGCTL_START_AUTO;
  static char *argv0 = NULL;
  static bool allow_core_files = false;
  
***************
*** 1132,1137 ****
--- 1141,1147 ----
  {
  	SC_HANDLE	hService;
  	SC_HANDLE	hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
+ 	DWORD		starttype;
  
  	if (hSCM == NULL)
  	{
***************
*** 1145,1153 ****
  		exit(1);
  	}
  
  	if ((hService = CreateService(hSCM, register_servicename, register_servicename,
  							   SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
! 								  SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
  								  pgwin32_CommandLine(true),
  	   NULL, NULL, "RPCSS\0", register_username, register_password)) == NULL)
  	{
--- 1155,1168 ----
  		exit(1);
  	}
  
+ 	if (win32_start_type == PGCTL_START_AUTO)
+ 		starttype = SERVICE_AUTO_START;
+ 	else
+ 		starttype = SERVICE_DEMAND_START;
+ 
  	if ((hService = CreateService(hSCM, register_servicename, register_servicename,
  							   SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
! 								  starttype, SERVICE_ERROR_NORMAL,
  								  pgwin32_CommandLine(true),
  	   NULL, NULL, "RPCSS\0", register_username, register_password)) == NULL)
  	{
***************
*** 1586,1592 ****
  	printf(_("  %s kill    SIGNALNAME PID\n"), progname);
  #if defined(WIN32) || defined(__CYGWIN__)
  	printf(_("  %s register   [-N SERVICENAME] [-U USERNAME] [-P PASSWORD] [-D DATADIR]\n"
! 		 "                    [-w] [-t SECS] [-o \"OPTIONS\"]\n"), progname);
  	printf(_("  %s unregister [-N SERVICENAME]\n"), progname);
  #endif
  
--- 1601,1607 ----
  	printf(_("  %s kill    SIGNALNAME PID\n"), progname);
  #if defined(WIN32) || defined(__CYGWIN__)
  	printf(_("  %s register   [-N SERVICENAME] [-U USERNAME] [-P PASSWORD] [-D DATADIR]\n"
! 		 "                    [-S START-TYPE] [-w] [-t SECS] [-o \"OPTIONS\"]\n"), progname);
  	printf(_("  %s unregister [-N SERVICENAME]\n"), progname);
  #endif
  
***************
*** 1627,1632 ****
--- 1642,1654 ----
  	printf(_("  -N SERVICENAME  service name with which to register PostgreSQL server\n"));
  	printf(_("  -P PASSWORD     password of account to register PostgreSQL server\n"));
  	printf(_("  -U USERNAME     user name of account to register PostgreSQL server\n"));
+ 	printf(_("  -S START-TYPE   service start type to register PostgreSQL server,\n"
+ 			"                  can be auto or demand\n"));
+ 
+ 	printf(_("\nStart types are:\n"));
+ 	printf(_("  auto       service start automatically during system startup\n"));
+ 	printf(_("  demand     service start on demand\n"));
+ 
  #endif
  
  	printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n"));
***************
*** 1696,1701 ****
--- 1718,1742 ----
  
  
  
+ #if defined(WIN32) || defined(__CYGWIN__)
+ static void
+ set_starttype(char *starttypeopt)
+ {
+ 	if (strcmp(starttypeopt, "a") == 0 || strcmp(starttypeopt, "auto") == 0)
+ 		win32_start_type = PGCTL_START_AUTO;
+ 	else if (strcmp(starttypeopt, "d") == 0 || strcmp(starttypeopt, "demand") == 0)
+ 		win32_start_type = PGCTL_START_DEMAND;
+ 	else
+ 	{
+ 		write_stderr(_("%s: unrecognized start type \"%s\"\n"), progname, starttypeopt);
+ 		do_advice();
+ 		exit(1);
+ 	}
+ }
+ #endif
+ 
+ 
+ 
  int
  main(int argc, char **argv)
  {
***************
*** 1772,1778 ****
  	/* process command-line options */
  	while (optind < argc)
  	{
! 		while ((c = getopt_long(argc, argv, "cD:l:m:N:o:p:P:st:U:wW", long_options, &option_index)) != -1)
  		{
  			switch (c)
  			{
--- 1813,1819 ----
  	/* process command-line options */
  	while (optind < argc)
  	{
! 		while ((c = getopt_long(argc, argv, "cD:l:m:N:o:p:P:sS:t:U:wW", long_options, &option_index)) != -1)
  		{
  			switch (c)
  			{
***************
*** 1819,1824 ****
--- 1860,1870 ----
  				case 's':
  					silent_mode = true;
  					break;
+ #if defined(WIN32) || defined(__CYGWIN__)
+ 				case 'S':
+ 					set_starttype(optarg);
+ 					break;
+ #endif
  				case 't':
  					wait_seconds = atoi(optarg);
  					break;
