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.orgdefault_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.COMgetenv(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