* Copyright (c) 1987, 1993
* The Regents of the University of California. All rights reserved.
* %sccs.include.redist.c%
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)setenv.c 8.1 (Berkeley) %G%";
#endif /* LIBC_SCCS and not lint */
char *__findenv
__P((const char *, int *));
* Set the value of the environmental variable "name" to be
* "value". If rewrite is set, replace any current value.
setenv(name
, value
, rewrite
)
register const char *name
;
register const char *value
;
static int alloced
; /* if allocated space before */
if (*value
== '=') /* no `=' in value */
if ((c
= __findenv(name
, &offset
))) { /* find if already exists */
if (strlen(c
) >= l_value
) { /* old larger; copy over */
} else { /* create new slot */
for (p
= environ
, cnt
= 0; *p
; ++p
, ++cnt
);
if (alloced
) { /* just increase size */
environ
= (char **)realloc((char *)environ
,
(size_t)(sizeof(char *) * (cnt
+ 2)));
else { /* get new space */
alloced
= 1; /* copy old entries into it */
p
= malloc((size_t)(sizeof(char *) * (cnt
+ 2)));
bcopy(environ
, p
, cnt
* sizeof(char *));
for (c
= (char *)name
; *c
&& *c
!= '='; ++c
); /* no `=' in name */
if (!(environ
[offset
] = /* name + `=' + value */
malloc((size_t)((int)(c
- name
) + l_value
+ 2))))
for (c
= environ
[offset
]; (*c
= *name
++) && *c
!= '='; ++c
);
for (*c
++ = '='; *c
++ = *value
++;);
* Delete environmental variable "name".
while (__findenv(name
, &offset
)) /* if set multiple times */
for (p
= &environ
[offset
];; ++p
)