From: Theodore Tso Date: Thu, 4 Jan 1996 03:31:14 +0000 (+0000) Subject: * configure.in: Check for presense of setenv(), unsetenv(), and X-Git-Tag: krb5-1.0-beta6~666 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=b15d85f97a4f321a908cfb566db3532ba8bfebd7;p=krb5.git * 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 --- 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 + + * 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 * 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 +#include +#include + +#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