@ -28,7 +28,7 @@
*/
*/
# if defined(LIBC_SCCS) && !defined(lint)
# if defined(LIBC_SCCS) && !defined(lint)
static char * rcsid = " $OpenBSD: setenv.c,v 1.6 2003/06/02 20:18:38 millert Exp $ " ;
static char * rcsid = " $OpenBSD: setenv.c,v 1.7 2005/02/16 21:20:22 millert Exp $ " ;
# endif /* LIBC_SCCS and not lint */
# endif /* LIBC_SCCS and not lint */
# include <stdlib.h>
# include <stdlib.h>
@ -36,6 +36,8 @@ static char *rcsid = "$OpenBSD: setenv.c,v 1.6 2003/06/02 20:18:38 millert Exp $
char * __findenv ( const char * name , int * offset ) ;
char * __findenv ( const char * name , int * offset ) ;
extern char * * environ ;
/*
/*
* setenv - -
* setenv - -
* Set the value of the environmental variable " name " to be
* Set the value of the environmental variable " name " to be
@ -43,13 +45,12 @@ char *__findenv(const char *name, int *offset);
*/
*/
int
int
setenv ( name , value , rewrite )
setenv ( name , value , rewrite )
register const char * name ;
register const char * value ;
const char * name ;
const char * value ;
int rewrite ;
int rewrite ;
{
{
extern char * * environ ;
static int alloced ; /* if allocated space before */
register char * C ;
static char * * lastenv ; /* last value of environ */
char * C ;
int l_value , offset ;
int l_value , offset ;
if ( * value = = ' = ' ) /* no `=' in value */
if ( * value = = ' = ' ) /* no `=' in value */
@ -64,30 +65,23 @@ setenv(name, value, rewrite)
return ( 0 ) ;
return ( 0 ) ;
}
}
} else { /* create new slot */
} else { /* create new slot */
register int cnt ;
register char * * P ;
size_t cnt ;
char * * P ;
for ( P = environ , cnt = 0 ; * P ; + + P , + + cnt ) ;
if ( alloced ) { /* just increase size */
P = ( char * * ) realloc ( ( void * ) environ ,
( size_t ) ( sizeof ( char * ) * ( cnt + 2 ) ) ) ;
if ( ! P )
return ( - 1 ) ;
environ = P ;
}
else { /* get new space */
alloced = 1 ; /* copy old entries into it */
P = ( char * * ) malloc ( ( size_t ) ( sizeof ( char * ) *
( cnt + 2 ) ) ) ;
if ( ! P )
return ( - 1 ) ;
bcopy ( environ , P , cnt * sizeof ( char * ) ) ;
environ = P ;
}
environ [ cnt + 1 ] = NULL ;
for ( P = environ ; * P ! = NULL ; P + + )
;
cnt = P - environ ;
P = ( char * * ) realloc ( lastenv , sizeof ( char * ) * ( cnt + 2 ) ) ;
if ( ! P )
return ( - 1 ) ;
if ( lastenv ! = environ )
memcpy ( P , environ , cnt * sizeof ( char * ) ) ;
lastenv = environ = P ;
offset = cnt ;
offset = cnt ;
environ [ cnt + 1 ] = NULL ;
}
}
for ( C = ( char * ) name ; * C & & * C ! = ' = ' ; + + C ) ; /* no `=' in name */
for ( C = ( char * ) name ; * C & & * C ! = ' = ' ; + + C )
; /* no `=' in name */
if ( ! ( environ [ offset ] = /* name + `=' + value */
if ( ! ( environ [ offset ] = /* name + `=' + value */
malloc ( ( size_t ) ( ( int ) ( C - name ) + l_value + 2 ) ) ) )
malloc ( ( size_t ) ( ( int ) ( C - name ) + l_value + 2 ) ) ) )
return ( - 1 ) ;
return ( - 1 ) ;
@ -104,14 +98,12 @@ setenv(name, value, rewrite)
*/
*/
void
void
unsetenv ( name )
unsetenv ( name )
const char * name ;
const char * name ;
{
{
extern char * * environ ;
register char * * P ;
char * * P ;
int offset ;
int offset ;
char * __findenv ( ) ;
while ( __findenv ( name , & offset ) ) /* if set multiple times */
while ( __findenv ( name , & offset ) ) /* if set multiple times */
for ( P = & environ [ offset ] ; ; + + P )
for ( P = & environ [ offset ] ; ; + + P )
if ( ! ( * P = * ( P + 1 ) ) )
if ( ! ( * P = * ( P + 1 ) ) )
break ;
break ;