pg_ctl.diff
text/plain
Filename: pg_ctl.diff
Type: text/plain
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/bin/pg_ctl/pg_ctl.c | 74 | 35 |
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)