X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fsetenv.c;h=23832485a9f27a0adb3d1e207ad2da873d523c56;hb=a7cc0db9f5f6c63936c6914d4bb6448789774e5f;hp=fdbf35434253b6f2766225e959597608ef042f3a;hpb=48dbf2c191cd60b64354849d8e0a8fe4a7d613f2;p=gnulib.git diff --git a/lib/setenv.c b/lib/setenv.c index fdbf35434..23832485a 100644 --- a/lib/setenv.c +++ b/lib/setenv.c @@ -1,52 +1,38 @@ -/* Copyright (C) 1992,1995-1999,2000-2003 Free Software Foundation, Inc. +/* Copyright (C) 1992,1995-1999,2000-2003,2005,2006 Free Software Foundation, Inc. This file is part of the GNU C Library. - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. + 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 GNU C Library is distributed in the hope that it will be useful, + 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 - Library General Public License for more details. + 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 Library General Public - License along with the GNU C Library; see the file COPYING.LIB. 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, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#if HAVE_CONFIG_H +#if !_LIBC # include #endif - #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 +#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 +# include "allocsa.h" #endif #if !_LIBC @@ -169,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 *) allocsa (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); @@ -186,8 +179,8 @@ __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 - freea (new_value); +#if defined USE_TSEARCH && !defined _LIBC + freesa (new_value); #endif __set_errno (ENOMEM); UNLOCK; @@ -206,8 +199,8 @@ __add_to_environ (const char *name, const char *value, const char *combined, user string or not. */ STORE_VALUE (new_environ[size]); } -#ifdef USE_TSEARCH - freea (new_value); +#if defined USE_TSEARCH && !defined _LIBC + freesa (new_value); #endif } @@ -229,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 = allocsa (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); @@ -246,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 - freea (new_value); +#if defined USE_TSEARCH && !defined _LIBC + freesa (new_value); #endif + __set_errno (ENOMEM); UNLOCK; return -1; } @@ -263,8 +265,8 @@ __add_to_environ (const char *name, const char *value, const char *combined, /* And remember the value. */ STORE_VALUE (np); } -#ifdef USE_TSEARCH - freea (new_value); +#if defined USE_TSEARCH && !defined _LIBC + freesa (new_value); #endif } @@ -286,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;