old-cross-binutils/gdb/putenv.c
Peter Schauer ba47c66add * README: Remove note about gcc warnings on alpha, these should be
gone now.
	* c-exp.y, ch-exp.y, core.c, corelow.c, eval.c, fork-child.c,
	m2-exp.y, minsyms.c, nlmread.c, parse.c, putenv.c, regex.c
	remote-utils.c, stabsread.c:  Include <string.h>.
	* regex.c:  Include "defs.h", change re_comp argument to const char *.
	* infptrace.c (fetch_register, store_inferior_registers):  Change
	regaddr to type CORE_ADDR.
	* config/alpha/alpha-nw.mt, config/alpha/alpha-osf1.mt (MT_CFLAGS):
	Remove, no longer necessary now that we use bfd_vma for a CORE_ADDR.
1994-02-08 09:01:03 +00:00

112 lines
2.8 KiB
C

/****************************************************************/
/* */
/* putenv(3) */
/* */
/* Change or add an environment entry */
/* */
/****************************************************************/
/* origination 1987-Oct-7 T. Holm */
/****************************************************************/
/*
Path: hoptoad!pacbell!ames!ll-xn!mit-eddie!uw-beaver!ssc-vax!uvicctr!tholm
From: tholm@uvicctr.UUCP (Terrence W. Holm)
Newsgroups: comp.os.minix
Subject: putenv(3)
Message-ID: <395@uvicctr.UUCP>
Date: 5 May 88 06:40:52 GMT
Organization: University of Victoria, Victoria B.C. Canada
EFTH Minix report #2 - May 1988 - putenv(3)
This is an implementation of putenv(3) that we
wrote for Minix. Please consider this a public
domain program.
*/
#include <stdio.h>
#include <string.h>
#define PSIZE sizeof(char *)
extern char **environ;
char *strchr();
char *malloc();
/****************************************************************/
/* */
/* int */
/* putenv( entry ) */
/* */
/* The "entry" should follow the form */
/* "NAME=VALUE". This routine will search the */
/* user environment for "NAME" and replace its */
/* value with "VALUE". */
/* */
/* Note that "entry" is not copied, it is used */
/* as the environment entry. This means that it */
/* must not be unallocated or otherwise modifed */
/* by the caller, unless it is replaced by a */
/* subsequent putenv(). */
/* */
/* If the name is not found in the environment, */
/* then a new vector of pointers is allocated, */
/* "entry" is put at the end and the global */
/* variable "environ" is updated. */
/* */
/* This function normally returns NULL, but -1 */
/* is returned if it can not allocate enough */
/* space using malloc(3), or "entry" does not */
/* contain a '='. */
/* */
/****************************************************************/
int
putenv( entry )
char *entry;
{
unsigned length;
unsigned size;
char *temp;
char **p;
char **new_environ;
/* Find the length of the "NAME=" */
temp = strchr(entry,'=');
if ( temp == 0 )
return( -1 );
length = (unsigned) (temp - entry + 1);
/* Scan through the environment looking for "NAME=" */
for ( p=environ; *p != 0 ; p++ )
if ( strncmp( entry, *p, length ) == 0 )
{
*p = entry;
return( 0 );
}
/* The name was not found, build a bigger environment */
size = p - environ;
new_environ = (char **) malloc( (size+2)*PSIZE );
if ( new_environ == (char **) NULL )
return( -1 );
memcpy ((char *) new_environ, (char *) environ, size*PSIZE );
new_environ[size] = entry;
new_environ[size+1] = NULL;
environ = new_environ;
return(0);
}