v1-0001-Add-GUC-parameter-environment.patch
text/plain
Filename: v1-0001-Add-GUC-parameter-environment.patch
Type: text/plain
Part: 0
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