genericopenlibs/cstdlib/LSTDLIB/ENVCALLS.CPP
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/cstdlib/LSTDLIB/ENVCALLS.CPP	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,219 @@
+// Copyright (c) 1998-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:
+// connectors for shared environment variables
+// 
+//
+
+#include "SYSIF.H"
+#include "LPOSIX.H"
+#include <errno.h>
+#include <string.h>
+
+
+#include <stdlib_r.h>
+
+extern "C" {
+
+/**
+Get string from environment.
+@return A null-terminated string with the value of the requested environment 
+variable or NULL if that environment variable does not exist.
+@param name Null-terminated string containing the name of the requested variable.
+*/
+EXPORT_C char* getenv (const char* name)
+	{
+	return _getenv_r (_REENT, name);
+	}
+
+/**
+A reentrant version of getenv().
+*/
+EXPORT_C char* _getenv_r (struct _reent *r, const char* name)
+	{
+//	wchar_t tmpbuf[KMaxFullName+1];		//use the max path length possible
+	char *  rval = NULL;
+	int err = 0;
+	wchar_t * tmpbuf = (wchar_t*)malloc(2*(strlen(name)+1));
+
+	if (tmpbuf)
+		{
+
+		if (-1 != mbstowcs(tmpbuf, name, strlen(name)+1))
+			{
+			MSystemInterface& sysIf=Interface(r);
+			wchar_t * wideval = sysIf.getenv(tmpbuf);
+
+			if (wideval)
+				{
+					
+				//get the max size
+				int size = 1 + 2* wcslen(wideval);
+				
+				if (size < _MINNARROWBUFSIZE)
+					size = _MINNARROWBUFSIZE;
+
+				if (size > r->_NEBSize)
+					{
+					//this string could be longer
+					char * p = (char*)realloc(r->_pNarrowEnvBuffer, size);
+					if (p)
+						{
+						r->_pNarrowEnvBuffer = p;
+						r->_NEBSize = size;
+						}
+					else
+						err = ENOMEM;
+					}
+				if (wcstombs(r->_pNarrowEnvBuffer, wideval, r->_NEBSize) >= 0)
+					rval =  r->_pNarrowEnvBuffer;
+
+				}
+			}
+		else
+			err = EILSEQ;
+
+		}
+
+	MapError(err, r->_errno);
+	free(tmpbuf);
+	return rval;
+	}
+
+EXPORT_C wchar_t* wgetenv (const wchar_t* name)
+	{
+	return _wgetenv_r (_REENT, name);
+	}
+
+/**
+A reentrant version of wgetenv().
+*/
+EXPORT_C wchar_t* _wgetenv_r (struct _reent *r, const wchar_t* name)
+	{
+	MSystemInterface& sysIf=Interface(r);
+	return sysIf.getenv(name);
+	}
+
+/**
+Removes an environment variable.
+*/
+EXPORT_C void unsetenv (const char* name)
+	{
+	_unsetenv_r (_REENT, name);
+	}
+
+/**
+A reentrant version of unsetenv().
+*/
+EXPORT_C void _unsetenv_r (struct _reent *r, const char* name)
+	{
+	int rval = 0;
+	wchar_t* tmpbuf = (wchar_t*)malloc(2*(strlen(name)+1));
+
+	if (tmpbuf)
+		{
+		if (-1 != mbstowcs(tmpbuf, name, strlen(name)+1))
+			{
+			MSystemInterface& sysIf=Interface(r);
+			sysIf.unsetenv(tmpbuf);
+			}
+		else
+			rval = EILSEQ;
+		}
+	else
+		rval = ENOMEM;
+
+	free(tmpbuf);
+	MapError(rval, r->_errno);
+	}
+
+/**
+A wide-character version of a unsetenv()
+*/
+EXPORT_C void wunsetenv (const wchar_t* name)
+	{
+	_wunsetenv_r (_REENT, name);
+	}
+
+/**
+A reentrant version of wunsetenv().
+*/
+EXPORT_C void _wunsetenv_r (struct _reent *r, const wchar_t* name)
+	{
+	MSystemInterface& sysIf=Interface(r);
+	sysIf.unsetenv(name);
+	}
+
+/**
+Adds or changes an environment variable.
+
+@return On Success, returns 0.
+		On Failure, returns -1, errno may be set and the environment shall be unchanged.
+*/
+EXPORT_C int setenv (const char *name, const char *value, int rewrite)
+	{
+	struct _reent *r = _REENT2;
+	if (!r)
+		return -1; // Memory for library globals is not allocated (errno not set).
+	return _setenv_r(r, name, value, rewrite);
+	}
+
+/**
+A reentrant version of setenv().
+*/
+EXPORT_C int _setenv_r (struct _reent *r, const char *name, const char *value, int rewrite)
+	{
+	int rval = 0;
+	wchar_t* wname = (wchar_t*)malloc(2*(strlen(name)+1));
+	wchar_t* wvalue = (wchar_t*)malloc(2*(strlen(value)+1));
+
+	if (wname && wvalue)	//the allocs were OK
+		{
+		if ((-1 != mbstowcs(wname, name, strlen(name)+1)) &&
+			(-1 != mbstowcs(wvalue, value, strlen(value)+1)))
+			{
+			MSystemInterface& sysIf=Interface(r);
+			rval = sysIf.setenv(wname, wvalue, rewrite, r->_errno);
+			}
+		else
+			rval =  MapError(EILSEQ, r->_errno);
+		}
+	else
+		rval =  MapError(ENOMEM, r->_errno);
+
+	free (wname);
+	free (wvalue);
+	return rval;
+	}
+
+/**
+A wide-character version of a setenv()
+*/
+EXPORT_C int wsetenv (const wchar_t *name, const wchar_t *value, int rewrite)
+	{
+	struct _reent *r = _REENT2;
+	if (!r)
+		return -1; // Memory for library globals is not allocated (errno not set).
+	return _wsetenv_r(r, name, value, rewrite);
+	}
+
+/**
+A reentrant version of wsetenv().
+*/
+EXPORT_C int _wsetenv_r (struct _reent *r, const wchar_t *name, const wchar_t *value, int rewrite)
+	{
+	MSystemInterface& sysIf=Interface(r);
+	return sysIf.setenv(name,value,rewrite,r->_errno);
+	}
+
+} // extern "C"