diff options
Diffstat (limited to 'src/utils/version.c')
-rw-r--r-- | src/utils/version.c | 190 |
1 files changed, 104 insertions, 86 deletions
diff --git a/src/utils/version.c b/src/utils/version.c index 45e5f7a51ab..9d7c75556b9 100644 --- a/src/utils/version.c +++ b/src/utils/version.c @@ -1,25 +1,25 @@ /*------------------------------------------------------------------------- * * version.c-- - * Routines to handle Postgres version number. + * Routines to handle Postgres version number. * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/utils/Attic/version.c,v 1.6 1997/08/27 03:48:50 momjian Exp $ + * $Header: /cvsroot/pgsql/src/utils/Attic/version.c,v 1.7 1997/09/07 05:04:48 momjian Exp $ * * NOTES - * XXX eventually, should be able to handle version identifiers - * of length != 4. + * 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 + * STANDALONE CODE - do not use error routines as this code is linked with + * stuff that does not cinterface.a *------------------------------------------------------------------------- */ #include <sys/types.h> #include <sys/file.h> -#include <fcntl.h> /* For open() flags */ +#include <fcntl.h> /* For open() flags */ #include <sys/stat.h> #include <ctype.h> #include <string.h> @@ -29,109 +29,127 @@ #include "postgres.h" -#include "storage/fd.h" /* for O_ */ +#include "storage/fd.h" /* for O_ */ -#include "version.h" +#include "version.h" static void -PathSetVersionFilePath(const char *path, char *filepathbuf) { +PathSetVersionFilePath(const char *path, char *filepathbuf) +{ /*---------------------------------------------------------------------------- PathSetVersionFilePath - + Destructively change "filepathbuf" to contain the concatenation of "path" and the name of the version file name. ----------------------------------------------------------------------------*/ - if (strlen(path) > (MAXPGPATH - sizeof(PG_VERFILE) - 1)) - *filepathbuf = '\0'; - else - sprintf(filepathbuf, "%s%c%s", path, SEP_CHAR, PG_VERFILE); + if (strlen(path) > (MAXPGPATH - sizeof(PG_VERFILE) - 1)) + *filepathbuf = '\0'; + else + sprintf(filepathbuf, "%s%c%s", path, SEP_CHAR, PG_VERFILE); } void -ValidatePgVersion(const char *path, char **reason_p) { +ValidatePgVersion(const char *path, char **reason_p) +{ /*---------------------------------------------------------------------------- - Determine whether the PG_VERSION file in directory <path> indicates - a data version compatible with the version of this program. - - If compatible, return <*reason_p> == NULL. Otherwise, malloc space, - fill it with a text string explaining how it isn't compatible (or why - we can't tell), and return a pointer to that space as <*reason_p>. + Determine whether the PG_VERSION file in directory <path> indicates + a data version compatible with the version of this program. + + If compatible, return <*reason_p> == NULL. Otherwise, malloc space, + fill it with a text string explaining how it isn't compatible (or why + we can't tell), and return a pointer to that space as <*reason_p>. -----------------------------------------------------------------------------*/ - int fd; - char version[4]; - char full_path[MAXPGPATH+1]; - - PathSetVersionFilePath(path, full_path); - - if ((fd = open(full_path, O_RDONLY,0)) == -1) { - *reason_p = malloc(200); - sprintf(*reason_p, "File '%s' does not exist or no read permission.", full_path); - } else { - if (read(fd, version, 4) < 4 || - !isascii(version[0]) || !isdigit(version[0]) || - version[1] != '.' || - !isascii(version[2]) || !isdigit(version[2]) || - version[3] != '\n') { - - *reason_p = malloc(200); - sprintf(*reason_p, "File '%s' does not have a valid format " - "for a PG_VERSION file.", full_path); - } else { - if (version[2] != '0' + PG_VERSION || - version[0] != '0' + PG_RELEASE) { - *reason_p = malloc(200); - sprintf(*reason_p, - "Version number in file '%s' should be %d.%d, " - "not %c.%c.", - full_path, - PG_RELEASE, PG_VERSION, version[0], version[2]); - } else *reason_p = NULL; - } - close(fd); - } + int fd; + char version[4]; + char full_path[MAXPGPATH + 1]; + + PathSetVersionFilePath(path, full_path); + + if ((fd = open(full_path, O_RDONLY, 0)) == -1) + { + *reason_p = malloc(200); + sprintf(*reason_p, "File '%s' does not exist or no read permission.", full_path); + } + else + { + if (read(fd, version, 4) < 4 || + !isascii(version[0]) || !isdigit(version[0]) || + version[1] != '.' || + !isascii(version[2]) || !isdigit(version[2]) || + version[3] != '\n') + { + + *reason_p = malloc(200); + sprintf(*reason_p, "File '%s' does not have a valid format " + "for a PG_VERSION file.", full_path); + } + else + { + if (version[2] != '0' + PG_VERSION || + version[0] != '0' + PG_RELEASE) + { + *reason_p = malloc(200); + sprintf(*reason_p, + "Version number in file '%s' should be %d.%d, " + "not %c.%c.", + full_path, + PG_RELEASE, PG_VERSION, version[0], version[2]); + } + else + *reason_p = NULL; + } + close(fd); + } } void -SetPgVersion(const char *path, char **reason_p) { +SetPgVersion(const char *path, char **reason_p) +{ /*--------------------------------------------------------------------------- Create the PG_VERSION file in the directory <path>. - + If we fail, allocate storage, fill it with a text string explaining why, - and return a pointer to that storage as <*reason_p>. If we succeed, + and return a pointer to that storage as <*reason_p>. If we succeed, return *reason_p = NULL. ---------------------------------------------------------------------------*/ - int fd; - char version[4]; - char full_path[MAXPGPATH+1]; - - PathSetVersionFilePath(path, full_path); - - fd = open(full_path, O_WRONLY|O_CREAT|O_EXCL, 0666); - if (fd < 0) { - *reason_p = malloc(100 + strlen(full_path)); - sprintf(*reason_p, - "Unable to create file '%s', errno from open(): %s (%d).", - full_path, strerror(errno), errno); - } else { - int rc; /* return code from some function we call */ - - version[0] = '0' + PG_RELEASE; - version[1] = '.'; - version[2] = '0' + PG_VERSION; - version[3] = '\n'; - rc = write(fd, version, 4); - if (rc != 4) { - *reason_p = malloc(100 + strlen(full_path)); - sprintf(*reason_p, - "Failed to write to file '%s', after it was already " - "open. Errno from write(): %s (%d)", - full_path, strerror(errno), errno); - } else *reason_p = NULL; - close(fd); - } + int fd; + char version[4]; + char full_path[MAXPGPATH + 1]; + + PathSetVersionFilePath(path, full_path); + + fd = open(full_path, O_WRONLY | O_CREAT | O_EXCL, 0666); + if (fd < 0) + { + *reason_p = malloc(100 + strlen(full_path)); + sprintf(*reason_p, + "Unable to create file '%s', errno from open(): %s (%d).", + full_path, strerror(errno), errno); + } + else + { + int rc; /* return code from some function we call */ + + version[0] = '0' + PG_RELEASE; + version[1] = '.'; + version[2] = '0' + PG_VERSION; + version[3] = '\n'; + rc = write(fd, version, 4); + if (rc != 4) + { + *reason_p = malloc(100 + strlen(full_path)); + sprintf(*reason_p, + "Failed to write to file '%s', after it was already " + "open. Errno from write(): %s (%d)", + full_path, strerror(errno), errno); + } + else + *reason_p = NULL; + close(fd); + } } |