📄 miscinit.c
字号:
/*------------------------------------------------------------------------- * * miscinit.c * miscellanious initialization support stuff * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION * $Header: /usr/local/cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.29.2.1 1999/08/02 05:25:10 scrappy Exp $ * *------------------------------------------------------------------------- */#include <sys/param.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/file.h>#include <unistd.h>#include <grp.h>#include <pwd.h>#include "postgres.h"#include "catalog/catname.h"#include "catalog/pg_shadow.h"#include "miscadmin.h"#include "utils/syscache.h"/* * EnableAbortEnvVarName * Enables system abort iff set to a non-empty string in environment. */#define EnableAbortEnvVarName "POSTGRESABORT"extern char *getenv(const char *name); /* XXX STDLIB *//* from globals.c */extern char *UserName;#ifdef CYR_RECODEunsigned char RecodeForwTable[128];unsigned char RecodeBackTable[128];#endif/* * Define USE_ENVIRONMENT to get PGDATA, etc. from environment variables. * This is the default on UNIX platforms. */#define USE_ENVIRONMENT/* ---------------------------------------------------------------- * some of the 19 ways to leave postgres * ---------------------------------------------------------------- *//* * ExitPostgres * Exit POSTGRES with a status code. * * Note: * This function never returns. * ... * * Side effects: * ... * * Exceptions: * none */voidExitPostgres(ExitStatus status){ proc_exit(status);}/* * AbortPostgres * Abort POSTGRES dumping core. * * Note: * This function never returns. * ... * * Side effects: * Core is dumped iff EnableAbortEnvVarName is set to a non-empty string. * ... * * Exceptions: * none */#ifdef NOT_USEDvoidAbortPostgres(){ char *abortValue = getenv(EnableAbortEnvVarName); if (PointerIsValid(abortValue) && abortValue[0] != '\0') abort(); else proc_exit(FatalExitStatus);}/* ---------------- * StatusBackendExit * ---------------- */voidStatusBackendExit(int status){ /* someday, do some real cleanup and then call the LISP exit */ /* someday, call StatusPostmasterExit if running without postmaster */ proc_exit(status);}/* ---------------- * StatusPostmasterExit * ---------------- */voidStatusPostmasterExit(int status){ /* someday, do some real cleanup and then call the LISP exit */ proc_exit(status);}#endif/* ---------------------------------------------------------------- * processing mode support stuff (used to be in pmod.c) * ---------------------------------------------------------------- */static ProcessingMode Mode = NoProcessing;#ifdef NOT_USED/* * IsNoProcessingMode * True iff processing mode is NoProcessing. */boolIsNoProcessingMode(){ return (bool) (Mode == NoProcessing);}#endif/* * IsBootstrapProcessingMode * True iff processing mode is BootstrapProcessing. */boolIsBootstrapProcessingMode(){ return (bool) (Mode == BootstrapProcessing);}/* * IsInitProcessingMode * True iff processing mode is InitProcessing. */boolIsInitProcessingMode(){ return (bool) (Mode == InitProcessing);}/* * IsNormalProcessingMode * True iff processing mode is NormalProcessing. */boolIsNormalProcessingMode(){ return (bool) (Mode == NormalProcessing);}/* * SetProcessingMode * Sets mode of processing as specified. * * Exceptions: * BadArg if called with invalid mode. * * Note: * Mode is NoProcessing before the first time this is called. */voidSetProcessingMode(ProcessingMode mode){ AssertArg(mode == NoProcessing || mode == BootstrapProcessing || mode == InitProcessing || mode == NormalProcessing); Mode = mode;}ProcessingModeGetProcessingMode(){ return Mode;}/* ---------------------------------------------------------------- * database path / name support stuff * ---------------------------------------------------------------- */voidSetDatabasePath(char *path){ /* use malloc since this is done before memory contexts are set up */ if (DatabasePath) free(DatabasePath); DatabasePath = malloc(strlen(path) + 1); strcpy(DatabasePath, path);}voidSetDatabaseName(char *name){ if (DatabaseName) free(DatabaseName); DatabaseName = malloc(strlen(name) + 1); strcpy(DatabaseName, name);}#ifndef MULTIBYTE/* even if MULTIBYTE is not enabled, this function is neccesary * since pg_proc.h has an entry for it. */const char *getdatabaseencoding(){ elog(ERROR, "MultiByte strings (MB) must be enabled to use this function"); return ("");}#endif#ifdef CYR_RECODE#define MAX_TOKEN 80/* Some standard C libraries, including GNU, have an isblank() function. Others, including Solaris, do not. So we have our own.*/static boolisblank(const char c){ return c == ' ' || c == 9 /* tab */ ;}static voidnext_token(FILE *fp, char *buf, const int bufsz){/*-------------------------------------------------------------------------- Grab one token out of fp. Tokens are strings of non-blank characters bounded by blank characters, beginning of line, and end of line. Blank means space or tab. Return the token as *buf. Leave file positioned to character immediately after the token or EOF, whichever comes first. If no more tokens on line, return null string as *buf and position file to beginning of next line or EOF, whichever comes first.--------------------------------------------------------------------------*/ int c; char *eb = buf + (bufsz - 1); /* Move over inital token-delimiting blanks */ while (isblank(c = getc(fp))); if (c != '\n') { /* * build a token in buf of next characters up to EOF, eol, or * blank. */ while (c != EOF && c != '\n' && !isblank(c)) { if (buf < eb) *buf++ = c; c = getc(fp); /* * Put back the char right after the token (putting back EOF * is ok) */ } ungetc(c, fp); } *buf = '\0';}static voidread_through_eol(FILE *file){ int c; do c = getc(file); while (c != '\n' && c != EOF);}voidSetCharSet(){ FILE *file; char *p, c, eof = false; char *map_file; char buf[MAX_TOKEN]; int i; unsigned char FromChar, ToChar; for (i = 0; i < 128; i++) { RecodeForwTable[i] = i + 128; RecodeBackTable[i] = i + 128; } p = getenv("PG_RECODETABLE"); if (p && *p != '\0') { map_file = (char *) malloc((strlen(DataDir) + strlen(p) + 2) * sizeof(char)); sprintf(map_file, "%s/%s", DataDir, p);#ifndef __CYGWIN32__ file = AllocateFile(map_file, "r");#else file = AllocateFile(map_file, "rb");#endif if (file == NULL) return; eof = false; while (!eof) { c = getc(file); ungetc(c, file); if (c == EOF) eof = true; else { if (c == '#') read_through_eol(file); else { /* Read the FromChar */ next_token(file, buf, sizeof(buf)); if (buf[0] != '\0') { FromChar = strtoul(buf, 0, 0); /* Read the ToChar */ next_token(file, buf, sizeof(buf)); if (buf[0] != '\0') { ToChar = strtoul(buf, 0, 0); RecodeForwTable[FromChar - 128] = ToChar; RecodeBackTable[ToChar - 128] = FromChar; } read_through_eol(file); } } } } FreeFile(file); free(map_file); }}char *convertstr(unsigned char *buff, int len, int dest){ int i; char *ch = buff; for (i = 0; i < len; i++, buff++) { if (*buff > 127) if (dest) *buff = RecodeForwTable[*buff - 128]; else *buff = RecodeBackTable[*buff - 128]; } return ch;}#endif/* ---------------- * GetPgUserName and SetPgUserName * * SetPgUserName must be called before InitPostgres, since the setuid() * is done there. * * Replace GetPgUserName() with a lower-case version * to allow use in new case-insensitive SQL (referenced * in pg_proc.h). Define GetPgUserName() as a macro - tgl 97/04/26 * ---------------- */char *getpgusername(){ return UserName;}voidSetPgUserName(){#ifndef NO_SECURITY char *p; struct passwd *pw; if (IsUnderPostmaster) { /* use the (possibly) authenticated name that's provided */ if (!(p = getenv("PG_USER"))) elog(FATAL, "SetPgUserName: PG_USER environment variable is unset"); } else { /* setuid() has not yet been done, see above comment */ if (!(pw = getpwuid(geteuid()))) elog(FATAL, "SetPgUserName: no entry in host passwd file"); p = pw->pw_name; } if (UserName) free(UserName); UserName = malloc(strlen(p) + 1); strcpy(UserName, p);#endif /* NO_SECURITY */}/* ---------------------------------------------------------------- * GetUserId and SetUserId * ---------------------------------------------------------------- */static Oid UserId = InvalidOid;intGetUserId(){ Assert(OidIsValid(UserId)); return UserId;}voidSetUserId(){ HeapTuple userTup; char *userName; Assert(!OidIsValid(UserId));/* only once */ /* * Don't do scans if we're bootstrapping, none of the system catalogs * exist yet, and they should be owned by postgres anyway. */ if (IsBootstrapProcessingMode()) { UserId = geteuid(); return; } userName = GetPgUserName(); userTup = SearchSysCacheTuple(USENAME, PointerGetDatum(userName), 0, 0, 0); if (!HeapTupleIsValid(userTup)) elog(FATAL, "SetUserId: user '%s' is not in '%s'", userName, ShadowRelationName); UserId = (Oid) ((Form_pg_shadow) GETSTRUCT(userTup))->usesysid;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -