summaryrefslogtreecommitdiff
path: root/usr/src/lib/libbc/libc/gen/common/putenv.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libbc/libc/gen/common/putenv.c')
-rw-r--r--usr/src/lib/libbc/libc/gen/common/putenv.c121
1 files changed, 121 insertions, 0 deletions
diff --git a/usr/src/lib/libbc/libc/gen/common/putenv.c b/usr/src/lib/libbc/libc/gen/common/putenv.c
new file mode 100644
index 0000000000..41e2a49b7c
--- /dev/null
+++ b/usr/src/lib/libbc/libc/gen/common/putenv.c
@@ -0,0 +1,121 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 1987 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1984 AT&T */
+/* All Rights Reserved */
+
+#pragma ident "%Z%%M% %I% %E% SMI" /* from S5R2 1.2 */
+
+/* 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;
+}