Example #1
0
/*
 * POSIX unsetenv()
 */
int unsetenv(const char *name) {
	if (name == NULL || *name == '\0' || strchr(name, '=') != NULL) {
		errno = EINVAL;
		return -1;
	}
	_unsetenv(name);
	return 0;
}
Example #2
0
/* Put STRING, which is of the form "NAME=VALUE", in the environment.
   If STRING contains no `=', then remove STRING from the environment.  */
int
putenv (char *string)
{
  const char *const name_end = strchr (string, '=');
  register size_t size;
  register char **ep;

  if (name_end == NULL)
    {
      /* Remove the variable from the environment.  */
      return _unsetenv (string);
    }

  size = 0;
  for (ep = environ; *ep != NULL; ++ep)
    if (!strncmp (*ep, string, name_end - string) &&
	(*ep)[name_end - string] == '=')
      break;
    else
      ++size;

  if (*ep == NULL)
    {
      static char **last_environ = NULL;
      char **new_environ = (char **) malloc ((size + 2) * sizeof (char *));
      if (new_environ == NULL)
	return -1;
      (void) memcpy ((void *) new_environ, (void *) environ,
		     size * sizeof (char *));
      new_environ[size] = (char *) string;
      new_environ[size + 1] = NULL;
      if (last_environ != NULL)
	free (last_environ);
      last_environ = new_environ;
      environ = new_environ;
    }
  else
    *ep = string;

  return 0;
}
Example #3
0
int unsetenv(const char *name) {
	return _unsetenv(name);
//	return _unsetenv(Utf8ToUtf16(name).c_str());
}
Example #4
0
/* Put STRING, which is of the form "NAME=VALUE", in the environment.
   If STRING contains no '=', then remove STRING from the environment.  */
int
putenv (char *string)
{
  const char *name_end = strchr (string, '=');
  char **ep;

  if (name_end == NULL)
    {
      /* Remove the variable from the environment.  */
      return _unsetenv (string);
    }

#if HAVE_DECL__PUTENV
  /* Rely on _putenv to allocate the new environment.  If other
     parts of the application use _putenv, the !HAVE_DECL__PUTENV code
     would fight over who owns the environ vector, causing a crash.  */
  if (name_end[1])
    return _putenv (string);
  else
    {
      /* _putenv ("NAME=") unsets NAME, so invoke _putenv ("NAME= ")
         to allocate the environ vector and then replace the new
         entry with "NAME=".  */
      int putenv_result, putenv_errno;
      char *name_x = malloc (name_end - string + sizeof "= ");
      if (!name_x)
        return -1;
      memcpy (name_x, string, name_end - string + 1);
      name_x[name_end - string + 1] = ' ';
      name_x[name_end - string + 2] = 0;
      putenv_result = _putenv (name_x);
      putenv_errno = errno;
      for (ep = environ; *ep; ep++)
        if (strcmp (*ep, name_x) == 0)
          {
            *ep = string;
            break;
          }
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
      if (putenv_result == 0)
        {
          /* _putenv propagated "NAME= " into the subprocess environment;
             fix that by calling SetEnvironmentVariable directly.  */
          name_x[name_end - string] = 0;
          putenv_result = SetEnvironmentVariable (name_x, "") ? 0 : -1;
          putenv_errno = ENOMEM; /* ENOMEM is the only way to fail.  */
        }
# endif
      free (name_x);
      __set_errno (putenv_errno);
      return putenv_result;
    }
#else
  for (ep = environ; *ep; ep++)
    if (strncmp (*ep, string, name_end - string) == 0
        && (*ep)[name_end - string] == '=')
      break;

  if (*ep)
    *ep = string;
  else
    {
      static char **last_environ = NULL;
      size_t size = ep - environ;
      char **new_environ = malloc ((size + 2) * sizeof *new_environ);
      if (! new_environ)
        return -1;
      new_environ[0] = string;
      memcpy (new_environ + 1, environ, (size + 1) * sizeof *new_environ);
      free (last_environ);
      last_environ = new_environ;
      environ = new_environ;
    }

  return 0;
#endif
}