1/* Copyright (C) 1991, 2001 Free Software Foundation, Inc.
2This file is part of the GNU C Library.
3
4The GNU C Library is free software; you can redistribute it and/or
5modify it under the terms of the GNU Library General Public License as
6published by the Free Software Foundation; either version 2 of the
7License, or (at your option) any later version.
8
9The GNU C Library is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12Library General Public License for more details.
13
14You should have received a copy of the GNU Library General Public
15License along with the GNU C Library; see the file COPYING.LIB.  If
16not, write to the Free Software Foundation, Inc., 675 Mass Ave,
17Cambridge, MA 02139, USA.  */
18
19/* Hacked slightly by jjc@jclark.com for groff. */
20
21#ifdef HAVE_CONFIG_H
22#include <config.h>
23#endif
24
25#include <string.h>
26
27#ifdef __STDC__
28#include <stddef.h>
29typedef void *PTR;
30typedef size_t SIZE_T;
31#else /* not __STDC__ */
32typedef char *PTR;
33typedef int SIZE_T;
34#endif /* not __STDC__ */
35
36#ifdef HAVE_STDLIB_H
37#include <stdlib.h>
38#else /* not HAVE_STDLIB_H */
39PTR malloc();
40#endif /* not HAVE_STDLIB_H */
41
42#ifndef NULL
43#define NULL 0
44#endif
45
46extern char **environ;
47
48/* Put STRING, which is of the form "NAME=VALUE", in the environment.  */
49
50int putenv(const char *string)
51{
52  char *name_end = strchr(string, '=');
53  SIZE_T size;
54  char **ep;
55
56  if (name_end == NULL)
57    {
58      /* Remove the variable from the environment.  */
59      size = strlen(string);
60      for (ep = environ; *ep != NULL; ++ep)
61	if (!strncmp(*ep, string, size) && (*ep)[size] == '=')
62	  {
63	    while (ep[1] != NULL)
64	      {
65		ep[0] = ep[1];
66		++ep;
67	      }
68	    *ep = NULL;
69	    return 0;
70	  }
71    }
72
73  size = 0;
74  for (ep = environ; *ep != NULL; ++ep)
75    if (!strncmp(*ep, string, name_end - string)
76	&& (*ep)[name_end - string] == '=')
77      break;
78    else
79      ++size;
80
81  if (*ep == NULL)
82    {
83      static char **last_environ = NULL;
84      char **new_environ = (char **) malloc((size + 2) * sizeof(char *));
85      if (new_environ == NULL)
86	return -1;
87      (void) memcpy((PTR) new_environ, (PTR) environ, size * sizeof(char *));
88      new_environ[size] = (char *) string;
89      new_environ[size + 1] = NULL;
90      if (last_environ != NULL)
91	free((PTR) last_environ);
92      last_environ = new_environ;
93      environ = new_environ;
94    }
95  else
96    *ep = (char *) string;
97
98  return 0;
99}
100