v1-0001-Add-GUC-parameter-environment.patch

text/plain

Filename: v1-0001-Add-GUC-parameter-environment.patch
Type: text/plain
Part: 0
Message: Re: libpq environment variables in the server

Patch

Format: format-patch
Series: patch v1-0001
Subject: Add GUC parameter "environment"
File+
doc/src/sgml/config.sgml 21 0
src/backend/utils/misc/guc.c 40 0
src/backend/utils/misc/postgresql.conf.sample 1 0
src/include/utils/guc.h 2 0
From dd76033c87ddfe60c50e6bb397c123f489cadc1c Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Mon, 18 Feb 2019 14:36:53 +0100
Subject: [PATCH v1 1/2] Add GUC parameter "environment"

This allows setting environment variables inside the server processes,
for use by third-party libraries, like LDAPCONF.  Previously, this had
to be done via external mechanisms such as init scripts.
---
 doc/src/sgml/config.sgml                      | 21 ++++++++++
 src/backend/utils/misc/guc.c                  | 40 +++++++++++++++++++
 src/backend/utils/misc/postgresql.conf.sample |  1 +
 src/include/utils/guc.h                       |  2 +
 4 files changed, 64 insertions(+)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 8bd57f376b..acbcf5559b 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -8304,6 +8304,27 @@ <title>Other Defaults</title>
       </listitem>
      </varlistentry>
 
+     <varlistentry id="guc-environment" xreflabel="environment">
+      <term><varname>environment</varname> (<type>string</type>)
+      <indexterm>
+       <primary><varname>environment</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        A comma-separated list of environment variable assignments to apply
+        inside the <productname>PostgreSQL</productname> server process.  This
+        can be used to supply configuration information or debugging settings
+        to third-party libraries or plugins.  Example:
+<programlisting>environment = 'LDAPCONF=/some/file,RSYNC_RSH=ssh'</programlisting>
+        This parameter can only be set in the
+        <filename>postgresql.conf</filename> file or on the server command
+        line.  Note that changing this parameter at run time will not unset
+        previously set environment variables.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry id="guc-gin-fuzzy-search-limit" xreflabel="gin_fuzzy_search_limit">
       <term><varname>gin_fuzzy_search_limit</varname> (<type>integer</type>)
       <indexterm>
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 156d147c85..10c9528729 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -212,6 +212,7 @@ static bool check_recovery_target_lsn(char **newval, void **extra, GucSource sou
 static void assign_recovery_target_lsn(const char *newval, void *extra);
 static bool check_primary_slot_name(char **newval, void **extra, GucSource source);
 static bool check_default_with_oids(bool *newval, void **extra, GucSource source);
+static void assign_environment_settings(const char *newval, void *extra);
 
 /* Private functions in guc-file.l that need to be called from guc.c */
 static ConfigVariable *ProcessConfigFileInternal(GucContext context,
@@ -529,6 +530,8 @@ int			tcp_keepalives_idle;
 int			tcp_keepalives_interval;
 int			tcp_keepalives_count;
 
+char	   *environment_settings;
+
 /*
  * SSL renegotiation was been removed in PostgreSQL 9.5, but we tolerate it
  * being set to zero (meaning never renegotiate) for backward compatibility.
@@ -3516,6 +3519,17 @@ static struct config_string ConfigureNamesString[] =
 		check_client_encoding, assign_client_encoding, NULL
 	},
 
+	{
+		{"environment", PGC_SIGHUP, CLIENT_CONN_OTHER,
+			gettext_noop("Environment variables to be set."),
+			NULL,
+			GUC_LIST_INPUT | GUC_LIST_QUOTE
+		},
+		&environment_settings,
+		"",
+		NULL, assign_environment_settings, NULL
+	},
+
 	{
 		{"log_line_prefix", PGC_SIGHUP, LOGGING_WHAT,
 			gettext_noop("Controls information prefixed to each log line."),
@@ -11384,4 +11398,30 @@ check_default_with_oids(bool *newval, void **extra, GucSource source)
 	return true;
 }
 
+static void
+assign_environment_settings(const char *newval, void *extra)
+{
+	char *rawstring = pstrdup(newval);
+	List *elemlist;
+	ListCell *lc;
+
+	if (!SplitGUCList(rawstring, ',', &elemlist))
+	{
+		/* syntax error in list */
+		list_free_deep(elemlist);
+		pfree(rawstring);
+		ereport(ERROR,
+				(errcode(ERRCODE_SYNTAX_ERROR),
+				 errmsg("invalid list syntax in parameter \"%s\"",
+						"parameter")));
+	}
+
+	foreach(lc, elemlist)
+	{
+		char	   *setting = lfirst(lc);
+
+		putenv(guc_strdup(ERROR, setting));
+	}
+}
+
 #include "guc-file.c"
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 194f312096..551a02d2aa 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -676,6 +676,7 @@
 # - Other Defaults -
 
 #dynamic_library_path = '$libdir'
+#environment = ''
 
 
 #------------------------------------------------------------------------------
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index c07e7b945e..fdcbb90bb2 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -273,6 +273,8 @@ extern int	tcp_keepalives_count;
 extern bool trace_sort;
 #endif
 
+extern char *environment_settings;
+
 /*
  * Functions exported by guc.c
  */

base-commit: 050710b36964dee7e1b2bf6b5ef00041fd5d2787
-- 
2.20.1