/* Return the value of the environment variable NAME from the SE object. The returned value is valid as long as SE is valid and as long it has not been removed or updated by a call to session_env_putenv. If the variable does not exist, the function tries to return the value trough a call to getenv; if that returns a value, this value is recorded and and used. If no value could be found, returns NULL. The caller must not change the returned value. */ char * session_env_getenv_or_default (session_env_t se, const char *name, int *r_default) { int idx; char *defvalue; if (r_default) *r_default = 0; if (!se || !name || !*name) return NULL; for (idx=0; idx < se->arrayused; idx++) if (se->array[idx] && !strcmp (se->array[idx]->name, name)) { if (r_default && se->array[idx]->is_default) *r_default = 1; return se->array[idx]->value; } /* Get the default value with an additional fallback for GPG_TTY. */ defvalue = getenv (name); if ((!defvalue || !*defvalue) && !strcmp (name, "GPG_TTY") && gnupg_ttyname (0)) { defvalue = gnupg_ttyname (0); } if (defvalue) { /* Record the default value for later use so that we are safe from later modifications of the environment. We need to take a copy to better cope with the rules of putenv(3). We ignore the error of the update function because we can't return an explicit error anyway and the following scan would then fail anyway. */ update_var (se, name, strlen (name), defvalue, 1); for (idx=0; idx < se->arrayused; idx++) if (se->array[idx] && !strcmp (se->array[idx]->name, name)) { if (r_default && se->array[idx]->is_default) *r_default = 1; return se->array[idx]->value; } } return NULL; }
/* Setup the environment so that the pinentry is able to get all required information. This is used prior to an exec of the protect-tool. */ void setup_pinentry_env (void) { #ifndef HAVE_W32_SYSTEM char *lc; const char *name, *value; int iterator; /* Try to make sure that GPG_TTY has been set. This is needed if we call for example the protect-tools with redirected stdin and thus it won't be able to ge a default by itself. Try to do it here but print a warning. */ value = session_env_getenv (opt.session_env, "GPG_TTY"); if (value) gnupg_setenv ("GPG_TTY", value, 1); else if (!(lc=getenv ("GPG_TTY")) || !*lc) { log_error (_("GPG_TTY has not been set - " "using maybe bogus default\n")); lc = gnupg_ttyname (0); if (!lc) lc = "/dev/tty"; gnupg_setenv ("GPG_TTY", lc, 1); } if (opt.lc_ctype) gnupg_setenv ("LC_CTYPE", opt.lc_ctype, 1); #if defined(HAVE_SETLOCALE) && defined(LC_CTYPE) else if ( (lc = setlocale (LC_CTYPE, "")) ) gnupg_setenv ("LC_CTYPE", lc, 1); #endif if (opt.lc_messages) gnupg_setenv ("LC_MESSAGES", opt.lc_messages, 1); #if defined(HAVE_SETLOCALE) && defined(LC_MESSAGES) else if ( (lc = setlocale (LC_MESSAGES, "")) ) gnupg_setenv ("LC_MESSAGES", lc, 1); #endif iterator = 0; while ((name = session_env_list_stdenvnames (&iterator, NULL))) { if (!strcmp (name, "GPG_TTY")) continue; /* Already set. */ value = session_env_getenv (opt.session_env, name); if (value) gnupg_setenv (name, value, 1); } #endif /*!HAVE_W32_SYSTEM*/ }