mirror of https://github.com/postgres/postgres
parent
b8eb6400de
commit
13312a007d
@ -1,167 +0,0 @@ |
|||||||
/*-------------------------------------------------------------------------
|
|
||||||
* |
|
||||||
* magic.c-- |
|
||||||
* magic number management routines |
|
||||||
* |
|
||||||
* Copyright (c) 1994, Regents of the University of California |
|
||||||
* |
|
||||||
* |
|
||||||
* IDENTIFICATION |
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/init/Attic/magic.c,v 1.3 1996/11/06 10:31:56 scrappy Exp $ |
|
||||||
* |
|
||||||
* NOTES |
|
||||||
* XXX eventually, should be able to handle version identifiers |
|
||||||
* of length != 4. |
|
||||||
* |
|
||||||
* STANDALONE CODE - do not use error routines as this code is linked with |
|
||||||
* stuff that does not cinterface.a |
|
||||||
*------------------------------------------------------------------------- |
|
||||||
*/ |
|
||||||
#include <sys/file.h> |
|
||||||
#include <sys/types.h> |
|
||||||
#include <sys/stat.h> |
|
||||||
#include <ctype.h> |
|
||||||
#include <string.h> |
|
||||||
#include <stdio.h> |
|
||||||
#include <unistd.h> |
|
||||||
|
|
||||||
#include "postgres.h" |
|
||||||
|
|
||||||
#include "miscadmin.h" /* for global decls */ |
|
||||||
|
|
||||||
#include "storage/fd.h" /* for O_ */ |
|
||||||
|
|
||||||
static char Pg_verfile[] = PG_VERFILE; |
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* private function prototypes |
|
||||||
*/ |
|
||||||
static void PathSetVersionFilePath(const char *path, char *filepathbuf); |
|
||||||
|
|
||||||
/*
|
|
||||||
* DatabaseMetaGunkIsConsistent |
|
||||||
* |
|
||||||
* Returns 1 iff all version numbers and ownerships are consistent. |
|
||||||
* |
|
||||||
* Note that we have to go through the whole rigmarole of generating the path |
|
||||||
* and checking the existence of the database whether Noversion is set or not. |
|
||||||
*/ |
|
||||||
int |
|
||||||
DatabaseMetaGunkIsConsistent(const char *database, char *path) |
|
||||||
{ |
|
||||||
int isValid; |
|
||||||
#ifndef WIN32 |
|
||||||
struct stat statbuf; |
|
||||||
#else |
|
||||||
struct _stat statbuf; |
|
||||||
#endif |
|
||||||
|
|
||||||
/* XXX We haven't changed PG_VERSION since 1.1! */ |
|
||||||
#ifndef WIN32 |
|
||||||
isValid = ValidPgVersion(DataDir); |
|
||||||
sprintf(path, "%s/base/%s", DataDir, database); |
|
||||||
isValid = ValidPgVersion(path) || isValid; |
|
||||||
#endif /* WIN32 */ |
|
||||||
|
|
||||||
if (stat(path, &statbuf) < 0) |
|
||||||
elog(FATAL, "database %s does not exist, bailing out...", |
|
||||||
database); |
|
||||||
|
|
||||||
return(isValid); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ValidPgVersion - verifies the consistency of the database |
|
||||||
* |
|
||||||
* Returns 1 iff the catalog version number (from the version number file |
|
||||||
* in the directory specified in "path") is consistent with the backend |
|
||||||
* version number. |
|
||||||
*/ |
|
||||||
int |
|
||||||
ValidPgVersion(const char *path) |
|
||||||
{ |
|
||||||
int fd; |
|
||||||
char version[4], buf[MAXPGPATH+1]; |
|
||||||
#ifndef WIN32 |
|
||||||
struct stat statbuf; |
|
||||||
#else |
|
||||||
struct _stat statbuf; |
|
||||||
#endif |
|
||||||
u_short my_euid = geteuid(); |
|
||||||
|
|
||||||
PathSetVersionFilePath(path, buf); |
|
||||||
|
|
||||||
if (stat(buf, &statbuf) >= 0) { |
|
||||||
if (statbuf.st_uid != my_euid && my_euid != 0) |
|
||||||
elog(FATAL, |
|
||||||
"process userid (%d) != database owner (%d)", |
|
||||||
my_euid, statbuf.st_uid); |
|
||||||
} else |
|
||||||
return(0); |
|
||||||
|
|
||||||
if ((fd = open(buf, O_RDONLY, 0)) < 0) { |
|
||||||
if (!Noversion) |
|
||||||
elog(DEBUG, "ValidPgVersion: %s: %m", buf); |
|
||||||
return(0); |
|
||||||
} |
|
||||||
|
|
||||||
if (read(fd, version, 4) < 4 || |
|
||||||
!isascii(version[0]) || !isdigit(version[0]) || |
|
||||||
version[1] != '.' || |
|
||||||
!isascii(version[2]) || !isdigit(version[2]) || |
|
||||||
version[3] != '\n') |
|
||||||
elog(FATAL, "ValidPgVersion: %s: bad format", buf); |
|
||||||
if (version[2] != '0' + PG_VERSION || |
|
||||||
version[0] != '0' + PG_RELEASE) { |
|
||||||
if (!Noversion) |
|
||||||
elog(DEBUG, |
|
||||||
"ValidPgVersion: should be %d.%d not %c.%c", |
|
||||||
PG_RELEASE, PG_VERSION, version[0], version[2]); |
|
||||||
close(fd); |
|
||||||
return(0); |
|
||||||
} |
|
||||||
close(fd); |
|
||||||
return(1); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SetPgVersion - writes the version to a database directory |
|
||||||
*/ |
|
||||||
void |
|
||||||
SetPgVersion(const char *path) |
|
||||||
{ |
|
||||||
int fd; |
|
||||||
char version[4], buf[MAXPGPATH+1]; |
|
||||||
|
|
||||||
PathSetVersionFilePath(path, buf); |
|
||||||
|
|
||||||
if ((fd = open(buf, O_WRONLY|O_CREAT|O_EXCL, 0666)) < 0) |
|
||||||
elog(FATAL, "SetPgVersion: %s: %m", buf); |
|
||||||
|
|
||||||
version[0] = '0' + PG_RELEASE; |
|
||||||
version[1] = '.'; |
|
||||||
version[2] = '0' + PG_VERSION; |
|
||||||
version[3] = '\n'; |
|
||||||
if (write(fd, version, 4) != 4) |
|
||||||
elog(WARN, "SetPgVersion: %s: %m", buf); |
|
||||||
|
|
||||||
close(fd); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PathSetVersionFilePath |
|
||||||
* |
|
||||||
* Destructively change "filepathbuf" to contain the concatenation of "path" |
|
||||||
* and the name of the version file name. |
|
||||||
*/ |
|
||||||
static void |
|
||||||
PathSetVersionFilePath(const char *path, char *filepathbuf) |
|
||||||
{ |
|
||||||
if (strlen(path) > (MAXPGPATH - sizeof(Pg_verfile) - 1)) |
|
||||||
elog(FATAL, "PathSetVersionFilePath: %s: path too long"); |
|
||||||
sprintf(filepathbuf, "%s%c%s", path, SEP_CHAR, Pg_verfile); |
|
||||||
} |
|
||||||
Loading…
Reference in new issue