|
|
|
|
@ -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> |
|
|
|
|
@ -25,23 +33,35 @@ |
|
|
|
|
#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)); |
|
|
|
|
} |
|
|
|
|
|