18462SApril.Chin@Sun.COM /***********************************************************************
28462SApril.Chin@Sun.COM *                                                                      *
38462SApril.Chin@Sun.COM *               This software is part of the ast package               *
4*10898Sroland.mainz@nrubsig.org *          Copyright (c) 1985-2009 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 
24*10898Sroland.mainz@nrubsig.org #if _UWIN && __STDPP__
25*10898Sroland.mainz@nrubsig.org __STDPP__directive pragma pp:hide getenv
26*10898Sroland.mainz@nrubsig.org #endif
27*10898Sroland.mainz@nrubsig.org 
288462SApril.Chin@Sun.COM #include "intercepts.h"
298462SApril.Chin@Sun.COM 
30*10898Sroland.mainz@nrubsig.org #if _UWIN && __STDPP__
31*10898Sroland.mainz@nrubsig.org __STDPP__directive pragma pp:nohide getenv
32*10898Sroland.mainz@nrubsig.org #endif
33*10898Sroland.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()"
37*10898Sroland.mainz@nrubsig.org  * ALSO: { 0 } definition required by some dynamic linkers averse to common symbols
38*10898Sroland.mainz@nrubsig.org  * UWIN: no _ast_getenv macro map to maintain ast54 compatibility
398462SApril.Chin@Sun.COM  */
408462SApril.Chin@Sun.COM 
418462SApril.Chin@Sun.COM Intercepts_t	intercepts = { 0 };
428462SApril.Chin@Sun.COM 
43*10898Sroland.mainz@nrubsig.org #if _UWIN && !defined(getenv)
44*10898Sroland.mainz@nrubsig.org 
45*10898Sroland.mainz@nrubsig.org #include <windows.h>
46*10898Sroland.mainz@nrubsig.org 
47*10898Sroland.mainz@nrubsig.org extern char**	environ;
48*10898Sroland.mainz@nrubsig.org 
49*10898Sroland.mainz@nrubsig.org static char*
50*10898Sroland.mainz@nrubsig.org default_getenv(const char* name)
51*10898Sroland.mainz@nrubsig.org {
52*10898Sroland.mainz@nrubsig.org 	register char**		av;
53*10898Sroland.mainz@nrubsig.org 	register const char*	cp;
54*10898Sroland.mainz@nrubsig.org 	register const char*	sp;
55*10898Sroland.mainz@nrubsig.org 	register char		c0;
56*10898Sroland.mainz@nrubsig.org 	register char		c1;
57*10898Sroland.mainz@nrubsig.org 
58*10898Sroland.mainz@nrubsig.org 	av = environ;
59*10898Sroland.mainz@nrubsig.org 	if (!av || !name || !(c0 = *name))
60*10898Sroland.mainz@nrubsig.org 		return 0;
61*10898Sroland.mainz@nrubsig.org 	if (!(c1 = *++name))
62*10898Sroland.mainz@nrubsig.org 		c1 = '=';
63*10898Sroland.mainz@nrubsig.org 	while (cp = *av++)
64*10898Sroland.mainz@nrubsig.org 	{
65*10898Sroland.mainz@nrubsig.org 		if (cp[0] != c0 || cp[1] != c1)
66*10898Sroland.mainz@nrubsig.org 			continue;
67*10898Sroland.mainz@nrubsig.org 		sp = name;
68*10898Sroland.mainz@nrubsig.org 		cp++;
69*10898Sroland.mainz@nrubsig.org 		while (*sp && *sp++ == *cp++);
70*10898Sroland.mainz@nrubsig.org 		if (*(sp-1) != *(cp-1))
71*10898Sroland.mainz@nrubsig.org 			continue;
72*10898Sroland.mainz@nrubsig.org 		if (*sp == 0 && *cp == '=')
73*10898Sroland.mainz@nrubsig.org 			return (char*)(cp+1);
74*10898Sroland.mainz@nrubsig.org 	}
75*10898Sroland.mainz@nrubsig.org 	return 0;
76*10898Sroland.mainz@nrubsig.org }
77*10898Sroland.mainz@nrubsig.org 
78*10898Sroland.mainz@nrubsig.org #endif
79*10898Sroland.mainz@nrubsig.org 
808462SApril.Chin@Sun.COM /*
818462SApril.Chin@Sun.COM  * get name from the environment
828462SApril.Chin@Sun.COM  */
838462SApril.Chin@Sun.COM 
84*10898Sroland.mainz@nrubsig.org #if defined(__EXPORT__) && defined(getenv)
85*10898Sroland.mainz@nrubsig.org #define extern	__EXPORT__
86*10898Sroland.mainz@nrubsig.org #endif
87*10898Sroland.mainz@nrubsig.org 
88*10898Sroland.mainz@nrubsig.org extern char*
898462SApril.Chin@Sun.COM getenv(const char* name)
908462SApril.Chin@Sun.COM {
91*10898Sroland.mainz@nrubsig.org #if _UWIN && !defined(getenv) /* for ast54 compatibility */
92*10898Sroland.mainz@nrubsig.org 	HANDLE		dll;
93*10898Sroland.mainz@nrubsig.org 
94*10898Sroland.mainz@nrubsig.org 	static char*	(*posix_getenv)(const char*);
95*10898Sroland.mainz@nrubsig.org 
96*10898Sroland.mainz@nrubsig.org 	if (!posix_getenv)
97*10898Sroland.mainz@nrubsig.org 	{
98*10898Sroland.mainz@nrubsig.org 		if (dll = GetModuleHandle("posix.dll"))
99*10898Sroland.mainz@nrubsig.org 			posix_getenv = (char*(*)(const char*))GetProcAddress(dll, "getenv");
100*10898Sroland.mainz@nrubsig.org 		if (!posix_getenv)
101*10898Sroland.mainz@nrubsig.org 			posix_getenv = default_getenv;
102*10898Sroland.mainz@nrubsig.org 	}
103*10898Sroland.mainz@nrubsig.org 	return intercepts.intercept_getenv ? (*intercepts.intercept_getenv)(name) : (*posix_getenv)(name);
104*10898Sroland.mainz@nrubsig.org #else
1058462SApril.Chin@Sun.COM #undef	getenv
1068462SApril.Chin@Sun.COM 	return intercepts.intercept_getenv ? (*intercepts.intercept_getenv)(name) : getenv(name);
107*10898Sroland.mainz@nrubsig.org #endif
1088462SApril.Chin@Sun.COM }
109