Clean up comments, organize code snippets added at different times into
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 25 Nov 2000 03:45:47 +0000 (03:45 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 25 Nov 2000 03:45:47 +0000 (03:45 +0000)
a slightly less random order.

src/backend/main/main.c

index 475050097dcc9813cf58593524fa47ec13411f27..81f4c37219dc25227eb42f799a81af4702a4589e 100644 (file)
@@ -1,14 +1,19 @@
 /*-------------------------------------------------------------------------
  *
  * main.c
- *   Stub main() routine for the postgres backend.
+ *   Stub main() routine for the postgres executable.
+ *
+ * This does some essential startup tasks for any incarnation of postgres
+ * (postmaster, standalone backend, or standalone bootstrap mode) and then
+ * dispatches to the proper FooMain() routine for the incarnation.
+ *
  *
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/main/main.c,v 1.34 2000/11/16 05:51:00 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/main/main.c,v 1.35 2000/11/25 03:45:47 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -16,6 +21,9 @@
 
 #include <pwd.h>
 #include <unistd.h>
+#ifdef USE_LOCALE
+#include <locale.h>
+#endif
 
 #if defined(__alpha) && !defined(linux) && !defined(__FreeBSD__)
 #include <sys/sysinfo.h>
 #undef ASSEMBLER
 #endif
 
-#ifdef USE_LOCALE
-#include <locale.h>
-#endif
 #include "miscadmin.h"
 #include "bootstrap/bootstrap.h"
 #include "tcop/tcopprot.h"
 
+
 #define NOROOTEXEC "\
-\n\"root\" execution of the PostgreSQL backend is not permitted.\n\n\
-The backend must be started under its own userid to prevent\n\
+\n\"root\" execution of the PostgreSQL server is not permitted.\n\n\
+The server must be started under an unprivileged userid to prevent\n\
 a possible system security compromise. See the INSTALL file for\n\
-more information on how to properly start the postmaster.\n\n"
+more information on how to properly start the server.\n\n"
+
 
 int
 main(int argc, char *argv[])
 {
    int         len;
+   struct passwd *pw;
+
+   /*
+    * 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.
+    */
 
 #if defined(__alpha)
 #ifdef NOFIXADE
@@ -52,21 +72,10 @@ main(int argc, char *argv[])
    int         buffer[] = {SSIN_UACPROC, UAC_NOPRINT};
 
 #endif  /* NOPRINTADE */
-#endif
+#endif /* __alpha */
 
-#ifdef USE_LOCALE
-   setlocale(LC_CTYPE, "");    /* take locale information from an
-                                * environment */
-   setlocale(LC_COLLATE, "");
-   setlocale(LC_MONETARY, "");
-#endif
 #if defined(NOFIXADE) || defined(NOPRINTADE)
 
-   /*
-    * Must be first so that the bootstrap code calls it, too. (Only
-    * needed on some RISC architectures.)
-    */
-
 #if defined(ultrix4)
    syscall(SYS_sysmips, MIPS_FIXADE, 0, NULL, NULL, NULL);
 #endif
@@ -74,56 +83,78 @@ main(int argc, char *argv[])
 #if defined(__alpha)
    if (setsysinfo(SSI_NVPAIRS, buffer, 1, (caddr_t) NULL,
                   (unsigned long) NULL) < 0)
-       elog(NOTICE, "setsysinfo failed: %d\n", errno);
+       fprintf(stderr, "setsysinfo failed: %d\n", errno);
 #endif
 
 #endif  /* NOFIXADE || NOPRINTADE */
 
+#ifdef __BEOS__
+   /* BeOS-specific actions on startup */
+   beos_startup(argc,argv);
+#endif
+
    /*
-    * use one executable for both postgres and postmaster, invoke one or
-    * the other depending on the name of the executable
+    * Not-quite-so-platform-specific startup environment checks.
+    * Still best to minimize these.
     */
-   len = strlen(argv[0]);
 
-/* OK this is going to seem weird, but BeOS is presently basically
- * a single user system.  There is work going on, but at present it'll
- * say that every user is uid 0, i.e. root.  We'll inhibit this check
- * until Be get the system working with multiple users!!
- */
+   /*
+    * Make sure we are not running as root.
+    *
+    * BeOS currently runs everything as root :-(, so this check must
+    * be temporarily disabled there...
+   */
 #ifndef __BEOS__
-if (!geteuid())
+   if (geteuid() == 0)
    {
        fprintf(stderr, "%s", NOROOTEXEC);
        exit(1);
    }
 #endif /* __BEOS__ */
 
-#ifdef __BEOS__
-   /* Specific beos actions on startup */
-   beos_startup(argc,argv);
+   /*
+    * Set up locale information from environment, in only the categories
+    * needed by Postgres; leave other categories set to default "C".
+    * (Note that CTYPE and COLLATE will be overridden later from pg_control
+    * if we are in an already-initialized database.  We set them here so
+    * that they will be available to fill pg_control during initdb.)
+    */
+#ifdef USE_LOCALE
+   setlocale(LC_CTYPE, "");
+   setlocale(LC_COLLATE, "");
+   setlocale(LC_MONETARY, "");
 #endif
 
+   /*
+    * Now dispatch to one of PostmasterMain, PostgresMain, or BootstrapMain
+    * depending on the program name (and possibly first argument) we
+    * were called with.  The lack of consistency here is historical.
+    */
+   len = strlen(argv[0]);
 
-   if (len >= 10 && !strcmp(argv[0] + len - 10, "postmaster"))
+   if (len >= 10 && strcmp(argv[0] + len - 10, "postmaster") == 0)
+   {
+       /* Called as "postmaster" */
        exit(PostmasterMain(argc, argv));
+   }
 
    /*
-    * if the first argument is "-boot", then invoke the backend in
-    * bootstrap mode
+    * If the first argument is "-boot", then invoke bootstrap mode.
+    * Note we remove "-boot" from the arguments passed on to BootstrapMain.
     */
    if (argc > 1 && strcmp(argv[1], "-boot") == 0)
-       exit(BootstrapMain(argc - 1, argv + 1));        /* remove the -boot arg
-                                                        * from the command line */
-   else
+       exit(BootstrapMain(argc - 1, argv + 1));
+
+   /*
+    * Otherwise we're a standalone backend.  Invoke PostgresMain,
+    * specifying current userid as the "authenticated" Postgres user name.
+    */
+   pw = getpwuid(geteuid());
+   if (pw == NULL)
    {
-       struct passwd *pw;
-
-       pw = getpwuid(geteuid());
-       if (!pw)
-       {
-           fprintf(stderr, "%s: invalid current euid", argv[0]);
-           exit(1);
-       }
-       exit(PostgresMain(argc, argv, argc, argv, pw->pw_name));
+       fprintf(stderr, "%s: invalid current euid", argv[0]);
+       exit(1);
    }
+
+   exit(PostgresMain(argc, argv, argc, argv, pw->pw_name));
 }