aboutsummaryrefslogtreecommitdiff
path: root/src/bin/pg_ctl/pg_ctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/pg_ctl/pg_ctl.c')
-rw-r--r--src/bin/pg_ctl/pg_ctl.c62
1 files changed, 43 insertions, 19 deletions
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index fc5061e044a..ded748d2c11 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -4,7 +4,7 @@
*
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.61.2.3 2006/06/25 04:38:00 alvherre Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.61.2.4 2008/02/20 22:18:35 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -36,8 +36,6 @@ int optreset;
typedef long pgpid_t;
-#define WHITESPACE "\f\n\r\t\v" /* as defined by isspace() */
-
/* postmaster version ident string */
#define PM_VERSIONSTR "postmaster (PostgreSQL) " PG_VERSION "\n"
@@ -374,32 +372,51 @@ test_postmaster_connection(void)
int i;
char portstr[32];
char *p;
+ char *q;
*portstr = '\0';
- /* post_opts */
+ /*
+ * Look in post_opts for a -p switch.
+ *
+ * This parsing code is not amazingly bright; it could for instance
+ * get fooled if ' -p' occurs within a quoted argument value. Given
+ * that few people pass complicated settings in post_opts, it's
+ * probably good enough.
+ */
for (p = post_opts; *p;)
{
- /* advance past whitespace/quoting */
- while (isspace((unsigned char) *p) || *p == '\'' || *p == '"')
+ /* advance past whitespace */
+ while (isspace((unsigned char) *p))
p++;
- if (strncmp(p, "-p", strlen("-p")) == 0)
+ if (strncmp(p, "-p", 2) == 0)
{
- p += strlen("-p");
- /* advance past whitespace/quoting */
+ p += 2;
+ /* advance past any whitespace/quoting */
while (isspace((unsigned char) *p) || *p == '\'' || *p == '"')
p++;
- StrNCpy(portstr, p, Min(strcspn(p, "\"'" WHITESPACE) + 1,
- sizeof(portstr)));
+ /* 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 */
+ StrNCpy(portstr, p, Min((q - p) + 1, sizeof(portstr)));
/* keep looking, maybe there is another -p */
+ p = q;
}
/* Advance to next whitespace */
while (*p && !isspace((unsigned char) *p))
p++;
}
- /* config file */
+ /*
+ * Search config file for a 'port' option.
+ *
+ * This parsing code isn't amazingly bright either, but it should be
+ * okay for valid port settings.
+ */
if (!*portstr)
{
char **optlines;
@@ -413,28 +430,35 @@ test_postmaster_connection(void)
while (isspace((unsigned char) *p))
p++;
- if (strncmp(p, "port", strlen("port")) != 0)
+ if (strncmp(p, "port", 4) != 0)
continue;
- p += strlen("port");
+ p += 4;
while (isspace((unsigned char) *p))
p++;
if (*p != '=')
continue;
p++;
- while (isspace((unsigned char) *p))
+ /* advance past any whitespace/quoting */
+ while (isspace((unsigned char) *p) || *p == '\'' || *p == '"')
p++;
- StrNCpy(portstr, p, Min(strcspn(p, "#" WHITESPACE) + 1,
- sizeof(portstr)));
+ /* 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 */
+ StrNCpy(portstr, p, Min((q - p) + 1, sizeof(portstr)));
/* keep looking, maybe there is another */
}
}
}
- /* environment */
+ /* Check environment */
if (!*portstr && getenv("PGPORT") != NULL)
StrNCpy(portstr, getenv("PGPORT"), sizeof(portstr));
- /* default */
+ /* Else use compiled-in default */
if (!*portstr)
snprintf(portstr, sizeof(portstr), "%d", DEF_PGPORT);