diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index 4bbf6849440d7810fcf9d87ac40ff017de034124..f0cd93b3872019fb837ac90a0024fff72b6fe67f 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 f7d2e0d8a6dd6e2343ff48f401bc766757a7b31e..9b30fa447d9de34b5de31e3bfa18a7b98529428d 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 724cfc29339a72b7b3d1f796103b96e993c792a2..ddd7f07bc28c37debd469bc88b624adbc108f263 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 f2cbe3651d39f08def7e7b25d5816e155f873154..44078e4a9213d1c78aa84c2a9db008073f3275e9 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 c4ff10a14013ac1058d80210ce1180fee4769761..67f830d6c41718df61728dec0c7463daccbfd445 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);