Logo Search packages:      
Sourcecode: ksh version File versions  Download package

getenv.c

/***********************************************************************
*                                                                      *
*               This software is part of the ast package               *
*          Copyright (c) 1985-2010 AT&T Intellectual Property          *
*                      and is licensed under the                       *
*                  Common Public License, Version 1.0                  *
*                    by AT&T Intellectual Property                     *
*                                                                      *
*                A copy of the License is available at                 *
*            http://www.opensource.org/licenses/cpl1.0.txt             *
*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
*                                                                      *
*              Information and Software Systems Research               *
*                            AT&T Research                             *
*                           Florham Park NJ                            *
*                                                                      *
*                 Glenn Fowler <gsf@research.att.com>                  *
*                  David Korn <dgk@research.att.com>                   *
*                   Phong Vo <kpv@research.att.com>                    *
*                                                                      *
***********************************************************************/
#pragma prototyped

#if _UWIN && __STDPP__
__STDPP__directive pragma pp:hide getenv
#endif

#include "intercepts.h"

#if _UWIN && __STDPP__
__STDPP__directive pragma pp:nohide getenv
#endif

/*
 * NOTE: the "intercepts" definition is here instead of astintercept.c because some
 *     static linkers miss lone references to "intercepts" without "astintercept()"
 * ALSO: { 0 } definition required by some dynamic linkers averse to common symbols
 * UWIN: no _ast_getenv macro map to maintain ast54 compatibility
 */

Intercepts_t      intercepts
#if _BLD_3d
            ;
#else
            = { 0 };
#endif

#if _UWIN && !defined(getenv)

#include <windows.h>

extern char**     environ;

static char*
default_getenv(const char* name)
{
      register char**         av;
      register const char*    cp;
      register const char*    sp;
      register char           c0;
      register char           c1;

      av = environ;
      if (!av || !name || !(c0 = *name))
            return 0;
      if (!(c1 = *++name))
            c1 = '=';
      while (cp = *av++)
      {
            if (cp[0] != c0 || cp[1] != c1)
                  continue;
            sp = name;
            cp++;
            while (*sp && *sp++ == *cp++);
            if (*(sp-1) != *(cp-1))
                  continue;
            if (*sp == 0 && *cp == '=')
                  return (char*)(cp+1);
      }
      return 0;
}

#endif

/*
 * get name from the environment
 */

#if defined(__EXPORT__) && defined(getenv)
#define extern    __EXPORT__
#endif

extern char*
getenv(const char* name)
{
#if _UWIN && !defined(getenv) /* for ast54 compatibility */
      HANDLE            dll;

      static char*      (*posix_getenv)(const char*);

      if (!posix_getenv)
      {
            if (dll = GetModuleHandle("posix.dll"))
                  posix_getenv = (char*(*)(const char*))GetProcAddress(dll, "getenv");
            if (!posix_getenv)
                  posix_getenv = default_getenv;
      }
      return intercepts.intercept_getenv ? (*intercepts.intercept_getenv)(name) : (*posix_getenv)(name);
#else
#undef      getenv
      return intercepts.intercept_getenv ? (*intercepts.intercept_getenv)(name) : getenv(name);
#endif
}

Generated by  Doxygen 1.6.0   Back to index