---- postgresql-8.2.5/src/bin/pg_ctl/pg_ctl.c.orig 2007-09-18 22:08:39.757996485 +0100
-+++ postgresql-8.2.5/src/bin/pg_ctl/pg_ctl.c 2007-09-18 22:43:12.441795575 +0100
-@@ -19,6 +19,7 @@
-
- #include "postgres_fe.h"
- #include "libpq-fe.h"
-+#include "pg_config_manual.h"
-
- #include <locale.h>
- #include <signal.h>
-@@ -404,10 +405,12 @@
+--- postgresql-8.3.1/src/bin/pg_ctl/pg_ctl.c.orig 2008-03-01 00:31:42.000000000 +0100
++++ postgresql-8.3.1/src/bin/pg_ctl/pg_ctl.c 2008-03-20 22:59:22.658133220 +0100
+@@ -412,12 +412,12 @@
+ PGconn *conn;
bool success = false;
int i;
- char portstr[32];
-+ char sockstr[MAXPGPATH];
+- char portstr[32];
++ char portstr[32], sockstr[MAXPGPATH];
char *p;
-- char connstr[128]; /* Should be way more than enough! */
-+ char connstr[MAXPGPATH+128];
+ char *q;
+- char connstr[128]; /* Should be way more than enough! */
++ char connstr[128+MAXPGPATH]; /* Should be way more than enough! */
- *portstr = '\0';
-+ *sockstr = '\0';
+- *portstr = '\0';
++ *portstr = *sockstr = '\0';
- /* post_opts */
- for (p = post_opts; *p;)
-@@ -432,7 +435,7 @@
- }
-
- /* config file */
+ /*
+ * Look in post_opts for a -p switch.
+@@ -448,6 +448,21 @@
+ strlcpy(portstr, p, Min((q - p) + 1, sizeof(portstr)));
+ /* keep looking, maybe there is another -p */
+ p = q;
++ } else if (strncmp(p, "-k", strlen("-k")) == 0)
++ {
++ p += 2;
++ /* advance past whitespace/quoting */
++ while (isspace((unsigned char) *p) || *p == '\'' || *p == '"')
++ p++;
++ /* find end of value (not including any ending quote!) */
++ q = p;
++ while (*q &&
++ !(isspace((unsigned char) *q) || *q == '\'' || *q == '"'))
++ q++;
++ /* and save the argument value */
++ strlcpy(sockstr, p, Min(q - p + 1, sizeof(sockstr)));
++ /* keep looking, maybe there is another -k */
++ p = q;
+ }
+ /* Advance to next whitespace */
+ while (*p && !isspace((unsigned char) *p))
+@@ -460,7 +475,7 @@
+ * This parsing code isn't amazingly bright either, but it should be
+ * okay for valid port settings.
+ */
- if (!*portstr)
+ if (!*portstr || !*sockstr)
{
char **optlines;
-@@ -445,18 +448,32 @@
+@@ -473,8 +488,7 @@
while (isspace((unsigned char) *p))
p++;
-- if (strncmp(p, "port", strlen("port")) != 0)
+- if (strncmp(p, "port", 4) != 0)
- continue;
-- p += strlen("port");
-- while (isspace((unsigned char) *p))
-- p++;
-- if (*p != '=')
-- continue;
-- p++;
-- while (isspace((unsigned char) *p))
-+ if (!*portstr && strncmp(p, "port", strlen("port")) == 0)
-+ {
-+ p += strlen("port");
-+ while (isspace((unsigned char) *p))
-+ p++;
-+ if (*p != '=')
-+ continue;
++ if (!strncmp(p, "port", 4)) {
+ p += 4;
+ while (isspace((unsigned char) *p))
p++;
-- StrNCpy(portstr, p, Min(strcspn(p, "#" WHITESPACE) + 1,
-+ while (isspace((unsigned char) *p))
-+ p++;
-+ StrNCpy(portstr, p, Min(strcspn(p, "#" WHITESPACE) + 1,
- sizeof(portstr)));
-+ }
-+ if (!*sockstr && strncmp(p, "unix_socket_directory", strlen("unix_socket_directory")) == 0)
-+ {
-+ p += strlen("unix_socket_directory");
+@@ -493,6 +507,26 @@
+ /* and save the argument value */
+ strlcpy(portstr, p, Min((q - p) + 1, sizeof(portstr)));
+ /* keep looking, maybe there is another */
++ } else if(!strncmp(p, "unix_socket_directory", 21)) {
++ p += 21;
+ while (isspace((unsigned char) *p))
+ p++;
+ if (*p != '=')
+ continue;
+ p++;
++ /* advance past any whitespace/quoting */
+ while (isspace((unsigned char) *p) || *p == '\'' || *p == '"')
+ p++;
-+ StrNCpy(sockstr, p, Min(strcspn(p, "#\"'" WHITESPACE) + 1,
-+ sizeof(sockstr)));
++ /* 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(sockstr, p, Min((q - p) + 1, sizeof(sockstr)));
++ /* keep looking, maybe there is another */
+ }
- /* keep looking, maybe there is another */
}
}
-@@ -473,6 +490,12 @@
- /* We need to set a connect timeout otherwise on Windows the SCM will probably timeout first */
- snprintf(connstr, sizeof(connstr), "dbname=postgres port=%s connect_timeout=5", portstr);
+ }
+@@ -510,7 +544,8 @@
+ * probably timeout first
+ */
+ snprintf(connstr, sizeof(connstr),
+- "dbname=postgres port=%s connect_timeout=5", portstr);
++ "dbname=postgres port=%s connect_timeout=5%s%s", portstr,
++ (*sockstr ? " host=" : ""), sockstr);
-+ /* path to directory containing the unix socket */
-+ if (*sockstr) {
-+ strncat(connstr, " host=", sizeof(connstr) - strlen(connstr));
-+ strncat(connstr, sockstr, sizeof(connstr) - strlen(connstr));
-+ }
-+
for (i = 0; i < wait_seconds; i++)
{
- if ((conn = PQconnectdb(connstr)) != NULL &&