summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorPeter Eisentraut2006-06-18 15:38:37 +0000
committerPeter Eisentraut2006-06-18 15:38:37 +0000
commit5266f221a2e1358cc2bb208b3d25e9dec427c757 (patch)
treeec47ab08bfec7e030aeac526cc3e8c38d4339ea1 /src/backend
parent44cb3ae7efb9a2fe197a2a0287e919343f31f6d5 (diff)
Merge postmaster and postgres command into just postgres. postmaster
symlink is kept for now for compatibility. To call single-user mode, use postgres --single.
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/Makefile4
-rw-r--r--src/backend/bootstrap/bootstrap.c36
-rw-r--r--src/backend/main/main.c401
-rw-r--r--src/backend/postmaster/autovacuum.c4
-rw-r--r--src/backend/postmaster/pgarch.c4
-rw-r--r--src/backend/postmaster/pgstat.c6
-rw-r--r--src/backend/postmaster/postmaster.c109
-rw-r--r--src/backend/postmaster/syslogger.c4
-rw-r--r--src/backend/tcop/postgres.c62
9 files changed, 285 insertions, 345 deletions
diff --git a/src/backend/Makefile b/src/backend/Makefile
index e97e7b33aa7..eeead6c0260 100644
--- a/src/backend/Makefile
+++ b/src/backend/Makefile
@@ -4,11 +4,11 @@
#
# Copyright (c) 1994, Regents of the University of California
#
-# $PostgreSQL: pgsql/src/backend/Makefile,v 1.114 2006/01/05 01:56:29 momjian Exp $
+# $PostgreSQL: pgsql/src/backend/Makefile,v 1.115 2006/06/18 15:38:36 petere Exp $
#
#-------------------------------------------------------------------------
-PGFILEDESC = "PostgreSQL Database Backend"
+PGFILEDESC = "PostgreSQL Server"
subdir = src/backend
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index bc60d533ae4..8acac3ad449 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.216 2006/06/08 23:55:48 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.217 2006/06/18 15:38:36 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -53,7 +53,6 @@ extern char *optarg;
#define ALLOC(t, c) ((t *) calloc((unsigned)(c), sizeof(t)))
-static void usage(void);
static void bootstrap_signals(void);
static void ShutdownDummyProcess(int code, Datum arg);
static hashnode *AddStr(char *str, int strlength, int mderef);
@@ -247,8 +246,8 @@ BootstrapMain(int argc, char *argv[])
if (!IsUnderPostmaster)
InitializeGUCOptions();
- /* Ignore the initial -boot argument, if present */
- if (argc > 1 && strcmp(argv[1], "-boot") == 0)
+ /* Ignore the initial --boot argument, if present */
+ if (argc > 1 && strcmp(argv[1], "--boot") == 0)
{
argv++;
argc--;
@@ -317,7 +316,9 @@ BootstrapMain(int argc, char *argv[])
break;
}
default:
- usage();
+ write_stderr("Try \"%s --help\" for more information.\n",
+ progname);
+ proc_exit(1);
break;
}
}
@@ -328,7 +329,10 @@ BootstrapMain(int argc, char *argv[])
optind++;
}
if (!dbname || argc != optind)
- usage();
+ {
+ write_stderr("%s: invalid command-line arguments\n", progname);
+ proc_exit(1);
+ }
/*
* Identify myself via ps
@@ -498,26 +502,6 @@ BootstrapMain(int argc, char *argv[])
* ----------------------------------------------------------------
*/
-/* usage:
- * usage help for the bootstrap backend
- */
-static void
-usage(void)
-{
- fprintf(stderr, _("This is the PostgreSQL bootstrap process.\n\n"));
- fprintf(stderr, _("Usage:\n postgres -boot [OPTION]... DBNAME\n\n"));
- fprintf(stderr, _("Options:\n"));
- fprintf(stderr, _(" -B NBUFFERS number of shared buffers\n"));
- fprintf(stderr, _(" -c NAME=VALUE set run-time parameter\n"));
- fprintf(stderr, _(" -d 1-5 debugging level\n"));
- fprintf(stderr, _(" -D DATADIR database directory\n"));
- fprintf(stderr, _(" -F turn fsync off\n"));
- fprintf(stderr, _(" -r FILENAME send stdout and stderr to given file\n"));
- fprintf(stderr, _(" -x NUM internal use\n"));
-
- proc_exit(1);
-}
-
/*
* Set up signal handling for a bootstrap process
*/
diff --git a/src/backend/main/main.c b/src/backend/main/main.c
index 37b77206347..60c46d39a23 100644
--- a/src/backend/main/main.c
+++ b/src/backend/main/main.c
@@ -13,7 +13,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/main/main.c,v 1.102 2006/06/12 16:17:20 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/main/main.c,v 1.103 2006/06/18 15:38:37 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -29,6 +29,7 @@
#include <sys/proc.h>
#undef ASSEMBLER
#endif
+
#if defined(__NetBSD__)
#include <sys/param.h>
#endif
@@ -45,88 +46,26 @@
#include "libpq/pqsignal.h"
#endif
+
const char *progname;
-int
-main(int argc, char *argv[])
-{
-#ifndef WIN32
- struct passwd *pw;
-#endif
- char *pw_name_persist;
- /*
- * Place platform-specific startup hacks here. This is the right place to
- * put code that must be executed early in launch of either a postmaster,
- * a standalone backend, or a standalone bootstrap run. Note that this
- * code will NOT be executed when a backend or sub-bootstrap run is forked
- * by the postmaster.
- *
- * XXX The need for code here is proof that the platform in question is
- * too brain-dead to provide a standard C execution environment without
- * help. Avoid adding more here, if you can.
- */
+static void startup_hacks(const char *progname);
+static void help(const char *progname);
+static void check_root(const char *progname);
+static char *get_current_username(const char *progname);
-#if defined(__alpha) /* no __alpha__ ? */
-#ifdef NOFIXADE
- int buffer[] = {SSIN_UACPROC, UAC_SIGBUS | UAC_NOPRINT};
-#endif
-#endif /* __alpha */
-#ifdef WIN32
- char *env_locale;
-#endif
+int
+main(int argc, char *argv[])
+{
progname = get_progname(argv[0]);
/*
- * On some platforms, unaligned memory accesses result in a kernel trap;
- * the default kernel behavior is to emulate the memory access, but this
- * results in a significant performance penalty. We ought to fix PG not to
- * make such unaligned memory accesses, so this code disables the kernel
- * emulation: unaligned accesses will result in SIGBUS instead.
- */
-#ifdef NOFIXADE
-
-#if defined(ultrix4)
- syscall(SYS_sysmips, MIPS_FIXADE, 0, NULL, NULL, NULL);
-#endif
-
-#if defined(__alpha) /* no __alpha__ ? */
- if (setsysinfo(SSI_NVPAIRS, buffer, 1, (caddr_t) NULL,
- (unsigned long) NULL) < 0)
- write_stderr("%s: setsysinfo failed: %s\n",
- argv[0], strerror(errno));
-#endif
-#endif /* NOFIXADE */
-
-#if defined(WIN32)
- {
- WSADATA wsaData;
- int err;
-
- /* Make output streams unbuffered by default */
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-
- /* Prepare Winsock */
- err = WSAStartup(MAKEWORD(2, 2), &wsaData);
- if (err != 0)
- {
- write_stderr("%s: WSAStartup failed: %d\n",
- argv[0], err);
- exit(1);
- }
-
- /* In case of general protection fault, don't show GUI popup box */
- SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
- }
-#endif
-
- /*
- * Not-quite-so-platform-specific startup environment checks. Still best
- * to minimize these.
+ * Platform-specific startup hacks
*/
+ startup_hacks(progname);
/*
* Remember the physical location of the initially given argv[] array for
@@ -153,23 +92,25 @@ main(int argc, char *argv[])
set_pglocale_pgservice(argv[0], "postgres");
#ifdef WIN32
-
/*
* Windows uses codepages rather than the environment, so we work around
* that by querying the environment explicitly first for LC_COLLATE and
* LC_CTYPE. We have to do this because initdb passes those values in the
* environment. If there is nothing there we fall back on the codepage.
*/
+ {
+ char *env_locale;
- if ((env_locale = getenv("LC_COLLATE")) != NULL)
- pg_perm_setlocale(LC_COLLATE, env_locale);
- else
- pg_perm_setlocale(LC_COLLATE, "");
+ if ((env_locale = getenv("LC_COLLATE")) != NULL)
+ pg_perm_setlocale(LC_COLLATE, env_locale);
+ else
+ pg_perm_setlocale(LC_COLLATE, "");
- if ((env_locale = getenv("LC_CTYPE")) != NULL)
- pg_perm_setlocale(LC_CTYPE, env_locale);
- else
- pg_perm_setlocale(LC_CTYPE, "");
+ if ((env_locale = getenv("LC_CTYPE")) != NULL)
+ pg_perm_setlocale(LC_CTYPE, env_locale);
+ else
+ pg_perm_setlocale(LC_CTYPE, "");
+ }
#else
pg_perm_setlocale(LC_COLLATE, "");
pg_perm_setlocale(LC_CTYPE, "");
@@ -195,80 +136,38 @@ main(int argc, char *argv[])
unsetenv("LC_ALL");
/*
- * Skip permission checks if we're just trying to do --help or --version;
- * otherwise root will get unhelpful failure messages from initdb.
+ * Catch standard options before doing much else
*/
- if (!(argc > 1
- && (strcmp(argv[1], "--help") == 0 ||
- strcmp(argv[1], "-?") == 0 ||
- strcmp(argv[1], "--version") == 0 ||
- strcmp(argv[1], "-V") == 0)))
+ if (argc > 1)
{
-#ifndef WIN32
- /*
- * Make sure we are not running as root.
- */
- if (geteuid() == 0)
- {
- write_stderr("\"root\" execution of the PostgreSQL server is not permitted.\n"
- "The server must be started under an unprivileged user ID to prevent\n"
- "possible system security compromise. See the documentation for\n"
- "more information on how to properly start the server.\n");
- exit(1);
- }
-
- /*
- * Also make sure that real and effective uids are the same. Executing
- * Postgres as a setuid program from a root shell is a security hole,
- * since on many platforms a nefarious subroutine could setuid back to
- * root if real uid is root. (Since nobody actually uses Postgres as
- * a setuid program, trying to actively fix this situation seems more
- * trouble than it's worth; we'll just expend the effort to check for
- * it.)
- */
- if (getuid() != geteuid())
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
{
- write_stderr("%s: real and effective user IDs must match\n",
- argv[0]);
- exit(1);
+ help(progname);
+ exit(0);
}
-#else /* WIN32 */
- if (pgwin32_is_admin())
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
{
- write_stderr("Execution of PostgreSQL by a user with administrative permissions is not\n"
- "permitted.\n"
- "The server must be started under an unprivileged user ID to prevent\n"
- "possible system security compromises. See the documentation for\n"
- "more information on how to properly start the server.\n");
- exit(1);
+ puts("postgres (PostgreSQL) " PG_VERSION);
+ exit(0);
}
-#endif /* !WIN32 */
}
/*
- * Now dispatch to one of PostmasterMain, PostgresMain, GucInfoMain,
- * SubPostmasterMain, or BootstrapMain depending on the program name (and
- * possibly first argument) we were called with. The lack of consistency
- * here is historical.
+ * Make sure we are not running as root.
*/
- if (strcmp(progname, "postmaster") == 0)
- {
- /* Called as "postmaster" */
- exit(PostmasterMain(argc, argv));
- }
+ check_root(progname);
/*
- * If the first argument begins with "-fork", then invoke
- * SubPostmasterMain. This is used for forking postmaster child processes
- * on systems where we can't simply fork.
+ * Dispatch to one of various subprograms depending on first
+ * argument.
*/
+
#ifdef EXEC_BACKEND
- if (argc > 1 && strncmp(argv[1], "-fork", 5) == 0)
+ if (argc > 1 && strncmp(argv[1], "--fork", 6) == 0)
exit(SubPostmasterMain(argc, argv));
#endif
#ifdef WIN32
-
/*
* Start our win32 signal implementation
*
@@ -278,47 +177,223 @@ main(int argc, char *argv[])
pgwin32_signal_initialize();
#endif
- /*
- * If the first argument is "-boot", then invoke bootstrap mode. (This
- * path is taken only for a standalone bootstrap process.)
- */
- if (argc > 1 && strcmp(argv[1], "-boot") == 0)
+ if (argc > 1 && strcmp(argv[1], "--boot") == 0)
exit(BootstrapMain(argc, argv));
- /*
- * If the first argument is "--describe-config", then invoke runtime
- * configuration option display mode.
- */
if (argc > 1 && strcmp(argv[1], "--describe-config") == 0)
exit(GucInfoMain());
+ if (argc > 1 && strcmp(argv[1], "--single") == 0)
+ exit(PostgresMain(argc, argv, get_current_username(progname)));
+
+ exit(PostmasterMain(argc, argv));
+}
+
+
+
+/*
+ * Place platform-specific startup hacks here. This is the right
+ * place to put code that must be executed early in launch of either a
+ * postmaster, a standalone backend, or a standalone bootstrap run.
+ * Note that this code will NOT be executed when a backend or
+ * sub-bootstrap run is forked by the server.
+ *
+ * XXX The need for code here is proof that the platform in question
+ * is too brain-dead to provide a standard C execution environment
+ * without help. Avoid adding more here, if you can.
+ */
+static void
+startup_hacks(const char *progname)
+{
+#if defined(__alpha) /* no __alpha__ ? */
+#ifdef NOFIXADE
+ int buffer[] = {SSIN_UACPROC, UAC_SIGBUS | UAC_NOPRINT};
+#endif
+#endif /* __alpha */
+
+
+ /*
+ * On some platforms, unaligned memory accesses result in a kernel
+ * trap; the default kernel behavior is to emulate the memory
+ * access, but this results in a significant performance penalty.
+ * We ought to fix PG not to make such unaligned memory accesses,
+ * so this code disables the kernel emulation: unaligned accesses
+ * will result in SIGBUS instead.
+ */
+#ifdef NOFIXADE
+
+#if defined(ultrix4)
+ syscall(SYS_sysmips, MIPS_FIXADE, 0, NULL, NULL, NULL);
+#endif
+
+#if defined(__alpha) /* no __alpha__ ? */
+ if (setsysinfo(SSI_NVPAIRS, buffer, 1, (caddr_t) NULL,
+ (unsigned long) NULL) < 0)
+ write_stderr("%s: setsysinfo failed: %s\n",
+ progname, strerror(errno));
+#endif
+
+#endif /* NOFIXADE */
+
+
+#ifdef WIN32
+ {
+ WSADATA wsaData;
+ int err;
+
+ /* Make output streams unbuffered by default */
+ setvbuf(stdout, NULL, _IONBF, 0);
+ setvbuf(stderr, NULL, _IONBF, 0);
+
+ /* Prepare Winsock */
+ err = WSAStartup(MAKEWORD(2, 2), &wsaData);
+ if (err != 0)
+ {
+ write_stderr("%s: WSAStartup failed: %d\n",
+ progname, err);
+ exit(1);
+ }
+
+ /* In case of general protection fault, don't show GUI popup box */
+ SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
+ }
+#endif /* WIN32 */
+}
+
+
+
+static void
+help(const char *progname)
+{
+ printf(_("%s is the PostgreSQL server.\n\n"), progname);
+ printf(_("Usage:\n %s [OPTION]...\n\n"), progname);
+ printf(_("Options:\n"));
+#ifdef USE_ASSERT_CHECKING
+ printf(_(" -A 1|0 enable/disable run-time assert checking\n"));
+#endif
+ printf(_(" -B NBUFFERS number of shared buffers\n"));
+ printf(_(" -c NAME=VALUE set run-time parameter\n"));
+ printf(_(" -d 1-5 debugging level\n"));
+ printf(_(" -D DATADIR database directory\n"));
+ printf(_(" -e use European date input format (DMY)\n"));
+ printf(_(" -F turn fsync off\n"));
+ printf(_(" -h HOSTNAME host name or IP address to listen on\n"));
+ printf(_(" -i enable TCP/IP connections\n"));
+ printf(_(" -k DIRECTORY Unix-domain socket location\n"));
+#ifdef USE_SSL
+ printf(_(" -l enable SSL connections\n"));
+#endif
+ printf(_(" -N MAX-CONNECT maximum number of allowed connections\n"));
+ printf(_(" -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n"));
+ printf(_(" -p PORT port number to listen on\n"));
+ printf(_(" -s show statistics after each query\n"));
+ printf(_(" -S WORK-MEM set amount of memory for sorts (in kB)\n"));
+ printf(_(" --NAME=VALUE set run-time parameter\n"));
+ printf(_(" --describe-config describe configuration parameters, then exit\n"));
+ printf(_(" --help show this help, then exit\n"));
+ printf(_(" --version output version information, then exit\n"));
+
+ printf(_("\nDeveloper options:\n"));
+ printf(_(" -f s|i|n|m|h forbid use of some plan types\n"));
+ printf(_(" -n do not reinitialize shared memory after abnormal exit\n"));
+ printf(_(" -O allow system table structure changes\n"));
+ printf(_(" -P disable system indexes\n"));
+ printf(_(" -t pa|pl|ex show timings after each query\n"));
+ printf(_(" -T send SIGSTOP to all backend servers if one dies\n"));
+ printf(_(" -W NUM wait NUM seconds to allow attach from a debugger\n"));
+
+ printf(_("\nOptions for single-user mode:\n"));
+ printf(_(" --single selects single-user mode (must be first argument)\n"));
+ printf(_(" DBNAME database name (defaults to user name)\n"));
+ printf(_(" -d 0-5 override debugging level\n"));
+ printf(_(" -E echo statement before execution\n"));
+ printf(_(" -j do not use newline as interactive query delimiter\n"));
+ printf(_(" -r FILENAME send stdout and stderr to given file\n"));
+
+ printf(_("\nOptions for bootstrapping mode:\n"));
+ printf(_(" --boot selects bootstrapping mode (must be first argument)\n"));
+ printf(_(" DBNAME database name (mandatory argument in bootstrapping mode)\n"));
+ printf(_(" -r FILENAME send stdout and stderr to given file\n"));
+ printf(_(" -x NUM internal use\n"));
+
+ printf(_("\nPlease read the documentation for the complete list of run-time\n"
+ "configuration settings and how to set them on the command line or in\n"
+ "the configuration file.\n\n"
+ "Report bugs to <pgsql-bugs@postgresql.org>.\n"));
+}
+
+
+
+static void
+check_root(const char *progname)
+{
+#ifndef WIN32
+ if (geteuid() == 0)
+ {
+ write_stderr("\"root\" execution of the PostgreSQL server is not permitted.\n"
+ "The server must be started under an unprivileged user ID to prevent\n"
+ "possible system security compromise. See the documentation for\n"
+ "more information on how to properly start the server.\n");
+ exit(1);
+ }
+
/*
- * Otherwise we're a standalone backend. Invoke PostgresMain, specifying
- * current userid as the "authenticated" Postgres user name.
+ * Also make sure that real and effective uids are the same.
+ * Executing as a setuid program from a root shell is a security
+ * hole, since on many platforms a nefarious subroutine could
+ * setuid back to root if real uid is root. (Since nobody
+ * actually uses postgres as a setuid program, trying to
+ * actively fix this situation seems more trouble than it's worth;
+ * we'll just expend the effort to check for it.)
*/
+ if (getuid() != geteuid())
+ {
+ write_stderr("%s: real and effective user IDs must match\n",
+ progname);
+ exit(1);
+ }
+#else /* WIN32 */
+ if (pgwin32_is_admin())
+ {
+ write_stderr("Execution of PostgreSQL by a user with administrative permissions is not\n"
+ "permitted.\n"
+ "The server must be started under an unprivileged user ID to prevent\n"
+ "possible system security compromises. See the documentation for\n"
+ "more information on how to properly start the server.\n");
+ exit(1);
+ }
+#endif /* WIN32 */
+}
+
+
+
+static char *
+get_current_username(const char *progname)
+{
#ifndef WIN32
+ struct passwd *pw;
+
pw = getpwuid(geteuid());
if (pw == NULL)
{
write_stderr("%s: invalid effective UID: %d\n",
- argv[0], (int) geteuid());
+ progname, (int) geteuid());
exit(1);
}
- /* Allocate new memory because later getpwuid() calls can overwrite it */
- pw_name_persist = strdup(pw->pw_name);
+ /* Allocate new memory because later getpwuid() calls can overwrite it. */
+ return strdup(pw->pw_name);
#else
- {
- long namesize = 256 /* UNLEN */ + 1;
+ long namesize = 256 /* UNLEN */ + 1;
+ char *name;
- pw_name_persist = malloc(namesize);
- if (!GetUserName(pw_name_persist, &namesize))
- {
- write_stderr("%s: could not determine user name (GetUserName failed)\n",
- argv[0]);
- exit(1);
- }
+ name = malloc(namesize);
+ if (!GetUserName(name, &namesize))
+ {
+ write_stderr("%s: could not determine user name (GetUserName failed)\n",
+ progname);
+ exit(1);
}
-#endif /* WIN32 */
- exit(PostgresMain(argc, argv, pw_name_persist));
+ return name;
+#endif
}
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 820f4458665..93ba5c2c989 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.19 2006/05/19 15:15:37 alvherre Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.20 2006/06/18 15:38:37 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -208,7 +208,7 @@ autovac_forkexec(void)
int ac = 0;
av[ac++] = "postgres";
- av[ac++] = "-forkautovac";
+ av[ac++] = "--forkautovac";
av[ac++] = NULL; /* filled in by postmaster_forkexec */
av[ac] = NULL;
diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c
index 9a8f24e5dbb..538ba0c3ec6 100644
--- a/src/backend/postmaster/pgarch.c
+++ b/src/backend/postmaster/pgarch.c
@@ -19,7 +19,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/pgarch.c,v 1.22 2006/05/30 17:08:14 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/pgarch.c,v 1.23 2006/06/18 15:38:37 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -197,7 +197,7 @@ pgarch_forkexec(void)
av[ac++] = "postgres";
- av[ac++] = "-forkarch";
+ av[ac++] = "--forkarch";
av[ac++] = NULL; /* filled in by postmaster_forkexec */
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index df286614020..50486f8cef2 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -13,7 +13,7 @@
*
* Copyright (c) 2001-2006, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.127 2006/05/30 02:35:39 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.128 2006/06/18 15:38:37 petere Exp $
* ----------
*/
#include "postgres.h"
@@ -491,11 +491,11 @@ pgstat_forkexec(STATS_PROCESS_TYPE procType)
switch (procType)
{
case STAT_PROC_BUFFER:
- av[ac++] = "-forkbuf";
+ av[ac++] = "--forkbuf";
break;
case STAT_PROC_COLLECTOR:
- av[ac++] = "-forkcol";
+ av[ac++] = "--forkcol";
break;
default:
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 0fa564a8f51..fc4a9bcdc33 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -37,7 +37,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.485 2006/06/07 22:24:44 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.486 2006/06/18 15:38:37 petere Exp $
*
* NOTES
*
@@ -266,7 +266,6 @@ static void LogChildExit(int lev, const char *procname,
static void BackendInitialize(Port *port);
static int BackendRun(Port *port);
static void ExitPostmaster(int status);
-static void usage(const char *);
static int ServerLoop(void);
static int BackendStartup(Port *port);
static int ProcessStartupPacket(Port *port, bool SSLdone);
@@ -385,29 +384,6 @@ PostmasterMain(int argc, char *argv[])
IsPostmasterEnvironment = true;
/*
- * Catch standard options before doing much else. This even works on
- * systems without getopt_long.
- */
- if (argc > 1)
- {
- if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
- {
- usage(progname);
- ExitPostmaster(0);
- }
- if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
- {
- puts("postmaster (PostgreSQL) " PG_VERSION);
- ExitPostmaster(0);
- }
- }
-
-#ifdef WIN32
- /* Start our win32 signal implementation */
- pgwin32_signal_initialize();
-#endif
-
- /*
* for security, no dir or file created can be group or other accessible
*/
umask((mode_t) 0077);
@@ -1134,55 +1110,6 @@ pmdaemonize(void)
/*
- * Print out help message
- */
-static void
-usage(const char *progname)
-{
- printf(_("%s is the PostgreSQL server.\n\n"), progname);
- printf(_("Usage:\n %s [OPTION]...\n\n"), progname);
- printf(_("Options:\n"));
-#ifdef USE_ASSERT_CHECKING
- printf(_(" -A 1|0 enable/disable run-time assert checking\n"));
-#endif
- printf(_(" -B NBUFFERS number of shared buffers\n"));
- printf(_(" -c NAME=VALUE set run-time parameter\n"));
- printf(_(" -d 1-5 debugging level\n"));
- printf(_(" -D DATADIR database directory\n"));
- printf(_(" -e use European date input format (DMY)\n"));
- printf(_(" -F turn fsync off\n"));
- printf(_(" -h HOSTNAME host name or IP address to listen on\n"));
- printf(_(" -i enable TCP/IP connections\n"));
- printf(_(" -k DIRECTORY Unix-domain socket location\n"));
-#ifdef USE_SSL
- printf(_(" -l enable SSL connections\n"));
-#endif
- printf(_(" -N MAX-CONNECT maximum number of allowed connections\n"));
- printf(_(" -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n"));
- printf(_(" -p PORT port number to listen on\n"));
- printf(_(" -s show statistics after each query\n"));
- printf(_(" -S WORK-MEM set amount of memory for sorts (in kB)\n"));
- printf(_(" --NAME=VALUE set run-time parameter\n"));
- printf(_(" --help show this help, then exit\n"));
- printf(_(" --version output version information, then exit\n"));
-
- printf(_("\nDeveloper options:\n"));
- printf(_(" -f s|i|n|m|h forbid use of some plan types\n"));
- printf(_(" -n do not reinitialize shared memory after abnormal exit\n"));
- printf(_(" -O allow system table structure changes\n"));
- printf(_(" -P disable system indexes\n"));
- printf(_(" -t pa|pl|ex show timings after each query\n"));
- printf(_(" -T send SIGSTOP to all backend servers if one dies\n"));
- printf(_(" -W NUM wait NUM seconds to allow attach from a debugger\n"));
-
- printf(_("\nPlease read the documentation for the complete list of run-time\n"
- "configuration settings and how to set them on the command line or in\n"
- "the configuration file.\n\n"
- "Report bugs to <pgsql-bugs@postgresql.org>.\n"));
-}
-
-
-/*
* Main idle loop of postmaster
*/
static int
@@ -2957,7 +2884,7 @@ backend_forkexec(Port *port)
int ac = 0;
av[ac++] = "postgres";
- av[ac++] = "-forkbackend";
+ av[ac++] = "--forkbackend";
av[ac++] = NULL; /* filled in by internal_forkexec */
av[ac] = NULL;
@@ -3030,10 +2957,10 @@ internal_forkexec(int argc, char *argv[], Port *port)
/* Make sure caller set up argv properly */
Assert(argc >= 3);
Assert(argv[argc] == NULL);
- Assert(strncmp(argv[1], "-fork", 5) == 0);
+ Assert(strncmp(argv[1], "--fork", 6) == 0);
Assert(argv[2] == NULL);
- /* Insert temp file name after -fork argument */
+ /* Insert temp file name after --fork argument */
argv[2] = tmpfilename;
/* Fire off execv in child */
@@ -3081,7 +3008,7 @@ internal_forkexec(int argc, char *argv[], Port *port)
/* Make sure caller set up argv properly */
Assert(argc >= 3);
Assert(argv[argc] == NULL);
- Assert(strncmp(argv[1], "-fork", 5) == 0);
+ Assert(strncmp(argv[1], "--fork", 6) == 0);
Assert(argv[2] == NULL);
/* Verify that there is room in the child list */
@@ -3119,7 +3046,7 @@ internal_forkexec(int argc, char *argv[], Port *port)
return -1;
}
- /* Insert temp file name after -fork argument */
+ /* Insert temp file name after --fork argument */
sprintf(paramHandleStr, "%lu", (DWORD) paramHandle);
argv[2] = paramHandleStr;
@@ -3242,7 +3169,7 @@ internal_forkexec(int argc, char *argv[], Port *port)
* to what it would be if we'd simply forked on Unix, and then
* dispatch to the appropriate place.
*
- * The first two command line arguments are expected to be "-forkFOO"
+ * The first two command line arguments are expected to be "--forkFOO"
* (where FOO indicates which postmaster child we are to become), and
* the name of a variables file that we can read to load data that would
* have been inherited by fork() on Unix. Remaining arguments go to the
@@ -3282,9 +3209,9 @@ SubPostmasterMain(int argc, char *argv[])
* to do this before going any further to ensure that we can attach at the
* same address the postmaster used.
*/
- if (strcmp(argv[1], "-forkbackend") == 0 ||
- strcmp(argv[1], "-forkautovac") == 0 ||
- strcmp(argv[1], "-forkboot") == 0)
+ if (strcmp(argv[1], "--forkbackend") == 0 ||
+ strcmp(argv[1], "--forkautovac") == 0 ||
+ strcmp(argv[1], "--forkboot") == 0)
PGSharedMemoryReAttach();
/*
@@ -3304,7 +3231,7 @@ SubPostmasterMain(int argc, char *argv[])
read_nondefault_variables();
/* Run backend or appropriate child */
- if (strcmp(argv[1], "-forkbackend") == 0)
+ if (strcmp(argv[1], "--forkbackend") == 0)
{
Assert(argc == 3); /* shouldn't be any more args */
@@ -3356,7 +3283,7 @@ SubPostmasterMain(int argc, char *argv[])
/* And run the backend */
proc_exit(BackendRun(&port));
}
- if (strcmp(argv[1], "-forkboot") == 0)
+ if (strcmp(argv[1], "--forkboot") == 0)
{
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
@@ -3373,7 +3300,7 @@ SubPostmasterMain(int argc, char *argv[])
BootstrapMain(argc - 2, argv + 2);
proc_exit(0);
}
- if (strcmp(argv[1], "-forkautovac") == 0)
+ if (strcmp(argv[1], "--forkautovac") == 0)
{
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
@@ -3390,7 +3317,7 @@ SubPostmasterMain(int argc, char *argv[])
AutoVacMain(argc - 2, argv + 2);
proc_exit(0);
}
- if (strcmp(argv[1], "-forkarch") == 0)
+ if (strcmp(argv[1], "--forkarch") == 0)
{
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
@@ -3400,7 +3327,7 @@ SubPostmasterMain(int argc, char *argv[])
PgArchiverMain(argc, argv);
proc_exit(0);
}
- if (strcmp(argv[1], "-forkbuf") == 0)
+ if (strcmp(argv[1], "--forkbuf") == 0)
{
/* Close the postmaster's sockets */
ClosePostmasterPorts(false);
@@ -3410,7 +3337,7 @@ SubPostmasterMain(int argc, char *argv[])
PgstatBufferMain(argc, argv);
proc_exit(0);
}
- if (strcmp(argv[1], "-forkcol") == 0)
+ if (strcmp(argv[1], "--forkcol") == 0)
{
/*
* Do NOT close postmaster sockets here, because we are forking from
@@ -3422,7 +3349,7 @@ SubPostmasterMain(int argc, char *argv[])
PgstatCollectorMain(argc, argv);
proc_exit(0);
}
- if (strcmp(argv[1], "-forklog") == 0)
+ if (strcmp(argv[1], "--forklog") == 0)
{
/* Close the postmaster's sockets */
ClosePostmasterPorts(true);
@@ -3635,7 +3562,7 @@ StartChildProcess(int xlop)
av[ac++] = "postgres";
#ifdef EXEC_BACKEND
- av[ac++] = "-forkboot";
+ av[ac++] = "--forkboot";
av[ac++] = NULL; /* filled in by postmaster_forkexec */
#endif
diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c
index 339f4605af2..899dcad1f7a 100644
--- a/src/backend/postmaster/syslogger.c
+++ b/src/backend/postmaster/syslogger.c
@@ -18,7 +18,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.24 2006/06/07 22:24:44 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.25 2006/06/18 15:38:37 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -534,7 +534,7 @@ syslogger_forkexec(void)
char numbuf[2][32];
av[ac++] = "postgres";
- av[ac++] = "-forklog";
+ av[ac++] = "--forklog";
av[ac++] = NULL; /* filled in by postmaster_forkexec */
/* static variables (those not passed by write_backend_variables) */
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index a43478088f9..b7c363d80cd 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.487 2006/06/11 15:49:28 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.488 2006/06/18 15:38:37 petere Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@@ -2399,41 +2399,6 @@ assign_max_stack_depth(int newval, bool doit, GucSource source)
}
-static void
-usage(const char *progname)
-{
- printf(_("%s is the PostgreSQL stand-alone backend. It is not\nintended to be used by normal users.\n\n"), progname);
-
- printf(_("Usage:\n %s [OPTION]... DBNAME\n\n"), progname);
- printf(_("Options:\n"));
-#ifdef USE_ASSERT_CHECKING
- printf(_(" -A 1|0 enable/disable run-time assert checking\n"));
-#endif
- printf(_(" -B NBUFFERS number of shared buffers\n"));
- printf(_(" -c NAME=VALUE set run-time parameter\n"));
- printf(_(" -d 0-5 debugging level\n"));
- printf(_(" -D DATADIR database directory\n"));
- printf(_(" -e use European date input format (DMY)\n"));
- printf(_(" -E echo statement before execution\n"));
- printf(_(" -F turn fsync off\n"));
- printf(_(" -j do not use newline as interactive query delimiter\n"));
- printf(_(" -r FILENAME send stdout and stderr to given file\n"));
- printf(_(" -s show statistics after each query\n"));
- printf(_(" -S WORK-MEM set amount of memory for sorts (in kB)\n"));
- printf(_(" --NAME=VALUE set run-time parameter\n"));
- printf(_(" --describe-config describe configuration parameters, then exit\n"));
- printf(_(" --help show this help, then exit\n"));
- printf(_(" --version output version information, then exit\n"));
- printf(_("\nDeveloper options:\n"));
- printf(_(" -f s|i|n|m|h forbid use of some plan types\n"));
- printf(_(" -O allow system table structure changes\n"));
- printf(_(" -P disable system indexes\n"));
- printf(_(" -t pa|pl|ex show timings after each query\n"));
- printf(_(" -W NUM wait NUM seconds to allow attach from a debugger\n"));
- printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n"));
-}
-
-
/*
* set_debug_options --- apply "-d N" command line option
*
@@ -2564,24 +2529,6 @@ PostgresMain(int argc, char *argv[], const char *username)
guc_values = lappend(guc_values, pstrdup(val)))
/*
- * Catch standard options before doing much else. This even works on
- * systems without getopt_long.
- */
- if (!IsUnderPostmaster && argc > 1)
- {
- if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
- {
- usage(argv[0]);
- exit(0);
- }
- if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
- {
- puts(PG_VERSIONSTR);
- exit(0);
- }
- }
-
- /*
* initialize globals (already done if under postmaster, but not if
* standalone; cheap enough to do over)
*/
@@ -2638,6 +2585,13 @@ PostgresMain(int argc, char *argv[], const char *username)
* ----------------
*/
+ /* Ignore the initial --single argument, if present */
+ if (argc > 1 && strcmp(argv[1], "--single") == 0)
+ {
+ argv++;
+ argc--;
+ }
+
/* all options are allowed until '-p' */
secure = true;
ctx = PGC_POSTMASTER;