pg_ctl_win.diff

text/plain

Filename: pg_ctl_win.diff
Type: text/plain
Part: 0
Message: Re: Fw: patch for pg_ctl.c to add windows service start-type

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
File+
doc/src/sgml/ref/pg_ctl-ref.sgml 12 0
src/bin/pg_ctl/pg_ctl.c 49 3
diff --git a/doc/src/sgml/ref/pg_ctl-ref.sgml b/doc/src/sgml/ref/pg_ctl-ref.sgml
index 20d87bb..a4e675e 100644
--- a/doc/src/sgml/ref/pg_ctl-ref.sgml
+++ b/doc/src/sgml/ref/pg_ctl-ref.sgml
@@ -377,6 +377,18 @@ PostgreSQL documentation
       </para>
      </listitem>
     </varlistentry>
+
+    <varlistentry>
+     <term><option>-S <replaceable class="parameter"></replaceable></option></term>
+     <listitem>
+      <para>
+       Start type of the system service to register.  start-type can
+       be <literal>auto</literal>, or <literal>demand</literal>, or
+       the first letter of one of these two. If this is omitted,
+       <literal>auto</literal> is used.
+      </para>
+     </listitem>
+    </varlistentry>
    </variablelist>
   </refsect2>
 
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index 1caec12..42a8aa9 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -69,6 +69,14 @@ typedef enum
 	RUN_AS_SERVICE_COMMAND
 } CtlCommand;
 
+
+typedef enum
+{
+	PGCTL_START_AUTO,
+	PGCTL_START_DEMAND
+} PgctlWin32StartType;
+
+
 #define DEFAULT_WAIT	60
 
 static bool do_wait = false;
@@ -87,6 +95,7 @@ static char *exec_path = NULL;
 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,6 +1141,7 @@ pgwin32_doRegister(void)
 {
 	SC_HANDLE	hService;
 	SC_HANDLE	hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
+	DWORD		starttype;
 
 	if (hSCM == NULL)
 	{
@@ -1145,9 +1155,14 @@ pgwin32_doRegister(void)
 		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,
-								  SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
+								  starttype, SERVICE_ERROR_NORMAL,
 								  pgwin32_CommandLine(true),
 	   NULL, NULL, "RPCSS\0", register_username, register_password)) == NULL)
 	{
@@ -1586,7 +1601,7 @@ 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);
+		 "                    [-S START-TYPE] [-w] [-t SECS] [-o \"OPTIONS\"]\n"), progname);
 	printf(_("  %s unregister [-N SERVICENAME]\n"), progname);
 #endif
 
@@ -1627,6 +1642,13 @@ do_help(void)
 	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,6 +1718,25 @@ set_sig(char *signame)
 
 
 
+#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,7 +1813,7 @@ 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)
+		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,6 +1860,11 @@ main(int argc, char **argv)
 				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;