*/
#include "postgres.h"
-#include <time.h>
#include <unistd.h>
#include <signal.h>
char *userDoption = NULL;
/*
- * initialize globals
+ * Initialize process environment (already done if under postmaster, but
+ * not if standalone).
*/
- MyProcPid = getpid();
-
- MyStartTime = time(NULL);
-
- /* Compute paths, if we didn't inherit them from postmaster */
- if (my_exec_path[0] == '\0')
- {
- if (find_my_exec(progname, my_exec_path) < 0)
- elog(FATAL, "%s: could not locate my own executable path",
- progname);
- }
+ if (!IsUnderPostmaster)
+ InitStandaloneProcess(argv[0]);
/*
* process command arguments
{
if (IsUnderPostmaster)
{
- /*
- * If possible, make this process a group leader, so that the
- * postmaster can signal any child processes too.
- */
-#ifdef HAVE_SETSID
- if (setsid() < 0)
- elog(FATAL, "setsid() failed: %m");
-#endif
-
/*
* Properly accept or ignore signals the postmaster might send us
*/
#include <signal.h>
#include <sys/types.h>
#include <sys/time.h>
-#include <time.h>
#include <unistd.h>
#include "access/heapam.h"
#ifndef EXEC_BACKEND
case 0:
/* in postmaster child ... */
+ InitPostmasterChild();
+
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
- /* Lose the postmaster's on-exit routines */
- on_exit_reset();
-
AutoVacLauncherMain(0, NULL);
break;
#endif
{
sigjmp_buf local_sigjmp_buf;
- /* we are a postmaster subprocess now */
- IsUnderPostmaster = true;
am_autovacuum_launcher = true;
- /* reset MyProcPid */
- MyProcPid = getpid();
-
- /* record Start Time for logging */
- MyStartTime = time(NULL);
-
/* Identify myself via ps */
init_ps_display("autovacuum launcher process", "", "", "");
SetProcessingMode(InitProcessing);
- /*
- * If possible, make this process a group leader, so that the postmaster
- * can signal any child processes too. (autovacuum probably never has any
- * child processes, but for consistency we make all postmaster child
- * processes do this.)
- */
-#ifdef HAVE_SETSID
- if (setsid() < 0)
- elog(FATAL, "setsid() failed: %m");
-#endif
-
/*
* Set up signal handlers. We operate on databases much like a regular
* backend, so we use the same signal handling. See equivalent code in
#ifndef EXEC_BACKEND
case 0:
/* in postmaster child ... */
+ InitPostmasterChild();
+
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
- /* Lose the postmaster's on-exit routines */
- on_exit_reset();
-
AutoVacWorkerMain(0, NULL);
break;
#endif
sigjmp_buf local_sigjmp_buf;
Oid dbid;
- /* we are a postmaster subprocess now */
- IsUnderPostmaster = true;
am_autovacuum_worker = true;
- /* reset MyProcPid */
- MyProcPid = getpid();
-
- /* record Start Time for logging */
- MyStartTime = time(NULL);
-
/* Identify myself via ps */
init_ps_display("autovacuum worker process", "", "", "");
SetProcessingMode(InitProcessing);
- /*
- * If possible, make this process a group leader, so that the postmaster
- * can signal any child processes too. (autovacuum probably never has any
- * child processes, but for consistency we make all postmaster child
- * processes do this.)
- */
-#ifdef HAVE_SETSID
- if (setsid() < 0)
- elog(FATAL, "setsid() failed: %m");
-#endif
-
/*
* Set up signal handlers. We operate on databases much like a regular
* backend, so we use the same signal handling. See equivalent code in
#include "postgres.h"
#include <unistd.h>
-#include <time.h>
#include "miscadmin.h"
#include "libpq/pqsignal.h"
if (worker == NULL)
elog(FATAL, "unable to find bgworker entry");
- /* we are a postmaster subprocess now */
- IsUnderPostmaster = true;
IsBackgroundWorker = true;
- /* reset MyProcPid */
- MyProcPid = getpid();
-
- /* record Start Time for logging */
- MyStartTime = time(NULL);
-
/* Identify myself via ps */
snprintf(buf, MAXPGPATH, "bgworker: %s", worker->bgw_name);
init_ps_display(buf, "", "", "");
if (PostAuthDelay > 0)
pg_usleep(PostAuthDelay * 1000000L);
- /*
- * If possible, make this process a group leader, so that the postmaster
- * can signal any child processes too.
- */
-#ifdef HAVE_SETSID
- if (setsid() < 0)
- elog(FATAL, "setsid() failed: %m");
-#endif
-
/*
* Set up signal handlers.
*/
#include <signal.h>
#include <sys/time.h>
-#include <time.h>
#include <unistd.h>
#include "access/xlog.h"
MemoryContext bgwriter_context;
bool prev_hibernate;
- /*
- * If possible, make this process a group leader, so that the postmaster
- * can signal any child processes too. (bgwriter probably never has any
- * child processes, but for consistency we make all postmaster child
- * processes do this.)
- */
-#ifdef HAVE_SETSID
- if (setsid() < 0)
- elog(FATAL, "setsid() failed: %m");
-#endif
-
/*
* Properly accept or ignore signals the postmaster might send us.
*
CheckpointerShmem->checkpointer_pid = MyProcPid;
- /*
- * If possible, make this process a group leader, so that the postmaster
- * can signal any child processes too. (checkpointer probably never has
- * any child processes, but for consistency we make all postmaster child
- * processes do this.)
- */
-#ifdef HAVE_SETSID
- if (setsid() < 0)
- elog(FATAL, "setsid() failed: %m");
-#endif
-
/*
* Properly accept or ignore signals the postmaster might send us
*
#ifndef EXEC_BACKEND
case 0:
/* in postmaster child ... */
+ InitPostmasterChild();
+
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
- /* Lose the postmaster's on-exit routines */
- on_exit_reset();
-
/* Drop our connection to postmaster's shared memory, as well */
dsm_detach_all();
PGSharedMemoryDetach();
NON_EXEC_STATIC void
PgArchiverMain(int argc, char *argv[])
{
- IsUnderPostmaster = true; /* we are a postmaster subprocess now */
-
- MyProcPid = getpid(); /* reset MyProcPid */
-
- MyStartTime = time(NULL); /* record Start Time for logging */
-
- /*
- * If possible, make this process a group leader, so that the postmaster
- * can signal any child processes too.
- */
-#ifdef HAVE_SETSID
- if (setsid() < 0)
- elog(FATAL, "setsid() failed: %m");
-#endif
-
InitializeLatchSupport(); /* needed for latch waits */
InitLatch(&mainloop_latch); /* initialize latch used in main loop */
#ifndef EXEC_BACKEND
case 0:
/* in postmaster child ... */
+ InitPostmasterChild();
+
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
- /* Lose the postmaster's on-exit routines */
- on_exit_reset();
-
/* Drop our connection to postmaster's shared memory, as well */
dsm_detach_all();
PGSharedMemoryDetach();
PgStat_Msg msg;
int wr;
- IsUnderPostmaster = true; /* we are a postmaster subprocess now */
-
- MyProcPid = getpid(); /* reset MyProcPid */
-
- MyStartTime = time(NULL); /* record Start Time for logging */
-
- /*
- * If possible, make this process a group leader, so that the postmaster
- * can signal any child processes too. (pgstat probably never has any
- * child processes, but for consistency we make all postmaster child
- * processes do this.)
- */
-#ifdef HAVE_SETSID
- if (setsid() < 0)
- elog(FATAL, "setsid() failed: %m");
-#endif
-
InitializeLatchSupport(); /* needed for latch waits */
/* Initialize private latch for use by signal handlers */
{
free(bn);
- /*
- * Let's clean up ourselves as the postmaster child, and close the
- * postmaster's listen sockets. (In EXEC_BACKEND case this is all
- * done in SubPostmasterMain.)
- */
- IsUnderPostmaster = true; /* we are a postmaster subprocess now */
-
- MyProcPid = getpid(); /* reset MyProcPid */
-
- MyStartTime = time(NULL);
-
- /* We don't want the postmaster's proc_exit() handlers */
- on_exit_reset();
+ /* Detangle from postmaster */
+ InitPostmasterChild();
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
pq_init(); /* initialize libpq to talk to client */
whereToSendOutput = DestRemote; /* now safe to ereport to client */
- /*
- * If possible, make this process a group leader, so that the postmaster
- * can signal any child processes too. (We do this now on the off chance
- * that something might spawn a child process during authentication.)
- */
-#ifdef HAVE_SETSID
- if (setsid() < 0)
- elog(FATAL, "setsid() failed: %m");
-#endif
-
/*
* We arrange for a simple exit(1) if we receive SIGTERM or SIGQUIT or
* timeout while trying to collect the startup packet. Otherwise the
{
Port port;
- /* Do this sooner rather than later... */
- IsUnderPostmaster = true; /* we are a postmaster subprocess now */
-
- MyProcPid = getpid(); /* reset MyProcPid */
-
- MyStartTime = time(NULL);
-
- /*
- * make sure stderr is in binary mode before anything can possibly be
- * written to it, in case it's actually the syslogger pipe, so the pipe
- * chunking protocol isn't disturbed. Non-logpipe data gets translated on
- * redirection (e.g. via pg_ctl -l) anyway.
- */
-#ifdef WIN32
- _setmode(fileno(stderr), _O_BINARY);
-#endif
-
- /* Lose the postmaster's on-exit routines (really a no-op) */
- on_exit_reset();
-
/* In EXEC_BACKEND case we will not have inherited these settings */
IsPostmasterEnvironment = true;
whereToSendOutput = DestNone;
+ /* Setup as postmaster child */
+ InitPostmasterChild();
+
/* Setup essential subsystems (to ensure elog() behaves sanely) */
InitializeGUCOptions();
/* do this as early as possible; in particular, before InitProcess() */
IsBackgroundWorker = true;
+ InitPostmasterChild();
+
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
if (pid == 0) /* child */
{
- IsUnderPostmaster = true; /* we are a postmaster subprocess now */
+ InitPostmasterChild();
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
- /* Lose the postmaster's on-exit routines and port connections */
- on_exit_reset();
-
/* Release postmaster's working memory context */
MemoryContextSwitchTo(TopMemoryContext);
MemoryContextDelete(PostmasterContext);
#ifndef EXEC_BACKEND
case 0:
/* in postmaster child ... */
+ InitPostmasterChild();
+
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
- /* Lose the postmaster's on-exit routines */
- on_exit_reset();
-
/* Do NOT release postmaster's working memory context */
MyBgworkerEntry = &rw->rw_worker;
void
StartupProcessMain(void)
{
- /*
- * If possible, make this process a group leader, so that the postmaster
- * can signal any child processes too.
- */
-#ifdef HAVE_SETSID
- if (setsid() < 0)
- elog(FATAL, "setsid() failed: %m");
-#endif
-
/*
* Properly accept or ignore signals the postmaster might send us.
*/
int currentLogRotationAge;
pg_time_t now;
- IsUnderPostmaster = true; /* we are a postmaster subprocess now */
-
- MyProcPid = getpid(); /* reset MyProcPid */
-
- MyStartTime = time(NULL); /* set our start time in case we call elog */
now = MyStartTime;
#ifdef EXEC_BACKEND
syslogPipe[1] = 0;
#endif
- /*
- * If possible, make this process a group leader, so that the postmaster
- * can signal any child processes too. (syslogger probably never has any
- * child processes, but for consistency we make all postmaster child
- * processes do this.)
- */
-#ifdef HAVE_SETSID
- if (setsid() < 0)
- elog(FATAL, "setsid() failed: %m");
-#endif
+ InitializeLatchSupport(); /* needed for latch waits */
- InitializeLatchSupport(); /* needed for latch waits */
/* Initialize private latch for use by signal handlers */
InitLatch(&sysLoggerLatch);
#ifndef EXEC_BACKEND
case 0:
/* in postmaster child ... */
+ InitPostmasterChild();
+
/* Close the postmaster's sockets */
ClosePostmasterPorts(true);
- /* Lose the postmaster's on-exit routines */
- on_exit_reset();
-
/* Drop our connection to postmaster's shared memory, as well */
dsm_detach_all();
PGSharedMemoryDetach();
#include "postgres.h"
#include <signal.h>
-#include <sys/time.h>
-#include <time.h>
#include <unistd.h>
#include "access/xlog.h"
int left_till_hibernate;
bool hibernating;
- /*
- * If possible, make this process a group leader, so that the postmaster
- * can signal any child processes too. (walwriter probably never has any
- * child processes, but for consistency we make all postmaster child
- * processes do this.)
- */
-#ifdef HAVE_SETSID
- if (setsid() < 0)
- elog(FATAL, "setsid() failed: %m");
-#endif
-
/*
* Properly accept or ignore signals the postmaster might send us
*
OwnLatch(&walrcv->latch);
- /*
- * If possible, make this process a group leader, so that the postmaster
- * can signal any child processes too. (walreceiver probably never has
- * any child processes, but for consistency we make all postmaster child
- * processes do this.)
- */
-#ifdef HAVE_SETSID
- if (setsid() < 0)
- elog(FATAL, "setsid() failed: %m");
-#endif
-
/* Properly accept or ignore signals the postmaster might send us */
pqsignal(SIGHUP, WalRcvSigHupHandler); /* set flag to read config
* file */
#include <fcntl.h>
#include <limits.h>
#include <signal.h>
-#include <time.h>
#include <unistd.h>
#include <sys/socket.h>
#ifdef HAVE_SYS_SELECT_H
sigjmp_buf local_sigjmp_buf;
volatile bool send_ready_for_query = true;
- /*
- * Initialize globals (already done if under postmaster, but not if
- * standalone).
- */
+ /* Initialize startup process environment if necessary. */
if (!IsUnderPostmaster)
- {
- MyProcPid = getpid();
-
- MyStartTime = time(NULL);
- }
+ InitStandaloneProcess(argv[0]);
SetProcessingMode(InitProcessing);
- /* Compute paths, if we didn't inherit them from postmaster */
- if (my_exec_path[0] == '\0')
- {
- if (find_my_exec(argv[0], my_exec_path) < 0)
- elog(FATAL, "%s: could not locate my own executable path",
- argv[0]);
- }
-
- if (pkglib_path[0] == '\0')
- get_pkglib_path(my_exec_path, pkglib_path);
-
/*
* Set default values for command-line options.
*/
proc_exit(1);
}
- /*
- * You might expect to see a setsid() call here, but it's not needed,
- * because if we are under a postmaster then BackendInitialize() did it.
- */
-
/*
* Set up signal handlers and masks.
*
#include <sys/param.h>
#include <signal.h>
+#include <time.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/time.h>
+#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <grp.h>
/* We also remember if a SET ROLE is currently active */
static bool SetRoleIsActive = false;
+/*
+ * Initialize the basic environment for a postmaster child
+ *
+ * Should be called as early as possible after the child's startup.
+ */
+void
+InitPostmasterChild(void)
+{
+ IsUnderPostmaster = true; /* we are a postmaster subprocess now */
+
+ MyProcPid = getpid(); /* reset MyProcPid */
+
+ MyStartTime = time(NULL); /* set our start time in case we call elog */
+
+ /*
+ * make sure stderr is in binary mode before anything can possibly be
+ * written to it, in case it's actually the syslogger pipe, so the pipe
+ * chunking protocol isn't disturbed. Non-logpipe data gets translated on
+ * redirection (e.g. via pg_ctl -l) anyway.
+ */
+#ifdef WIN32
+ _setmode(fileno(stderr), _O_BINARY);
+#endif
+
+ /* We don't want the postmaster's proc_exit() handlers */
+ on_exit_reset();
+
+ /*
+ * If possible, make this process a group leader, so that the postmaster
+ * can signal any child processes too. Not all processes will have
+ * children, but for consistency we , but for consistency we make all
+ * postmaster child processes do this.
+ */
+#ifdef HAVE_SETSID
+ if (setsid() < 0)
+ elog(FATAL, "setsid() failed: %m");
+#endif
+}
+
+/*
+ * Initialize the basic environment for a standalone process.
+ *
+ * argv0 has to be suitable to find the program's executable.
+ */
+void
+InitStandaloneProcess(const char *argv0)
+{
+ Assert(!IsPostmasterEnvironment);
+
+ MyProcPid = getpid(); /* reset MyProcPid */
+
+ MyStartTime = time(NULL); /* set our start time in case we call elog */
+
+ /* Compute paths, no postmaster to inherit from */
+ if (my_exec_path[0] == '\0')
+ {
+ if (find_my_exec(argv0, my_exec_path) < 0)
+ elog(FATAL, "%s: could not locate my own executable path",
+ argv0);
+ }
+
+ if (pkglib_path[0] == '\0')
+ get_pkglib_path(my_exec_path, pkglib_path);
+}
/*
* GetUserId - get the current effective user ID.
extern char *DatabasePath;
/* now in utils/init/miscinit.c */
+extern void InitPostmasterChild(void);
+extern void InitStandaloneProcess(const char *argv0);
+
extern void SetDatabasePath(const char *path);
extern char *GetUserNameFromId(Oid roleid);