]> granicus.if.org Git - postgresql/commitdiff
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));
 }