xref: /illumos-gate/usr/src/cmd/make/lib/vroot/setenv.cc (revision fb2612809ed5f2cb9109db768e63d61f6659f71b)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 1994 Sun Microsystems, Inc. All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 
27 #include <stdlib.h>
28 #include <string.h>
29 #include <unistd.h>
30 
31 extern	char	**environ;
32 
33 static	short	setenv_made_new_vector= 0;
34 
35 char *setenv(char *name, char *value)
36 {	char *p= NULL, **q;
37 	int length= 0, vl;
38 
39 	if ((p= getenv(name)) == NULL) {	/* Allocate new vector */
40 		for (q= environ; *q != NULL; q++, length++);
41 		q= (char **)malloc((unsigned)(sizeof(char *)*(length+2)));
42                 memcpy(((char *)q)+sizeof(char *), (char *)environ, sizeof(char *)*(length+1));
43 		if (setenv_made_new_vector++)
44 			free((char *)environ);
45 		length= strlen(name);
46 		environ= q;}
47 	else { /* Find old slot */
48 		length= strlen(name);
49 		for (q= environ; *q != NULL; q++)
50 			if (!strncmp(*q, name, length))
51 				break;};
52 	vl= strlen(value);
53 	if (!p || (length+vl+1 > strlen(p)))
54 		*q= p= (char *) malloc((unsigned)(length+vl+2));
55 	else
56 		p= *q;
57 	(void)strcpy(p, name); p+= length;
58 	*p++= '=';
59 	(void)strcpy(p, value);
60 	return(value);
61 }
62