diff -r 000000000000 -r e4d67989cc36 genericopenlibs/openenvcore/libc/src/libc_init/estlib.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/openenvcore/libc/src/libc_init/estlib.cpp Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,248 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// +// + +#include +#include //environ +#include +#include +#include +#include +#include "sysreent.h" +#include "mmapcontrollernode.h" +#include "reent.h" +#include "sysif.h" + +#if (defined(__SYMBIAN32__) && (defined(__WINSCW__) || defined(__WINS__))) +#include "libc_wsd_defs.h" +#include "localeinfo.h" +#include "localetlsinfo.h" +#endif + +#ifdef __EPOC32__ +class XLibcTLSCleanup + { +public: + ~XLibcTLSCleanup() + { + Dll::FreeTls(); + } + }; + +// Create a global here. It's destructor invoked on libc unload will reset libc's TLS +XLibcTLSCleanup gLibcTLSCleanup; +#endif + +#ifdef __WINSCW__ +#include // For emulator WSD API +const TUid KLibcUid3 = {0x10207369}; +#endif //__WINSCW__ + +// Access for the outside world +extern "C" { + +//Definition of environ variable and __progname which will be used by other module as extern +#ifndef EMULATOR +char** environp; +const char* __progname; +#else //EMULATOR + +GET_GLOBAL_VAR_FROM_TLS(environp, char **) +#define environp (*GET_WSD_VAR_NAME(environp, g)()) +const char** progname(void) + { + return &(GetGlobals()->_g___progname); + } +#endif //EMULATOR +void GetTmpDirName(); +// ----------------------------------------------------------------------------- +// SetupEnviron +// This function sets up the environment by populating the per process variable +// environ with a list strings of the form "name=value". +// ----------------------------------------------------------------------------- +// +void SetupEnviron() + { + const TUint KPathSize = 15; + const TUint KNumEnvironVars = 3; + environp = (char**)Backend()->Alloc(KNumEnvironVars * sizeof(char *)); + if (!environp) + return; + + int idx = 0; + char* path = (char*)Backend()->Alloc(KPathSize); + if (path) + { + strcpy(path, "home=\\home"); + environp[idx] = path; + ++idx; + } + //get private path here + GetTmpDirName(); + // Insert other default environ vars here + char* tmpfilepath = (char*)Backend()->Alloc(PATH_MAX); + if(tmpfilepath == 0) + return; + strcpy(tmpfilepath, "TMPDIR="); + strcat(tmpfilepath, __tmpdirptr); + if (tmpfilepath) + { + environp[idx] = tmpfilepath; + ++idx; + } + environp[idx] = NULL; + } +// ----------------------------------------------------------------------------- +// GetTmpDirName +// This API is used for get path of private directory of user +// ----------------------------------------------------------------------------- +// +void GetTmpDirName() +{ + TFileName file; + RFs iTestSession; + TBuf8 buf1; + TInt len; + file.Append(iTestSession.GetSystemDriveChar()); + file.Append(TChar(KDriveDelimiter)); + file.Append(TChar(KPathDelimiter)); + file.Append(_L("Private")); + __tmpdirptr = (char*)Backend()->Alloc(PATH_MAX); + if(__tmpdirptr == NULL) + { + User::Panic(_L("LIBRARY-INIT"), KErrNoMemory); + } + iTestSession.Connect(); + iTestSession.SessionPath(file); + buf1.Copy(file); + iTestSession.Close(); + + len=buf1.Length(); + strncpy(__tmpdirptr,(char*) buf1.Ptr(),len); + __tmpdirptr[len] = '\0'; + strcat(__tmpdirptr, "tmp"); +} + +#ifdef __WINSCW__ +struct _libc_wsd* GetGlobals() + { + // Access the PLS of this process + _libc_wsd* p = Pls<_libc_wsd>(KLibcUid3, &InitWSDVar); + return p; + } +#endif //__WINSCW__ + +// ----------------------------------------------------------------------------- +// ImpurePtr +// This exported API is used for fetching reent structure for TLS +// This also does the initialization of all libc specific variables +// on the first call +// ----------------------------------------------------------------------------- +// +struct _reent* ImpurePtr(void) + { +#ifdef __WINSCW__ + GetGlobals(); +#endif // __WINSCW__ + //Create Reent Structure for this thread if Dll::Tls is NULL + struct _reent* p=(struct _reent*)Dll::Tls(); + if (p) + return p; + + // First use, so construct the default struct _reent + // Do the allocation in backend's private heap + p = (struct _reent*)BackendAllocTLD( sizeof(struct _reent) ); + if (p==NULL) + User::Panic(KEstlibInit, KErrNoMemory); + + TInt err = Dll::SetTls(p); + Mem::FillZ( p, sizeof(struct _reent) ); + return p; + } + +EXPORT_C int* __errno(void) + { + return &(ImpurePtr()->_errno); + } + +EXPORT_C char*** __environ(void) + { + if(!environp) + { + SetupEnviron(); + } + + return &environp; + } +int GetStdOffset(void) + { + TTimeIntervalSeconds t = User::UTCOffset(); + return t.Int(); + } + +int GetIsDst(void) + { + TLocale iLocale; + if(iLocale.QueryHomeHasDaylightSavingOn()) + return 1; + return 0; + } + + +#ifndef __WINSCW__ +extern char ** _tzname; +#else +GET_GLOBAL_VAR_FROM_TLS(_tzname, char **) +#define _tzname (*GET_WSD_VAR_NAME(_tzname, g)()) +#endif + +// ----------------------------------------------------------------------------- +// SetupTzname +// This function sets up the Tzname variable by populating the per process variable +// _tzname with a list strings . +// ----------------------------------------------------------------------------- +// +void SetupTzname() + { + const TUint KNumTzVars = 2; + _tzname = (char**)Backend()->Alloc(KNumTzVars * sizeof(char *)); + if (!_tzname) + return; + _tzname[0] = "WILDABBR"; + _tzname[1] = "WILDABBR"; + } + + +EXPORT_C char*** __tzname(void) + { + if(!_tzname) + { + SetupTzname(); + } + + return &_tzname; + } + +} // extern "C" + +#ifndef EKA2 +GLDEF_C TInt E32Dll(TDllReason) +// +// DLL entry point +// + { + return KErrNone; + } +#endif