pg_ctl.diff

text/plain

Filename: pg_ctl.diff
Type: text/plain
Part: 0
Message: Patch BUG #5103: "pg_ctl -w (re)start" fails with custom unix_socket_directory

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)