From dd76033c87ddfe60c50e6bb397c123f489cadc1c Mon Sep 17 00:00:00 2001 From: Peter Eisentraut 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 @@ Other Defaults + + environment (string) + + environment configuration parameter + + + + + A comma-separated list of environment variable assignments to apply + inside the PostgreSQL server process. This + can be used to supply configuration information or debugging settings + to third-party libraries or plugins. Example: +environment = 'LDAPCONF=/some/file,RSYNC_RSH=ssh' + This parameter can only be set in the + postgresql.conf file or on the server command + line. Note that changing this parameter at run time will not unset + previously set environment variables. + + + + gin_fuzzy_search_limit (integer) 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