* Copyright (c) 1987 Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)setenv.c 5.2 (Berkeley) %G%";
#endif /* LIBC_SCCS and not lint */
* Set the value of the environmental variable "name" to be
* "value". If rewrite is set, replace any current value.
setenv(name
, value
, rewrite
)
register char *name
, *value
;
static int alloced
; /* if allocated space before */
char *malloc(), *realloc(), *_findenv();
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
,
(u_int
)(sizeof(char *) * (cnt
+ 2)));
else { /* get new space */
alloced
= 1; /* copy old entries into it */
P
= (char **)malloc((u_int
)(sizeof(char *) *
bcopy(environ
, P
, cnt
* sizeof(char *));
for (C
= name
; *C
&& *C
!= '='; ++C
); /* no `=' in name */
if (!(environ
[offset
] = /* name + `=' + value */
malloc((u_int
)((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
)