95 lines
2.1 KiB
C
95 lines
2.1 KiB
C
#if !defined(lint) && defined(SCCSIDS)
|
|
static char sccsid[] = "@(#)putenv.c 1.1 94/10/31 SMI"; /* from S5R2 1.2 */
|
|
#endif
|
|
|
|
/* LINTLIBRARY */
|
|
/* putenv - change environment variables
|
|
|
|
input - char *change = a pointer to a string of the form
|
|
"name=value"
|
|
|
|
output - 0, if successful
|
|
1, otherwise
|
|
*/
|
|
#define NULL 0
|
|
extern char **environ; /* pointer to enviroment */
|
|
static reall; /* flag to reallocate space, if putenv is called
|
|
more than once */
|
|
|
|
int
|
|
putenv(change)
|
|
char *change;
|
|
{
|
|
char **newenv; /* points to new environment */
|
|
register int which; /* index of variable to replace */
|
|
char *realloc(), *malloc(); /* memory alloc routines */
|
|
|
|
if ((which = find(change)) < 0) {
|
|
/* if a new variable */
|
|
/* which is negative of table size, so invert and
|
|
count new element */
|
|
which = (-which) + 1;
|
|
if (reall) {
|
|
/* we have expanded environ before */
|
|
newenv = (char **)realloc(environ,
|
|
which*sizeof(char *));
|
|
if (newenv == NULL) return -1;
|
|
/* now that we have space, change environ */
|
|
environ = newenv;
|
|
} else {
|
|
/* environ points to the original space */
|
|
reall++;
|
|
newenv = (char **)malloc(which*sizeof(char *));
|
|
if (newenv == NULL) return -1;
|
|
(void)memcpy((char *)newenv, (char *)environ,
|
|
(int)(which*sizeof(char *)));
|
|
environ = newenv;
|
|
}
|
|
environ[which-2] = change;
|
|
environ[which-1] = NULL;
|
|
} else {
|
|
/* we are replacing an old variable */
|
|
environ[which] = change;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/* find - find where s2 is in environ
|
|
*
|
|
* input - str = string of form name=value
|
|
*
|
|
* output - index of name in environ that matches "name"
|
|
* -size of table, if none exists
|
|
*/
|
|
static
|
|
find(str)
|
|
register char *str;
|
|
{
|
|
register int ct = 0; /* index into environ */
|
|
|
|
while(environ[ct] != NULL) {
|
|
if (match(environ[ct], str) != 0)
|
|
return ct;
|
|
ct++;
|
|
}
|
|
return -(++ct);
|
|
}
|
|
/*
|
|
* s1 is either name, or name=value
|
|
* s2 is name=value
|
|
* if names match, return value of 1,
|
|
* else return 0
|
|
*/
|
|
|
|
static
|
|
match(s1, s2)
|
|
register char *s1, *s2;
|
|
{
|
|
while(*s1 == *s2++) {
|
|
if (*s1 == '=')
|
|
return 1;
|
|
s1++;
|
|
}
|
|
return 0;
|
|
}
|