diff -r 000000000000 -r bde4ae8d615e os/ossrv/genericopenlibs/cstdlib/LSTDLIB/ENVCALLS.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/ossrv/genericopenlibs/cstdlib/LSTDLIB/ENVCALLS.CPP Fri Jun 15 03:10:57 2012 +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 +#include + + +#include + +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"