aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2000-07-03 20:46:10 +0000
committerPeter Eisentraut <peter_e@gmx.net>2000-07-03 20:46:10 +0000
commite2d3932e0eaaac60928dacfc7902ac788b25b100 (patch)
tree025e7e5df1981f297d15d8fa1779b94c03f99138
parent51afb9305c3a45891bd49637827a99631be8b488 (diff)
downloadpostgresql-e2d3932e0eaaac60928dacfc7902ac788b25b100.tar.gz
postgresql-e2d3932e0eaaac60928dacfc7902ac788b25b100.zip
Move PGPORT envar handling to ResetAllOptions(). Improve long options
parsing to not clobber the optarg string -- so that we can bring SetOptsFile() up to speed.
-rw-r--r--src/backend/libpq/pqcomm.c3
-rw-r--r--src/backend/postmaster/postmaster.c23
-rw-r--r--src/backend/tcop/postgres.c22
-rw-r--r--src/backend/utils/misc/guc.c51
-rw-r--r--src/include/utils/guc.h4
5 files changed, 72 insertions, 31 deletions
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index 4bbf6849440..f0cd93b3872 100644
--- a/src/backend/libpq/pqcomm.c
+++ b/src/backend/libpq/pqcomm.c
@@ -29,7 +29,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: pqcomm.c,v 1.98 2000/06/14 18:17:28 petere Exp $
+ * $Id: pqcomm.c,v 1.99 2000/07/03 20:45:57 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -41,7 +41,6 @@
* StreamServerPort - Open postmaster's server port
* StreamConnection - Create new connection with client
* StreamClose - Close a client/backend connection
- * pq_getport - return the PGPORT setting
* pq_init - initialize libpq at backend startup
* pq_close - shutdown libpq at backend exit
*
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index f7d2e0d8a6d..9b30fa447d9 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.151 2000/07/02 15:20:48 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.152 2000/07/03 20:45:58 petere Exp $
*
* NOTES
*
@@ -383,9 +383,6 @@ PostmasterMain(int argc, char *argv[])
if (getenv("PGDATA"))
DataDir = strdup(getenv("PGDATA")); /* default value */
- if (getenv("PGPORT"))
- PostPortName = atoi(getenv("PGPORT"));
-
ResetAllOptions();
/*
@@ -504,7 +501,6 @@ PostmasterMain(int argc, char *argv[])
strcpy(original_extraoptions, optarg);
break;
case 'p':
- /* Set PGPORT by hand. */
PostPortName = atoi(optarg);
break;
case 'S':
@@ -529,17 +525,16 @@ PostmasterMain(int argc, char *argv[])
break;
case '-':
{
- /* A little 'long argument' simulation */
- size_t equal_pos = strcspn(optarg, "=");
- char *cp;
+ char *name, *value;
- if (optarg[equal_pos] != '=')
+ ParseLongOption(optarg, &name, &value);
+ if (!value)
elog(ERROR, "--%s requires argument", optarg);
- optarg[equal_pos] = '\0';
- for(cp = optarg; *cp; cp++)
- if (*cp == '-')
- *cp = '_';
- SetConfigOption(optarg, optarg + equal_pos + 1, PGC_POSTMASTER);
+
+ SetConfigOption(name, value, PGC_POSTMASTER);
+ free(name);
+ if (value)
+ free(value);
break;
}
default:
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 724cfc29339..ddd7f07bc28 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.163 2000/06/29 07:35:57 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.164 2000/07/03 20:46:00 petere Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@@ -1167,18 +1167,16 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
case '-':
{
- /* A little 'long argument' simulation */
- /* (copy&pasted from PostmasterMain() */
- size_t equal_pos = strcspn(optarg, "=");
- char *cp;
+ char *name, *value;
- if (optarg[equal_pos] != '=')
+ ParseLongOption(optarg, &name, &value);
+ if (!value)
elog(ERROR, "--%s requires argument", optarg);
- optarg[equal_pos] = '\0';
- for(cp = optarg; *cp; cp++)
- if (*cp == '-')
- *cp = '_';
- SetConfigOption(optarg, optarg + equal_pos + 1, PGC_BACKEND);
+
+ SetConfigOption(name, value, PGC_BACKEND);
+ free(name);
+ if (value)
+ free(value);
break;
}
@@ -1408,7 +1406,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
if (!IsUnderPostmaster)
{
puts("\nPOSTGRES backend interactive interface ");
- puts("$Revision: 1.163 $ $Date: 2000/06/29 07:35:57 $\n");
+ puts("$Revision: 1.164 $ $Date: 2000/07/03 20:46:00 $\n");
}
/*
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index f2cbe3651d3..44078e4a921 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -4,7 +4,7 @@
* Support for grand unified configuration scheme, including SET
* command, configuration file, and command line options.
*
- * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.4 2000/06/22 22:31:21 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.5 2000/07/03 20:46:05 petere Exp $
*
* Copyright 2000 by PostgreSQL Global Development Group
* Written by Peter Eisentraut <peter_e@gmx.net>.
@@ -354,6 +354,9 @@ ResetAllOptions(void)
}
ConfigureNamesString[i].variable = str;
}
+
+ if (getenv("PGPORT"))
+ PostPortName = atoi(getenv("PGPORT"));
}
@@ -718,3 +721,49 @@ GetConfigOption(const char * name)
}
return NULL;
}
+
+
+
+/*
+ * A little "long argument" simulation, although not quite GNU
+ * compliant. Takes a string of the form "some-option=some value" and
+ * returns name = "some_option" and value = "some value" in malloc'ed
+ * storage. Note that '-' is converted to '_' in the option name. If
+ * there is no '=' in the input string then value will be NULL.
+ */
+void
+ParseLongOption(const char * string, char ** name, char ** value)
+{
+ size_t equal_pos;
+ char *cp;
+
+ AssertArg(string);
+ AssertArg(name);
+ AssertArg(value);
+
+ equal_pos = strcspn(string, "=");
+
+ if (string[equal_pos] == '=')
+ {
+ *name = malloc(equal_pos + 1);
+ if (!*name)
+ elog(FATAL, "out of memory");
+ strncpy(*name, string, equal_pos);
+ (*name)[equal_pos] = '\0';
+
+ *value = strdup(&string[equal_pos + 1]);
+ if (!*value)
+ elog(FATAL, "out of memory");
+ }
+ else /* no equal sign in string */
+ {
+ *name = strdup(string);
+ if (!*name)
+ elog(FATAL, "out of memory");
+ *value = NULL;
+ }
+
+ for(cp = *name; *cp; cp++)
+ if (*cp == '-')
+ *cp = '_';
+}
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index c4ff10a1401..67f830d6c41 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -4,7 +4,7 @@
* External declarations pertaining to backend/utils/misc/guc.c and
* backend/utils/misc/guc-file.l
*
- * $Header: /cvsroot/pgsql/src/include/utils/guc.h,v 1.2 2000/06/22 22:31:24 petere Exp $
+ * $Header: /cvsroot/pgsql/src/include/utils/guc.h,v 1.3 2000/07/03 20:46:10 petere Exp $
*/
#ifndef GUC_H
#define GUC_H
@@ -51,7 +51,7 @@ void SetConfigOption(const char * name, const char * value, GucContext c
const char * GetConfigOption(const char * name);
void ProcessConfigFile(GucContext context);
void ResetAllOptions(void);
-
+void ParseLongOption(const char * string, char ** name, char ** value);
bool set_config_option(const char * name, const char * value, GucContext context, bool DoIt);