aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils')
-rw-r--r--src/backend/utils/adt/misc.c13
-rw-r--r--src/backend/utils/init/flatfiles.c36
-rw-r--r--src/backend/utils/init/globals.c20
-rw-r--r--src/backend/utils/init/miscinit.c72
-rw-r--r--src/backend/utils/init/postinit.c8
-rw-r--r--src/backend/utils/misc/guc.c59
6 files changed, 93 insertions, 115 deletions
diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c
index 45532539664..867f7da7e2a 100644
--- a/src/backend/utils/adt/misc.c
+++ b/src/backend/utils/adt/misc.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/misc.c,v 1.44 2005/06/19 21:34:02 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/misc.c,v 1.45 2005/07/04 04:51:50 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -145,10 +145,10 @@ pg_tablespace_databases(PG_FUNCTION_ARGS)
fctx = palloc(sizeof(ts_db_fctx));
/*
- * size = path length + tablespace dirname length + 2 dir sep
- * chars + oid + terminator
+ * size = tablespace dirname length + dir sep
+ * char + oid + terminator
*/
- fctx->location = (char *) palloc(strlen(DataDir) + 11 + 10 + 1);
+ fctx->location = (char *) palloc(10 + 10 + 1);
if (tablespaceOid == GLOBALTABLESPACE_OID)
{
fctx->dirdesc = NULL;
@@ -158,10 +158,9 @@ pg_tablespace_databases(PG_FUNCTION_ARGS)
else
{
if (tablespaceOid == DEFAULTTABLESPACE_OID)
- sprintf(fctx->location, "%s/base", DataDir);
+ sprintf(fctx->location, "base");
else
- sprintf(fctx->location, "%s/pg_tblspc/%u", DataDir,
- tablespaceOid);
+ sprintf(fctx->location, "pg_tblspc/%u", tablespaceOid);
fctx->dirdesc = AllocateDir(fctx->location);
diff --git a/src/backend/utils/init/flatfiles.c b/src/backend/utils/init/flatfiles.c
index 2343c01b548..e4b7154b93b 100644
--- a/src/backend/utils/init/flatfiles.c
+++ b/src/backend/utils/init/flatfiles.c
@@ -23,7 +23,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/backend/utils/init/flatfiles.c,v 1.11 2005/06/29 20:34:15 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/init/flatfiles.c,v 1.12 2005/07/04 04:51:50 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -50,9 +50,9 @@
#include "utils/syscache.h"
-/* Actual names of the flat files (within $PGDATA/global/) */
-#define DATABASE_FLAT_FILE "pg_database"
-#define AUTH_FLAT_FILE "pg_auth"
+/* Actual names of the flat files (within $PGDATA) */
+#define DATABASE_FLAT_FILE "global/pg_database"
+#define AUTH_FLAT_FILE "global/pg_auth"
/* Info bits in a flatfiles 2PC record */
#define FF_BIT_DATABASE 1
@@ -98,41 +98,29 @@ auth_file_update_needed(void)
/*
- * database_getflatfilename --- get full pathname of database file
+ * database_getflatfilename --- get pathname of database file
*
* Note that result string is palloc'd, and should be freed by the caller.
+ * (This convention is not really needed anymore, since the relative path
+ * is fixed.)
*/
char *
database_getflatfilename(void)
{
- int bufsize;
- char *pfnam;
-
- bufsize = strlen(DataDir) + strlen("/global/") +
- strlen(DATABASE_FLAT_FILE) + 1;
- pfnam = (char *) palloc(bufsize);
- snprintf(pfnam, bufsize, "%s/global/%s", DataDir, DATABASE_FLAT_FILE);
-
- return pfnam;
+ return pstrdup(DATABASE_FLAT_FILE);
}
/*
- * auth_getflatfilename --- get full pathname of auth file
+ * auth_getflatfilename --- get pathname of auth file
*
* Note that result string is palloc'd, and should be freed by the caller.
+ * (This convention is not really needed anymore, since the relative path
+ * is fixed.)
*/
char *
auth_getflatfilename(void)
{
- int bufsize;
- char *pfnam;
-
- bufsize = strlen(DataDir) + strlen("/global/") +
- strlen(AUTH_FLAT_FILE) + 1;
- pfnam = (char *) palloc(bufsize);
- snprintf(pfnam, bufsize, "%s/global/%s", DataDir, AUTH_FLAT_FILE);
-
- return pfnam;
+ return pstrdup(AUTH_FLAT_FILE);
}
diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c
index 1c9725d6298..a4fb354a4c9 100644
--- a/src/backend/utils/init/globals.c
+++ b/src/backend/utils/init/globals.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/init/globals.c,v 1.95 2004/12/31 22:01:40 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/init/globals.c,v 1.96 2005/07/04 04:51:50 tgl Exp $
*
* NOTES
* Globals used all over the place should be declared here and not
@@ -36,13 +36,14 @@ int MyProcPid;
struct Port *MyProcPort;
long MyCancelKey;
+/*
+ * DataDir is the absolute path to the top level of the PGDATA directory tree.
+ * Except during early startup, this is also the server's working directory;
+ * most code therefore can simply use relative paths and not reference DataDir
+ * explicitly.
+ */
char *DataDir = NULL;
- /*
- * The PGDATA directory user says to use, or defaults to via environment
- * variable. NULL if no option given and no environment variable set
- */
-
char OutputFileName[MAXPGPATH]; /* debugging output file */
char my_exec_path[MAXPGPATH]; /* full path to my executable */
@@ -56,11 +57,16 @@ char postgres_exec_path[MAXPGPATH]; /* full path to backend */
BackendId MyBackendId = InvalidBackendId;
-char *DatabasePath = NULL;
Oid MyDatabaseId = InvalidOid;
Oid MyDatabaseTableSpace = InvalidOid;
+/*
+ * DatabasePath is the path (relative to DataDir) of my database's
+ * primary directory, ie, its directory in the default tablespace.
+ */
+char *DatabasePath = NULL;
+
pid_t PostmasterPid = 0;
/*
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c
index be1f6e70496..ffe7db5f7e5 100644
--- a/src/backend/utils/init/miscinit.c
+++ b/src/backend/utils/init/miscinit.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/init/miscinit.c,v 1.144 2005/06/28 22:16:45 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/init/miscinit.c,v 1.145 2005/07/04 04:51:50 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -41,10 +41,11 @@
#include "utils/syscache.h"
+#define DIRECTORY_LOCK_FILE "postmaster.pid"
+
ProcessingMode Mode = InitProcessing;
-/* Note: we rely on these to initialize as zeroes */
-static char directoryLockFile[MAXPGPATH];
+/* Note: we rely on this to initialize as zeroes */
static char socketLockFile[MAXPGPATH];
@@ -178,15 +179,32 @@ SetDataDir(const char *dir)
}
/*
+ * Change working directory to DataDir. Most of the postmaster and backend
+ * code assumes that we are in DataDir so it can use relative paths to access
+ * stuff in and under the data directory. For convenience during path
+ * setup, however, we don't force the chdir to occur during SetDataDir.
+ */
+void
+ChangeToDataDir(void)
+{
+ AssertState(DataDir);
+
+ if (chdir(DataDir) < 0)
+ ereport(FATAL,
+ (errcode_for_file_access(),
+ errmsg("could not change directory to \"%s\": %m",
+ DataDir)));
+}
+
+/*
* If the given pathname isn't already absolute, make it so, interpreting
* it relative to the current working directory.
*
* Also canonicalizes the path. The result is always a malloc'd copy.
*
- * Note: it is probably unwise to use this in running backends, since they
- * have chdir'd to a database-specific subdirectory; the results would not be
- * consistent across backends. Currently this is used only during postmaster
- * or standalone-backend startup.
+ * Note: interpretation of relative-path arguments during postmaster startup
+ * should happen before doing ChangeToDataDir(), else the user will probably
+ * not like the results.
*/
char *
make_absolute_path(const char *path)
@@ -713,17 +731,22 @@ CreateLockFile(const char *filename, bool amPostmaster,
on_proc_exit(UnlinkLockFile, PointerGetDatum(strdup(filename)));
}
+/*
+ * Create the data directory lockfile.
+ *
+ * When this is called, we must have already switched the working
+ * directory to DataDir, so we can just use a relative path. This
+ * helps ensure that we are locking the directory we should be.
+ */
void
-CreateDataDirLockFile(const char *datadir, bool amPostmaster)
+CreateDataDirLockFile(bool amPostmaster)
{
- char lockfile[MAXPGPATH];
-
- snprintf(lockfile, sizeof(lockfile), "%s/postmaster.pid", datadir);
- CreateLockFile(lockfile, amPostmaster, true, datadir);
- /* Save name of lockfile for RecordSharedMemoryInLockFile */
- strcpy(directoryLockFile, lockfile);
+ CreateLockFile(DIRECTORY_LOCK_FILE, amPostmaster, true, DataDir);
}
+/*
+ * Create a lockfile for the specified Unix socket file.
+ */
void
CreateSocketLockFile(const char *socketfile, bool amPostmaster)
{
@@ -777,7 +800,7 @@ TouchSocketLockFile(void)
/*
* Append information about a shared memory segment to the data directory
- * lock file (if we have created one).
+ * lock file.
*
* This may be called multiple times in the life of a postmaster, if we
* delete and recreate shmem due to backend crash. Therefore, be prepared
@@ -793,20 +816,13 @@ RecordSharedMemoryInLockFile(unsigned long id1, unsigned long id2)
char *ptr;
char buffer[BLCKSZ];
- /*
- * Do nothing if we did not create a lockfile (probably because we are
- * running standalone).
- */
- if (directoryLockFile[0] == '\0')
- return;
-
- fd = open(directoryLockFile, O_RDWR | PG_BINARY, 0);
+ fd = open(DIRECTORY_LOCK_FILE, O_RDWR | PG_BINARY, 0);
if (fd < 0)
{
ereport(LOG,
(errcode_for_file_access(),
errmsg("could not open file \"%s\": %m",
- directoryLockFile)));
+ DIRECTORY_LOCK_FILE)));
return;
}
len = read(fd, buffer, sizeof(buffer) - 100);
@@ -815,7 +831,7 @@ RecordSharedMemoryInLockFile(unsigned long id1, unsigned long id2)
ereport(LOG,
(errcode_for_file_access(),
errmsg("could not read from file \"%s\": %m",
- directoryLockFile)));
+ DIRECTORY_LOCK_FILE)));
close(fd);
return;
}
@@ -828,7 +844,7 @@ RecordSharedMemoryInLockFile(unsigned long id1, unsigned long id2)
if (ptr == NULL ||
(ptr = strchr(ptr + 1, '\n')) == NULL)
{
- elog(LOG, "bogus data in \"%s\"", directoryLockFile);
+ elog(LOG, "bogus data in \"%s\"", DIRECTORY_LOCK_FILE);
close(fd);
return;
}
@@ -855,7 +871,7 @@ RecordSharedMemoryInLockFile(unsigned long id1, unsigned long id2)
ereport(LOG,
(errcode_for_file_access(),
errmsg("could not write to file \"%s\": %m",
- directoryLockFile)));
+ DIRECTORY_LOCK_FILE)));
close(fd);
return;
}
@@ -864,7 +880,7 @@ RecordSharedMemoryInLockFile(unsigned long id1, unsigned long id2)
ereport(LOG,
(errcode_for_file_access(),
errmsg("could not write to file \"%s\": %m",
- directoryLockFile)));
+ DIRECTORY_LOCK_FILE)));
}
}
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index 21b0650e827..18e60cab0f1 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.151 2005/06/28 19:51:23 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.152 2005/07/04 04:51:50 tgl Exp $
*
*
*-------------------------------------------------------------------------
@@ -338,12 +338,6 @@ InitPostgres(const char *dbname, const char *username)
ValidatePgVersion(fullpath);
- if (chdir(fullpath) == -1)
- ereport(FATAL,
- (errcode_for_file_access(),
- errmsg("could not change directory to \"%s\": %m",
- fullpath)));
-
SetDatabasePath(fullpath);
}
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 84d8085503a..0ea335770c3 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -10,7 +10,7 @@
* Written by Peter Eisentraut <peter_e@gmx.net>.
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.271 2005/06/28 05:09:02 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.272 2005/07/04 04:51:51 tgl Exp $
*
*--------------------------------------------------------------------
*/
@@ -74,6 +74,7 @@
#ifdef EXEC_BACKEND
#define CONFIG_EXEC_PARAMS "global/config_exec_params"
+#define CONFIG_EXEC_PARAMS_NEW "global/config_exec_params.new"
#endif
/* XXX these should appear in other modules' header files */
@@ -2619,7 +2620,9 @@ SelectConfigFiles(const char *userDoption, const char *progname)
* Reflect the final DataDir value back into the data_directory GUC var.
* (If you are wondering why we don't just make them a single variable,
* it's because the EXEC_BACKEND case needs DataDir to be transmitted to
- * child backends specially.)
+ * child backends specially. XXX is that still true? Given that we
+ * now chdir to DataDir, EXEC_BACKEND can read the config file without
+ * knowing DataDir in advance.)
*/
SetConfigOption("data_directory", DataDir, PGC_POSTMASTER, PGC_S_OVERRIDE);
@@ -4849,6 +4852,7 @@ _ShowOption(struct config_generic * record)
#ifdef EXEC_BACKEND
+
/*
* This routine dumps out all non-default GUC options into a binary
* file that is read by all exec'ed backends. The format is:
@@ -4861,42 +4865,23 @@ void
write_nondefault_variables(GucContext context)
{
int i;
- char *new_filename,
- *filename;
int elevel;
FILE *fp;
Assert(context == PGC_POSTMASTER || context == PGC_SIGHUP);
- Assert(DataDir);
elevel = (context == PGC_SIGHUP) ? LOG : ERROR;
/*
* Open file
*/
- new_filename = guc_malloc(elevel, strlen(DataDir) + strlen(CONFIG_EXEC_PARAMS) +
- strlen(".new") + 2);
- if (new_filename == NULL)
- return;
-
- filename = guc_malloc(elevel, strlen(DataDir) + strlen(CONFIG_EXEC_PARAMS) + 2);
- if (filename == NULL)
- {
- free(new_filename);
- return;
- }
-
- sprintf(new_filename, "%s/" CONFIG_EXEC_PARAMS ".new", DataDir);
- sprintf(filename, "%s/" CONFIG_EXEC_PARAMS, DataDir);
-
- fp = AllocateFile(new_filename, "w");
+ fp = AllocateFile(CONFIG_EXEC_PARAMS_NEW, "w");
if (!fp)
{
- free(new_filename);
- free(filename);
ereport(elevel,
(errcode_for_file_access(),
- errmsg("could not write to file \"%s\": %m", CONFIG_EXEC_PARAMS)));
+ errmsg("could not write to file \"%s\": %m",
+ CONFIG_EXEC_PARAMS_NEW)));
return;
}
@@ -4956,11 +4941,10 @@ write_nondefault_variables(GucContext context)
if (FreeFile(fp))
{
- free(new_filename);
- free(filename);
ereport(elevel,
(errcode_for_file_access(),
- errmsg("could not write to file \"%s\": %m", CONFIG_EXEC_PARAMS)));
+ errmsg("could not write to file \"%s\": %m",
+ CONFIG_EXEC_PARAMS_NEW)));
return;
}
@@ -4968,9 +4952,7 @@ write_nondefault_variables(GucContext context)
* Put new file in place. This could delay on Win32, but we don't
* hold any exclusive locks.
*/
- rename(new_filename, filename);
- free(new_filename);
- free(filename);
+ rename(CONFIG_EXEC_PARAMS_NEW, CONFIG_EXEC_PARAMS);
}
@@ -5014,29 +4996,23 @@ read_string_with_null(FILE *fp)
void
read_nondefault_variables(void)
{
- char *filename;
FILE *fp;
char *varname,
*varvalue;
int varsource;
- Assert(DataDir);
-
/*
* Open file
*/
- filename = guc_malloc(FATAL, strlen(DataDir) + strlen(CONFIG_EXEC_PARAMS) + 2);
- sprintf(filename, "%s/" CONFIG_EXEC_PARAMS, DataDir);
-
- fp = AllocateFile(filename, "r");
+ fp = AllocateFile(CONFIG_EXEC_PARAMS, "r");
if (!fp)
{
- free(filename);
/* File not found is fine */
if (errno != ENOENT)
ereport(FATAL,
(errcode_for_file_access(),
- errmsg("could not read from file \"%s\": %m", CONFIG_EXEC_PARAMS)));
+ errmsg("could not read from file \"%s\": %m",
+ CONFIG_EXEC_PARAMS)));
return;
}
@@ -5061,10 +5037,9 @@ read_nondefault_variables(void)
}
FreeFile(fp);
- free(filename);
- return;
}
-#endif
+
+#endif /* EXEC_BACKEND */
/*