genericopenlibs/openenvcore/libc/src/libc_init/estlib.cpp
changeset 0 e4d67989cc36
child 44 97b0fb8a2cc2
--- /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 <stdlib.h>
+#include <unistd.h> //environ
+#include <string.h>
+#include <stdio.h>
+#include <sys/syslimits.h>
+#include <time.h>
+#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 <pls.h> // 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<PATH_MAX> 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