diff options
Diffstat (limited to 'src/backend/main/main.c')
-rw-r--r-- | src/backend/main/main.c | 230 |
1 files changed, 0 insertions, 230 deletions
diff --git a/src/backend/main/main.c b/src/backend/main/main.c deleted file mode 100644 index 9e1d44739ad..00000000000 --- a/src/backend/main/main.c +++ /dev/null @@ -1,230 +0,0 @@ -/*------------------------------------------------------------------------- - * - * main.c - * 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-2002, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * - * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/main/main.c,v 1.52 2002/06/20 20:29:29 momjian Exp $ - * - *------------------------------------------------------------------------- - */ -#include "postgres.h" - -#include <pwd.h> -#include <unistd.h> -#include <locale.h> - -#if defined(__alpha) && defined(__osf__) -#include <sys/sysinfo.h> -#include "machine/hal_sysinfo.h" -#define ASSEMBLER -#include <sys/proc.h> -#undef ASSEMBLER -#endif -#if defined(__NetBSD__) -#include <sys/param.h> -#endif - -#include "miscadmin.h" -#include "bootstrap/bootstrap.h" -#include "tcop/tcopprot.h" -#include "utils/ps_status.h" - - - -int -main(int argc, char *argv[]) -{ - char **new_argv; - int i; - int len; - struct passwd *pw; - 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. - */ - -#if defined(__alpha) -#ifdef NOFIXADE - int buffer[] = {SSIN_UACPROC, UAC_SIGBUS}; -#endif /* NOFIXADE */ -#ifdef NOPRINTADE - int buffer[] = {SSIN_UACPROC, UAC_NOPRINT}; -#endif /* NOPRINTADE */ -#endif /* __alpha */ - -#if defined(NOFIXADE) || defined(NOPRINTADE) - -#if defined(ultrix4) - syscall(SYS_sysmips, MIPS_FIXADE, 0, NULL, NULL, NULL); -#endif - -#if defined(__alpha) - if (setsysinfo(SSI_NVPAIRS, buffer, 1, (caddr_t) NULL, - (unsigned long) NULL) < 0) - fprintf(stderr, gettext("%s: setsysinfo failed: %s\n"), argv[0], strerror(errno)); -#endif -#endif /* NOFIXADE || NOPRINTADE */ - -#ifdef __BEOS__ - /* BeOS-specific actions on startup */ - beos_startup(argc, argv); -#endif - - /* - * Not-quite-so-platform-specific startup environment checks. Still - * best to minimize these. - */ - - /* - * Remember the physical location of the initially given argv[] array, - * since on some platforms that storage must be overwritten in order - * to set the process title for ps. Then make a copy of the argv[] - * array for subsequent use, so that argument parsing doesn't get - * affected if init_ps_display overwrites the original argv[]. - * - * (NB: do NOT think to remove the copying of argv[], even though - * postmaster.c finishes looking at argv[] long before we ever - * consider changing the ps display. On some platforms, getopt() - * keeps pointers into the argv array, and will get horribly confused - * when it is re-called to analyze a subprocess' argument string if - * the argv storage has been clobbered meanwhile.) - * - * On some platforms, save_ps_display_args moves the environment strings - * to make extra room. Therefore this should be done as early as - * possible during startup, to avoid entanglements with code that - * might save a getenv() result pointer. - */ - save_ps_display_args(argc, argv); - - new_argv = (char **) malloc((argc + 1) * sizeof(char *)); - for (i = 0; i < argc; i++) - new_argv[i] = strdup(argv[i]); - new_argv[argc] = NULL; - - /* - * Set up locale information from environment. 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. The - * other ones will get reset later in InitializeGUCOptions, but we set - * them here to get already localized behavior during startup - * (e.g., error messages). - */ - setlocale(LC_COLLATE, ""); - setlocale(LC_CTYPE, ""); -#ifdef LC_MESSAGES - setlocale(LC_MESSAGES, ""); -#endif - setlocale(LC_MONETARY, ""); - setlocale(LC_NUMERIC, ""); - setlocale(LC_TIME, ""); - -#ifdef ENABLE_NLS - bindtextdomain("postgres", LOCALEDIR); - textdomain("postgres"); -#endif - - /* - * Skip permission checks if we're just trying to do --help or - * --version; otherwise root will get unhelpful failure messages from - * initdb. - */ - if (!(argc > 1 - && (strcmp(argv[1], "--help") == 0 || - strcmp(argv[1], "-?") == 0 || - strcmp(argv[1], "--version") == 0 || - strcmp(argv[1], "-V") == 0))) - { - /* - * 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() == 0) - { - fprintf(stderr, gettext( - "\"root\" execution of the PostgreSQL server is not permitted.\n\n" - "The server must be started under an unprivileged user id to prevent\n" - "a possible system security compromise. See the documentation for\n" - "more information on how to properly start the server.\n\n" - )); - exit(1); - } -#endif /* __BEOS__ */ - - /* - * 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()) - { - fprintf(stderr, gettext("%s: real and effective user ids must match\n"), - argv[0]); - exit(1); - } - } - - /* - * 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(new_argv[0]); - - if (len >= 10 && strcmp(new_argv[0] + len - 10, "postmaster") == 0) - { - /* Called as "postmaster" */ - exit(PostmasterMain(argc, new_argv)); - } - - /* - * 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(new_argv[1], "-boot") == 0) - exit(BootstrapMain(argc - 1, new_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) - { - fprintf(stderr, gettext("%s: invalid current euid %d\n"), - new_argv[0], (int) geteuid()); - exit(1); - } - /* Allocate new memory because later getpwuid() calls can overwrite it */ - pw_name_persist = strdup(pw->pw_name); - - exit(PostgresMain(argc, new_argv, pw_name_persist)); -} |