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)