Hi, all
I created a pg_ctl patch to fix:
* BUG #5103: "pg_ctl -w (re)start" fails with custom unix_socket_directory
Allow pg_ctl to work properly with configuration files located outside the
PGDATA directory
I tested it under Windows XP sp3.
All of configuration files(postgresql.conf pg_hba.conf pg_ident.conf) are in
c:\data,
and data_dir is in C:\Program Files\PostgreSQL\9.0\data
Check the attchment, please.
Another question, after clone source with git I can not compile them:
Bad format filename 'src\bin\scripts\submake-libpq'
Former makefile like "createdb: createdb.o ... keywords.o"
Now it is "createdb: createdb.o ... keywords.o | submake-libpq"
How to do this?
------------------------------------------
SEARCHING JOB. I can work on C/C++.
Quan Zongliang <[email protected]>
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
old mode 100644
new mode 100755
index 14d36b5..c708ba8
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -89,6 +89,8 @@ static char *register_username = NULL;
static char *register_password = NULL;
static char *argv0 = NULL;
static bool allow_core_files = false;
+static char *pgconf_portstr = NULL;
+static char *pgconf_datadir = NULL;
static void
write_stderr(const char *fmt,...)
@@ -455,41 +457,7 @@ test_postmaster_connection(bool do_checkpoint)
* for valid port settings.
*/
if (!*portstr)
- {
- char **optlines;
-
- optlines = readfile(conf_file);
- if (optlines != NULL)
- {
- for (; *optlines != NULL; optlines++)
- {
- p = *optlines;
-
- while (isspace((unsigned char) *p))
- p++;
- if (strncmp(p, "port", 4) != 0)
- continue;
- p += 4;
- while (isspace((unsigned char) *p))
- p++;
- if (*p != '=')
- continue;
- p++;
- /* advance past any whitespace/quoting */
- while (isspace((unsigned char) *p) || *p ==
'\'' || *p == '"')
- p++;
- /* find end of value (not including any ending
quote/comment!) */
- q = p;
- while (*q &&
- !(isspace((unsigned char) *q) ||
- *q == '\'' || *q == '"' || *q
== '#'))
- q++;
- /* and save the argument value */
- strlcpy(portstr, p, Min((q - p) + 1,
sizeof(portstr)));
- /* keep looking, maybe there is another */
- }
- }
- }
+ strlcpy(portstr, pgconf_portstr, Min(sizeof(pgconf_portstr)+1,
sizeof(portstr)));
/* Check environment */
if (!*portstr && getenv("PGPORT") != NULL)
@@ -547,6 +515,75 @@ test_postmaster_connection(bool do_checkpoint)
}
+static void
+read_conf_file(void)
+{
+ char **optlines;
+ char *p, *q;
+ bool isportnum, isdatadir, isquoted;
+
+ optlines = readfile(conf_file);
+ if (optlines == NULL)
+ return;
+
+ for (; *optlines != NULL; optlines++)
+ {
+ p = *optlines;
+
+ while (isspace((unsigned char) *p))
+ p++;
+
+ if (strncmp(p, "port", 4) == 0)
+ {
+ isportnum = true;
+ p += 4;
+ }
+ else if (strncmp(p, "data_directory", 14) == 0)
+ {
+ isdatadir = true;
+ p += 14;
+ }
+ else
+ continue;
+
+ while (isspace((unsigned char) *p))
+ p++;
+ if (*p != '=')
+ continue;
+ p++;
+ isquoted = false;
+ /* advance past any whitespace/quoting */
+ while (isspace((unsigned char) *p) || *p == '\'' || *p == '"')
+ {
+ if (*p == '\'' || *p == '"')
+ isquoted = true;
+ p++;
+ }
+ /* find end of value (not including any ending quote/comment!)
*/
+ q = p;
+ while (*q &&
+ !((!isquoted && isspace((unsigned char) *q)) ||
+ *q == '\'' || *q == '"' || *q == '#'))
+ q++;
+ /* and save the argument value */
+ if (isportnum)
+ {
+ pgconf_portstr = (char *) pg_malloc((q - p) + 2);
+ strlcpy(pgconf_portstr, p, (q - p) + 1);
+ }
+ else if (isdatadir)
+ {
+ pgconf_datadir = (char *) pg_malloc((q - p) + 2);
+ strlcpy(pgconf_datadir, p, (q - p) + 1);
+ snprintf(pid_file, MAXPGPATH, "%s/postmaster.pid",
pgconf_datadir);
+ }
+ /* keep looking, maybe there is another */
+ }
+
+ free(optlines);
+}
+
+
#if defined(HAVE_GETRLIMIT) && defined(RLIMIT_CORE)
static void
unlimit_core_size(void)
@@ -2010,6 +2047,8 @@ main(int argc, char **argv)
snprintf(conf_file, MAXPGPATH, "%s/postgresql.conf", pg_data);
snprintf(backup_file, MAXPGPATH, "%s/backup_label", pg_data);
snprintf(recovery_file, MAXPGPATH, "%s/recovery.conf", pg_data);
+
+ read_conf_file();
}
switch (ctl_command)
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers