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