summaryrefslogtreecommitdiffstats
path: root/src/lib/krb5/posix
diff options
context:
space:
mode:
authorTheodore Tso <tytso@mit.edu>1996-01-04 03:31:14 +0000
committerTheodore Tso <tytso@mit.edu>1996-01-04 03:31:14 +0000
commitb15d85f97a4f321a908cfb566db3532ba8bfebd7 (patch)
treeaefd8fbde04ea82ccc82606aa3fcea3ce54020ef /src/lib/krb5/posix
parentea21a78f413afcfb20c18918f7c8ce2fea401636 (diff)
downloadkrb5-b15d85f97a4f321a908cfb566db3532ba8bfebd7.tar.gz
krb5-b15d85f97a4f321a908cfb566db3532ba8bfebd7.tar.xz
krb5-b15d85f97a4f321a908cfb566db3532ba8bfebd7.zip
* configure.in: Check for presense of setenv(), unsetenv(), and
getenv() from the C library. * Makefile.in: New file: setenv.c --- provides routines for setting the environment. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@7266 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib/krb5/posix')
-rw-r--r--src/lib/krb5/posix/ChangeLog8
-rw-r--r--src/lib/krb5/posix/Makefile.in2
-rw-r--r--src/lib/krb5/posix/configure.in1
-rw-r--r--src/lib/krb5/posix/setenv.c180
4 files changed, 190 insertions, 1 deletions
diff --git a/src/lib/krb5/posix/ChangeLog b/src/lib/krb5/posix/ChangeLog
index 3df1a00c2..9bd9e30f3 100644
--- a/src/lib/krb5/posix/ChangeLog
+++ b/src/lib/krb5/posix/ChangeLog
@@ -1,3 +1,11 @@
+Wed Jan 3 22:25:52 1996 Theodore Y. Ts'o <tytso@dcl>
+
+ * configure.in: Check for presense of setenv(), unsetenv(), and
+ getenv() from the C library.
+
+ * Makefile.in: New file: setenv.c --- provides routines for
+ setting the environment.
+
Tue Dec 19 17:29:21 1995 Theodore Y. Ts'o <tytso@dcl>
* configure.in: Don't drag in syslog.c if vsyslog() is not
diff --git a/src/lib/krb5/posix/Makefile.in b/src/lib/krb5/posix/Makefile.in
index 12219e4e6..30e73beaf 100644
--- a/src/lib/krb5/posix/Makefile.in
+++ b/src/lib/krb5/posix/Makefile.in
@@ -7,7 +7,7 @@ CFLAGS = $(CCOPTS) $(DEFS)
$(CC) $(CFLAGS) -c $(srcdir)/$*.c
@SHARED_RULE@
-OBJS = @LIBOBJS@
+OBJS = setenv.$(OBJEXT) @LIBOBJS@
all-unix:: shared $(OBJS)
all-mac: $(OBJS)
diff --git a/src/lib/krb5/posix/configure.in b/src/lib/krb5/posix/configure.in
index 8ecb1ce18..ba9bd52ba 100644
--- a/src/lib/krb5/posix/configure.in
+++ b/src/lib/krb5/posix/configure.in
@@ -4,6 +4,7 @@ SubdirLibraryRule([${OBJS}])
V5_SHARED_LIB_OBJS
AC_CONST
AC_HEADER_CHECK(paths.h,AC_DEFINE(HAS_PATHS_H))
+AC_HAVE_FUNCS(setenv unsetenv getenv)
AC_REPLACE_FUNCS(vfprintf vsprintf strdup strcasecmp strerror memmove daemon getuid sscanf syslog)
AC_FUNC_CHECK(setsid,AC_DEFINE(HAS_SETSID))
V5_AC_OUTPUT_MAKEFILE
diff --git a/src/lib/krb5/posix/setenv.c b/src/lib/krb5/posix/setenv.c
new file mode 100644
index 000000000..7072d7e1b
--- /dev/null
+++ b/src/lib/krb5/posix/setenv.c
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 1987, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/* based on @(#)setenv.c 8.1 (Berkeley) 6/4/93 */
+/* based on @(#)getenv.c 8.1 (Berkeley) 6/4/93 */
+
+#ifndef __STDC__
+#define const
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef __P
+#define __P(x) ()
+#endif
+static char *__findenv __P((const char *, int *));
+
+/*
+ * setenv --
+ * Set the value of the environmental variable "name" to be
+ * "value". If rewrite is set, replace any current value.
+ */
+int
+krb5_setenv(name, value, rewrite)
+ register const char *name;
+ register const char *value;
+ int rewrite;
+{
+#if HAVE_SETENV
+ return (setenv(name, value, rewrite));
+#else
+ extern char **environ;
+ static int alloced; /* if allocated space before */
+ register char *c;
+ int l_value, offset;
+
+ if (*value == '=') /* no `=' in value */
+ ++value;
+ l_value = strlen(value);
+ if ((c = __findenv(name, &offset))) { /* find if already exists */
+ if (!rewrite)
+ return (0);
+ if (strlen(c) >= l_value) { /* old larger; copy over */
+ while ((*c++ = *value++));
+ return (0);
+ }
+ } else { /* create new slot */
+ register int cnt;
+ register char **p;
+
+ for (p = environ, cnt = 0; *p; ++p, ++cnt);
+ if (alloced) { /* just increase size */
+ environ = (char **)realloc((char *)environ,
+ (size_t)(sizeof(char *) * (cnt + 2)));
+ if (!environ)
+ return (-1);
+ }
+ else { /* get new space */
+ alloced = 1; /* copy old entries into it */
+ p = (char **)malloc((size_t)(sizeof(char *) * (cnt + 2)));
+ if (!p)
+ return (-1);
+ memcpy(p, environ, cnt * sizeof(char *));
+ environ = p;
+ }
+ environ[cnt + 1] = NULL;
+ offset = cnt;
+ }
+ for (c = (char *)name; *c && *c != '='; ++c); /* no `=' in name */
+ if (!(environ[offset] = /* name + `=' + value */
+ malloc((size_t)((int)(c - name) + l_value + 2))))
+ return (-1);
+ for (c = environ[offset]; (*c = *name++) && *c != '='; ++c);
+ for (*c++ = '='; (*c++ = *value++););
+ return (0);
+#endif
+}
+
+/*
+ * unsetenv(name) --
+ * Delete environmental variable "name".
+ */
+void
+krb5_unsetenv(name)
+ const char *name;
+{
+#if HAVE_UNSETENV
+ unsetenv(name);
+#else
+ extern char **environ;
+ register char **p;
+ int offset;
+
+ while (__findenv(name, &offset)) /* if set multiple times */
+ for (p = &environ[offset];; ++p)
+ if (!(*p = *(p + 1)))
+ break;
+#endif
+}
+
+/*
+ * getenv --
+ * Returns ptr to value associated with name, if any, else NULL.
+ */
+char *
+krb5_getenv(name)
+ const char *name;
+{
+#if HAVE_GETENV
+ return (getenv(name));
+#else
+ int offset;
+
+ return (__findenv(name, &offset));
+#endif
+}
+
+#if (!HAVE_GETENV || !HAVE_SETENV || !HAVE_UNSETENV)
+/*
+ * __findenv --
+ * Returns pointer to value associated with name, if any, else NULL.
+ * Sets offset to be the offset of the name/value combination in the
+ * environmental array, for use by setenv(3) and unsetenv(3).
+ * Explicitly removes '=' in argument name.
+ */
+static char *
+__findenv(name, offset)
+ register const char *name;
+ int *offset;
+{
+ extern char **environ;
+ register int len;
+ register const char *np;
+ register char **p, *c;
+
+ if (name == NULL || environ == NULL)
+ return (NULL);
+ for (np = name; *np && *np != '='; ++np)
+ continue;
+ len = np - name;
+ for (p = environ; (c = *p) != NULL; ++p)
+ if (strncmp(c, name, len) == 0 && c[len] == '=') {
+ *offset = p - environ;
+ return (c + len + 1);
+ }
+ return (NULL);
+}
+#endif