xref: /onnv-gate/usr/src/lib/libast/common/misc/getenv.c (revision 12068:08a39a083754)
18462SApril.Chin@Sun.COM /***********************************************************************
28462SApril.Chin@Sun.COM *                                                                      *
38462SApril.Chin@Sun.COM *               This software is part of the ast package               *
4*12068SRoger.Faulkner@Oracle.COM *          Copyright (c) 1985-2010 AT&T Intellectual Property          *
58462SApril.Chin@Sun.COM *                      and is licensed under the                       *
68462SApril.Chin@Sun.COM *                  Common Public License, Version 1.0                  *
78462SApril.Chin@Sun.COM *                    by AT&T Intellectual Property                     *
88462SApril.Chin@Sun.COM *                                                                      *
98462SApril.Chin@Sun.COM *                A copy of the License is available at                 *
108462SApril.Chin@Sun.COM *            http://www.opensource.org/licenses/cpl1.0.txt             *
118462SApril.Chin@Sun.COM *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
128462SApril.Chin@Sun.COM *                                                                      *
138462SApril.Chin@Sun.COM *              Information and Software Systems Research               *
148462SApril.Chin@Sun.COM *                            AT&T Research                             *
158462SApril.Chin@Sun.COM *                           Florham Park NJ                            *
168462SApril.Chin@Sun.COM *                                                                      *
178462SApril.Chin@Sun.COM *                 Glenn Fowler <gsf@research.att.com>                  *
188462SApril.Chin@Sun.COM *                  David Korn <dgk@research.att.com>                   *
198462SApril.Chin@Sun.COM *                   Phong Vo <kpv@research.att.com>                    *
208462SApril.Chin@Sun.COM *                                                                      *
218462SApril.Chin@Sun.COM ***********************************************************************/
228462SApril.Chin@Sun.COM #pragma prototyped
238462SApril.Chin@Sun.COM 
2410898Sroland.mainz@nrubsig.org #if _UWIN && __STDPP__
2510898Sroland.mainz@nrubsig.org __STDPP__directive pragma pp:hide getenv
2610898Sroland.mainz@nrubsig.org #endif
2710898Sroland.mainz@nrubsig.org 
288462SApril.Chin@Sun.COM #include "intercepts.h"
298462SApril.Chin@Sun.COM 
3010898Sroland.mainz@nrubsig.org #if _UWIN && __STDPP__
3110898Sroland.mainz@nrubsig.org __STDPP__directive pragma pp:nohide getenv
3210898Sroland.mainz@nrubsig.org #endif
3310898Sroland.mainz@nrubsig.org 
348462SApril.Chin@Sun.COM /*
358462SApril.Chin@Sun.COM  * NOTE: the "intercepts" definition is here instead of astintercept.c because some
368462SApril.Chin@Sun.COM  *	 static linkers miss lone references to "intercepts" without "astintercept()"
3710898Sroland.mainz@nrubsig.org  * ALSO: { 0 } definition required by some dynamic linkers averse to common symbols
3810898Sroland.mainz@nrubsig.org  * UWIN: no _ast_getenv macro map to maintain ast54 compatibility
398462SApril.Chin@Sun.COM  */
408462SApril.Chin@Sun.COM 
41*12068SRoger.Faulkner@Oracle.COM Intercepts_t	intercepts
42*12068SRoger.Faulkner@Oracle.COM #if _BLD_3d
43*12068SRoger.Faulkner@Oracle.COM 		;
44*12068SRoger.Faulkner@Oracle.COM #else
45*12068SRoger.Faulkner@Oracle.COM 		= { 0 };
46*12068SRoger.Faulkner@Oracle.COM #endif
478462SApril.Chin@Sun.COM 
4810898Sroland.mainz@nrubsig.org #if _UWIN && !defined(getenv)
4910898Sroland.mainz@nrubsig.org 
5010898Sroland.mainz@nrubsig.org #include <windows.h>
5110898Sroland.mainz@nrubsig.org 
5210898Sroland.mainz@nrubsig.org extern char**	environ;
5310898Sroland.mainz@nrubsig.org 
5410898Sroland.mainz@nrubsig.org static char*
default_getenv(const char * name)5510898Sroland.mainz@nrubsig.org default_getenv(const char* name)
5610898Sroland.mainz@nrubsig.org {
5710898Sroland.mainz@nrubsig.org 	register char**		av;
5810898Sroland.mainz@nrubsig.org 	register const char*	cp;
5910898Sroland.mainz@nrubsig.org 	register const char*	sp;
6010898Sroland.mainz@nrubsig.org 	register char		c0;
6110898Sroland.mainz@nrubsig.org 	register char		c1;
6210898Sroland.mainz@nrubsig.org 
6310898Sroland.mainz@nrubsig.org 	av = environ;
6410898Sroland.mainz@nrubsig.org 	if (!av || !name || !(c0 = *name))
6510898Sroland.mainz@nrubsig.org 		return 0;
6610898Sroland.mainz@nrubsig.org 	if (!(c1 = *++name))
6710898Sroland.mainz@nrubsig.org 		c1 = '=';
6810898Sroland.mainz@nrubsig.org 	while (cp = *av++)
6910898Sroland.mainz@nrubsig.org 	{
7010898Sroland.mainz@nrubsig.org 		if (cp[0] != c0 || cp[1] != c1)
7110898Sroland.mainz@nrubsig.org 			continue;
7210898Sroland.mainz@nrubsig.org 		sp = name;
7310898Sroland.mainz@nrubsig.org 		cp++;
7410898Sroland.mainz@nrubsig.org 		while (*sp && *sp++ == *cp++);
7510898Sroland.mainz@nrubsig.org 		if (*(sp-1) != *(cp-1))
7610898Sroland.mainz@nrubsig.org 			continue;
7710898Sroland.mainz@nrubsig.org 		if (*sp == 0 && *cp == '=')
7810898Sroland.mainz@nrubsig.org 			return (char*)(cp+1);
7910898Sroland.mainz@nrubsig.org 	}
8010898Sroland.mainz@nrubsig.org 	return 0;
8110898Sroland.mainz@nrubsig.org }
8210898Sroland.mainz@nrubsig.org 
8310898Sroland.mainz@nrubsig.org #endif
8410898Sroland.mainz@nrubsig.org 
858462SApril.Chin@Sun.COM /*
868462SApril.Chin@Sun.COM  * get name from the environment
878462SApril.Chin@Sun.COM  */
888462SApril.Chin@Sun.COM 
8910898Sroland.mainz@nrubsig.org #if defined(__EXPORT__) && defined(getenv)
9010898Sroland.mainz@nrubsig.org #define extern	__EXPORT__
9110898Sroland.mainz@nrubsig.org #endif
9210898Sroland.mainz@nrubsig.org 
9310898Sroland.mainz@nrubsig.org extern char*
getenv(const char * name)948462SApril.Chin@Sun.COM getenv(const char* name)
958462SApril.Chin@Sun.COM {
9610898Sroland.mainz@nrubsig.org #if _UWIN && !defined(getenv) /* for ast54 compatibility */
9710898Sroland.mainz@nrubsig.org 	HANDLE		dll;
9810898Sroland.mainz@nrubsig.org 
9910898Sroland.mainz@nrubsig.org 	static char*	(*posix_getenv)(const char*);
10010898Sroland.mainz@nrubsig.org 
10110898Sroland.mainz@nrubsig.org 	if (!posix_getenv)
10210898Sroland.mainz@nrubsig.org 	{
10310898Sroland.mainz@nrubsig.org 		if (dll = GetModuleHandle("posix.dll"))
10410898Sroland.mainz@nrubsig.org 			posix_getenv = (char*(*)(const char*))GetProcAddress(dll, "getenv");
10510898Sroland.mainz@nrubsig.org 		if (!posix_getenv)
10610898Sroland.mainz@nrubsig.org 			posix_getenv = default_getenv;
10710898Sroland.mainz@nrubsig.org 	}
10810898Sroland.mainz@nrubsig.org 	return intercepts.intercept_getenv ? (*intercepts.intercept_getenv)(name) : (*posix_getenv)(name);
10910898Sroland.mainz@nrubsig.org #else
1108462SApril.Chin@Sun.COM #undef	getenv
1118462SApril.Chin@Sun.COM 	return intercepts.intercept_getenv ? (*intercepts.intercept_getenv)(name) : getenv(name);
11210898Sroland.mainz@nrubsig.org #endif
1138462SApril.Chin@Sun.COM }
114