Example #1
0
/* 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;
}
Example #2
0
File: misc.c Project: Juul/gnupg
/* 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*/
}