--- 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 portstr[32], sockstr[MAXPGPATH]; char *p; char *q; - char connstr[128]; /* Should be way more than enough! */ + char connstr[128+MAXPGPATH]; /* Should be way more than enough! */ - *portstr = '\0'; + *portstr = *sockstr = '\0'; /* * 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; @@ -473,8 +488,7 @@ while (isspace((unsigned char) *p)) p++; - if (strncmp(p, "port", 4) != 0) - continue; + if (!strncmp(p, "port", 4)) { p += 4; while (isspace((unsigned char) *p)) p++; @@ -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++; + /* 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 */ + } } } } @@ -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); for (i = 0; i < wait_seconds; i++) {