diff --git a/doc/src/sgml/ref/postgres-ref.sgml b/doc/src/sgml/ref/postgres-ref.sgml
new file mode 100644
index 8e225e4..731682c
*** a/doc/src/sgml/ref/postgres-ref.sgml
--- b/doc/src/sgml/ref/postgres-ref.sgml
*************** PostgreSQL documentation
*** 590,595 ****
--- 590,620 ----
+
+
+ Platform-specific Options
+
+
+
+
+ background execution
+ Windows
+
+
+
+ This option is effective on Windows only and ignored on all other platforms.
+
+
+ It instructs the server to ignore the signals caused by pressing
+ Ctrl>C>> or
+ Ctrl>Break>>
+ in a console window. It is used automatically by
+ pg_ctl when called with the
+ subcommand.
+
+
+
+
diff --git a/src/backend/port/win32/signal.c b/src/backend/port/win32/signal.c
new file mode 100644
index 322b857..91f8243
*** a/src/backend/port/win32/signal.c
--- b/src/backend/port/win32/signal.c
*************** static pqsigfunc pg_signal_defaults[PG_S
*** 41,46 ****
--- 41,48 ----
static DWORD WINAPI pg_signal_thread(LPVOID param);
static BOOL WINAPI pg_console_handler(DWORD dwCtrlType);
+ extern bool IsBackgroundPostmaster;
+ extern bool IsUnderPostmaster;
/*
* pg_usleep --- delay the specified number of microseconds, but
*************** pg_signal_thread(LPVOID param)
*** 346,358 ****
static BOOL WINAPI
pg_console_handler(DWORD dwCtrlType)
{
! if (dwCtrlType == CTRL_C_EVENT ||
! dwCtrlType == CTRL_BREAK_EVENT ||
! dwCtrlType == CTRL_CLOSE_EVENT ||
! dwCtrlType == CTRL_SHUTDOWN_EVENT)
{
pg_queue_signal(SIGINT);
! return TRUE;
}
! return FALSE;
}
--- 348,369 ----
static BOOL WINAPI
pg_console_handler(DWORD dwCtrlType)
{
! switch (dwCtrlType)
{
+ case CTRL_C_EVENT:
+ case CTRL_BREAK_EVENT:
+ /* Ignore if started with "pg_ctl start". */
+ if (IsUnderPostmaster || IsBackgroundPostmaster)
+ break;
+ /* fall through */
+ case CTRL_CLOSE_EVENT:
+ case CTRL_SHUTDOWN_EVENT:
pg_queue_signal(SIGINT);
! break;
! default:
! return FALSE;
}
!
! return TRUE;
}
+
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
new file mode 100644
index b573fd8..d1ce978
*** a/src/backend/postmaster/postmaster.c
--- b/src/backend/postmaster/postmaster.c
*************** PostmasterMain(int argc, char *argv[])
*** 751,771 ****
*value;
ParseLongOption(optarg, &name, &value);
! if (!value)
{
! if (opt == '-')
! ereport(ERROR,
! (errcode(ERRCODE_SYNTAX_ERROR),
! errmsg("--%s requires a value",
! optarg)));
! else
! ereport(ERROR,
! (errcode(ERRCODE_SYNTAX_ERROR),
! errmsg("-c %s requires a value",
! optarg)));
}
- SetConfigOption(name, value, PGC_POSTMASTER, PGC_S_ARGV);
free(name);
if (value)
free(value);
--- 751,780 ----
*value;
ParseLongOption(optarg, &name, &value);
!
! #ifdef WIN32
! if (strcmp(name, "background") == 0)
! IsBackgroundPostmaster = true;
! else
! #endif
{
! if (!value)
! {
! if (opt == '-')
! ereport(ERROR,
! (errcode(ERRCODE_SYNTAX_ERROR),
! errmsg("--%s requires a value",
! optarg)));
! else
! ereport(ERROR,
! (errcode(ERRCODE_SYNTAX_ERROR),
! errmsg("-c %s requires a value",
! optarg)));
! }
!
! SetConfigOption(name, value, PGC_POSTMASTER, PGC_S_ARGV);
}
free(name);
if (value)
free(value);
diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c
new file mode 100644
index be74835..051b33d
*** a/src/backend/utils/init/globals.c
--- b/src/backend/utils/init/globals.c
*************** bool IsUnderPostmaster = false;
*** 89,94 ****
--- 89,107 ----
bool IsBinaryUpgrade = false;
bool IsBackgroundWorker = false;
+ #ifdef WIN32
+ /*
+ * This controls whether the postmaster process will respond to incoming
+ * console events (Ctrl-C, Ctrl-Break). If the database was started using
+ * "pg_ctl start", it is running in the background, but will still
+ * receive the signals generated by these key combinations.
+ *
+ * The reaction of the other server processes is controlled by
+ * IsUnderPostmaster instead.
+ */
+ bool IsBackgroundPostmaster = false;
+ #endif
+
bool ExitOnAnyError = false;
int DateStyle = USE_ISO_DATES;
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
new file mode 100644
index fc87e7d..e0d676e
*** a/src/bin/pg_ctl/pg_ctl.c
--- b/src/bin/pg_ctl/pg_ctl.c
*************** start_postmaster(void)
*** 453,462 ****
PROCESS_INFORMATION pi;
if (log_file != NULL)
! snprintf(cmd, MAXPGPATH, "CMD /C " SYSTEMQUOTE "\"%s\" %s%s < \"%s\" >> \"%s\" 2>&1" SYSTEMQUOTE,
exec_path, pgdata_opt, post_opts, DEVNULL, log_file);
else
! snprintf(cmd, MAXPGPATH, "CMD /C " SYSTEMQUOTE "\"%s\" %s%s < \"%s\" 2>&1" SYSTEMQUOTE,
exec_path, pgdata_opt, post_opts, DEVNULL);
if (!CreateRestrictedProcess(cmd, &pi, false))
--- 453,462 ----
PROCESS_INFORMATION pi;
if (log_file != NULL)
! snprintf(cmd, MAXPGPATH, "CMD /C " SYSTEMQUOTE "\"%s\" %s%s --background < \"%s\" >> \"%s\" 2>&1" SYSTEMQUOTE,
exec_path, pgdata_opt, post_opts, DEVNULL, log_file);
else
! snprintf(cmd, MAXPGPATH, "CMD /C " SYSTEMQUOTE "\"%s\" %s%s --background < \"%s\" 2>&1" SYSTEMQUOTE,
exec_path, pgdata_opt, post_opts, DEVNULL);
if (!CreateRestrictedProcess(cmd, &pi, false))
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
new file mode 100644
index 0d61b82..3a527e9
*** a/src/include/miscadmin.h
--- b/src/include/miscadmin.h
*************** extern PGDLLIMPORT bool IsUnderPostmaste
*** 136,141 ****
--- 136,145 ----
extern bool IsBackgroundWorker;
extern bool IsBinaryUpgrade;
+ #ifdef WIN32
+ extern bool IsBackgroundPostmaster;
+ #endif
+
extern bool ExitOnAnyError;
extern PGDLLIMPORT char *DataDir;