Home | History | Annotate | Download | only in libiberty
      1 /* Copyright (C) 1991, 1994, 1995, 1996, 2002 Free Software Foundation, Inc.
      2    This file based on putenv.c in the GNU C Library.
      3 
      4    The GNU C Library is free software; you can redistribute it and/or
      5    modify it under the terms of the GNU Library General Public License as
      6    published by the Free Software Foundation; either version 2 of the
      7    License, or (at your option) any later version.
      8 
      9    The GNU C Library is distributed in the hope that it will be useful,
     10    but WITHOUT ANY WARRANTY; without even the implied warranty of
     11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12    Library General Public License for more details.
     13 
     14    You should have received a copy of the GNU Library General Public
     15    License along with the GNU C Library; see the file COPYING.LIB.  If not,
     16    write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
     17    Boston, MA 02110-1301, USA.  */
     18 
     19 /*
     20 
     21 @deftypefn Supplemental int putenv (const char *@var{string})
     22 
     23 Uses @code{setenv} or @code{unsetenv} to put @var{string} into
     24 the environment or remove it.  If @var{string} is of the form
     25 @samp{name=value} the string is added; if no @samp{=} is present the
     26 name is unset/removed.
     27 
     28 @end deftypefn
     29 
     30 */
     31 
     32 #if defined (_AIX) && !defined (__GNUC__)
     33  #pragma alloca
     34 #endif
     35 
     36 #if HAVE_CONFIG_H
     37 # include <config.h>
     38 #endif
     39 
     40 #include "ansidecl.h"
     41 
     42 #define putenv libiberty_putenv
     43 
     44 #if HAVE_STDLIB_H
     45 # include <stdlib.h>
     46 #endif
     47 #if HAVE_STRING_H
     48 # include <string.h>
     49 #endif
     50 
     51 #ifdef HAVE_ALLOCA_H
     52 # include <alloca.h>
     53 #else
     54 # ifndef alloca
     55 #  ifdef __GNUC__
     56 #   define alloca __builtin_alloca
     57 #  else
     58 extern char *alloca ();
     59 #  endif /* __GNUC__ */
     60 # endif /* alloca */
     61 #endif /* HAVE_ALLOCA_H */
     62 
     63 #undef putenv
     64 
     65 /* Below this point, it's verbatim code from the glibc-2.0 implementation */
     66 
     67 
     68 /* Put STRING, which is of the form "NAME=VALUE", in the environment.  */
     69 int
     70 putenv (const char *string)
     71 {
     72   const char *const name_end = strchr (string, '=');
     73 
     74   if (name_end)
     75     {
     76       char *name = (char *) alloca (name_end - string + 1);
     77       memcpy (name, string, name_end - string);
     78       name[name_end - string] = '\0';
     79       return setenv (name, name_end + 1, 1);
     80     }
     81 
     82   unsetenv (string);
     83   return 0;
     84 }
     85