X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fsetenv.c;h=83b52b88b980a297ca1944746be527eeeee79ad8;hb=6e4b15b5ee28b52b4a03c74fe8a9ac9bc8a976ea;hp=04073caa0391ef40020604c3c3ec2a19212c28a6;hpb=757bd39e4b07efaefaef3ef11027b7b7b40f5911;p=gnulib.git diff --git a/lib/setenv.c b/lib/setenv.c index 04073caa0..83b52b88b 100644 --- a/lib/setenv.c +++ b/lib/setenv.c @@ -1,57 +1,45 @@ -/* Copyright (C) 1992,1995-1999,2000-2003 Free Software Foundation, Inc. +/* Copyright (C) 1992,1995-1999,2000-2003,2005-2008 Free Software Foundation, Inc. This file is part of the GNU C Library. - This program is free software; you can redistribute it and/or modify + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ -#if HAVE_CONFIG_H +#if !_LIBC # include #endif #include +/* Specification. */ +#include + #include -#if !_LIBC -# if !defined errno && !defined HAVE_ERRNO_DECL -extern int errno; -# endif +#ifndef __set_errno # define __set_errno(ev) ((errno) = (ev)) #endif -#if _LIBC || HAVE_STDLIB_H -# include -#endif -#if _LIBC || HAVE_STRING_H -# include -#endif +#include #if _LIBC || HAVE_UNISTD_H # include #endif -/* For those losing systems which don't have 'alloca' we have to add - some additional code emulating it. */ -#if _LIBC || HAVE_ALLOCA -# define freea(p) /* nothing */ -#else -# define alloca(n) malloc (n) -# define freea(p) free (p) +#if _LIBC || !HAVE_SETENV + +#if !_LIBC +# include "malloca.h" #endif #if !_LIBC # define __environ environ -# ifndef HAVE_ENVIRON_DECL -extern char **environ; -# endif #endif #if _LIBC @@ -167,11 +155,18 @@ __add_to_environ (const char *name, const char *value, const char *combined, { /* See whether the value is already known. */ #ifdef USE_TSEARCH - new_value = (char *) alloca (namelen + 1 + vallen); # ifdef _LIBC + new_value = (char *) alloca (namelen + 1 + vallen); __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1), value, vallen); # else + new_value = (char *) malloca (namelen + 1 + vallen); + if (new_value == NULL) + { + __set_errno (ENOMEM); + UNLOCK; + return -1; + } memcpy (new_value, name, namelen); new_value[namelen] = '='; memcpy (&new_value[namelen + 1], value, vallen); @@ -184,7 +179,7 @@ __add_to_environ (const char *name, const char *value, const char *combined, new_environ[size] = (char *) malloc (namelen + 1 + vallen); if (new_environ[size] == NULL) { -#ifdef USE_TSEARCH +#if defined USE_TSEARCH && !defined _LIBC freea (new_value); #endif __set_errno (ENOMEM); @@ -204,7 +199,7 @@ __add_to_environ (const char *name, const char *value, const char *combined, user string or not. */ STORE_VALUE (new_environ[size]); } -#ifdef USE_TSEARCH +#if defined USE_TSEARCH && !defined _LIBC freea (new_value); #endif } @@ -227,11 +222,19 @@ __add_to_environ (const char *name, const char *value, const char *combined, else { #ifdef USE_TSEARCH - char *new_value = alloca (namelen + 1 + vallen); + char *new_value; # ifdef _LIBC + new_value = alloca (namelen + 1 + vallen); __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1), value, vallen); # else + new_value = malloca (namelen + 1 + vallen); + if (new_value == NULL) + { + __set_errno (ENOMEM); + UNLOCK; + return -1; + } memcpy (new_value, name, namelen); new_value[namelen] = '='; memcpy (&new_value[namelen + 1], value, vallen); @@ -244,9 +247,10 @@ __add_to_environ (const char *name, const char *value, const char *combined, np = malloc (namelen + 1 + vallen); if (np == NULL) { -#ifdef USE_TSEARCH +#if defined USE_TSEARCH && !defined _LIBC freea (new_value); #endif + __set_errno (ENOMEM); UNLOCK; return -1; } @@ -261,7 +265,7 @@ __add_to_environ (const char *name, const char *value, const char *combined, /* And remember the value. */ STORE_VALUE (np); } -#ifdef USE_TSEARCH +#if defined USE_TSEARCH && !defined _LIBC freea (new_value); #endif } @@ -284,7 +288,7 @@ setenv (const char *name, const char *value, int replace) never made it. Nevertheless the POSIX.9 standard (POSIX bindings for Fortran 77) requires this function. */ int -clearenv () +clearenv (void) { LOCK; @@ -322,3 +326,5 @@ text_set_element (__libc_subfreeres, free_mem); weak_alias (__setenv, setenv) weak_alias (__clearenv, clearenv) #endif + +#endif /* _LIBC || !HAVE_SETENV */