putenv.c revision 75584
1/* Copyright (C) 1991 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#include <string.h> 22 23#ifdef __STDC__ 24#include <stddef.h> 25typedef void *PTR; 26typedef size_t SIZE_T; 27#else /* not __STDC__ */ 28typedef char *PTR; 29typedef int SIZE_T; 30#endif /* not __STDC__ */ 31 32#ifdef HAVE_STDLIB_H 33#include <stdlib.h> 34#else /* not HAVE_STDLIB_H */ 35PTR malloc(); 36#endif /* not HAVE_STDLIB_H */ 37 38#ifndef NULL 39#define NULL 0 40#endif 41 42extern char **environ; 43 44/* Put STRING, which is of the form "NAME=VALUE", in the environment. */ 45 46int putenv(const char *string) 47{ 48 char *name_end = strchr(string, '='); 49 SIZE_T size; 50 char **ep; 51 52 if (name_end == NULL) 53 { 54 /* Remove the variable from the environment. */ 55 size = strlen(string); 56 for (ep = environ; *ep != NULL; ++ep) 57 if (!strncmp(*ep, string, size) && (*ep)[size] == '=') 58 { 59 while (ep[1] != NULL) 60 { 61 ep[0] = ep[1]; 62 ++ep; 63 } 64 *ep = NULL; 65 return 0; 66 } 67 } 68 69 size = 0; 70 for (ep = environ; *ep != NULL; ++ep) 71 if (!strncmp(*ep, string, name_end - string) 72 && (*ep)[name_end - string] == '=') 73 break; 74 else 75 ++size; 76 77 if (*ep == NULL) 78 { 79 static char **last_environ = NULL; 80 char **new_environ = (char **) malloc((size + 2) * sizeof(char *)); 81 if (new_environ == NULL) 82 return -1; 83 (void) memcpy((PTR) new_environ, (PTR) environ, size * sizeof(char *)); 84 new_environ[size] = (char *) string; 85 new_environ[size + 1] = NULL; 86 if (last_environ != NULL) 87 free((PTR) last_environ); 88 last_environ = new_environ; 89 environ = new_environ; 90 } 91 else 92 *ep = (char *) string; 93 94 return 0; 95} 96