*** a/doc/src/sgml/ref/pg_ctl-ref.sgml --- b/doc/src/sgml/ref/pg_ctl-ref.sgml *************** *** 96,101 **** PostgreSQL documentation --- 96,107 ---- -U username -P password -D datadir + -S + + a[uto] + d[emand] + + -w -t seconds -o options *************** *** 377,382 **** PostgreSQL documentation --- 383,400 ---- + + + + + + Start type of the system service to register. start-type can + be auto, or demand, or + the first letter of one of these two. If this is omitted, + auto is used. + + + *** a/src/bin/pg_ctl/pg_ctl.c --- b/src/bin/pg_ctl/pg_ctl.c *************** *** 69,74 **** typedef enum --- 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 **** static char *exec_path = NULL; --- 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 **** pgwin32_doRegister(void) --- 1141,1147 ---- { SC_HANDLE hService; SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); + DWORD starttype; if (hSCM == NULL) { *************** *** 1145,1153 **** pgwin32_doRegister(void) 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 **** do_help(void) 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 **** do_help(void) --- 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 .\n")); *************** *** 1696,1701 **** set_sig(char *signame) --- 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 **** main(int argc, char **argv) /* 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 **** main(int argc, char **argv) --- 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;