diff --git a/cpputools/source/registercomponent/registercomponent.cxx b/cpputools/source/registercomponent/registercomponent.cxx index 70e469ddba23..c487d95c59a5 100644 --- a/cpputools/source/registercomponent/registercomponent.cxx +++ b/cpputools/source/registercomponent/registercomponent.cxx @@ -66,10 +66,6 @@ using com::sun::star::container::XSet; using com::sun::star::container::XContentEnumerationAccess; using com::sun::star::container::XEnumeration; -#ifdef SAL_W32 -#define putenv _putenv -#endif - namespace { OUString replacePrefix(OUString const & url, OUString const & prefix) { @@ -313,14 +309,9 @@ sal_Bool parseOptions(int ac, char* av[], Options& rOptions, sal_Bool bCmdFile) i++; if( i < ac ) { - // leak this string as some platforms assume to own - // the pointer - sal_Char * p = (sal_Char *) rtl_allocateMemory( 13+ strlen( av[i] ) ); - p[0] = 0; - strcat( p, "CLASSPATH=" ); // #100211# - checked - strcat( p, av[i] ); // #100211# - checked - - putenv( p ); + rtl::OUString envVar(RTL_CONSTASCII_USTRINGPARAM("CLASSPATH")); + rtl::OUString envValue(av[i], strlen(av[i]), osl_getThreadTextEncoding()); + osl_setEnvironment(envVar.pData, envValue.pData); } break; } diff --git a/pyuno/source/loader/pyuno_loader.cxx b/pyuno/source/loader/pyuno_loader.cxx index 57e893744f5f..c624d330b4ec 100644 --- a/pyuno/source/loader/pyuno_loader.cxx +++ b/pyuno/source/loader/pyuno_loader.cxx @@ -123,8 +123,7 @@ static void setPythonHome ( const OUString & pythonHome ) static void prependPythonPath( const OUString & pythonPathBootstrap ) { - rtl::OStringBuffer bufPYTHONPATH( 256 ); - bufPYTHONPATH.append( "PYTHONPATH="); + rtl::OUStringBuffer bufPYTHONPATH( 256 ); sal_Int32 nIndex = 0; while( 1 ) { @@ -140,7 +139,7 @@ static void prependPythonPath( const OUString & pythonPathBootstrap ) } OUString systemPath; osl_getSystemPathFromFileURL( fileUrl.pData, &(systemPath.pData) ); - bufPYTHONPATH.append( rtl::OUStringToOString( systemPath.pData, osl_getThreadTextEncoding() )); + bufPYTHONPATH.append( systemPath ); bufPYTHONPATH.append( SAL_PATHSEPARATOR ); if( nNew == -1 ) break; @@ -148,13 +147,11 @@ static void prependPythonPath( const OUString & pythonPathBootstrap ) } const char * oldEnv = getenv( "PYTHONPATH"); if( oldEnv ) - bufPYTHONPATH.append( oldEnv ); - OString result = bufPYTHONPATH.makeStringAndClear(); - rtl_string_acquire( result.pData ); - -// printf( "Setting %s\n" , result.pData->buffer ); - putenv( result.pData->buffer ); + bufPYTHONPATH.append( rtl::OUString(oldEnv, strlen(oldEnv), osl_getThreadTextEncoding()) ); + rtl::OUString envVar(RTL_CONSTASCII_USTRINGPARAM("PYTHONPATH")); + rtl::OUString envValue(bufPYTHONPATH.makeStringAndClear()); + osl_setEnvironment(envVar.pData, envValue.pData); } Reference< XInterface > CreateInstance( const Reference< XComponentContext > & ctx ) diff --git a/sal/inc/osl/process.h b/sal/inc/osl/process.h index 73892bccebe0..0a0d3f6eaf7c 100644 --- a/sal/inc/osl/process.h +++ b/sal/inc/osl/process.h @@ -388,6 +388,21 @@ void SAL_CALL osl_setCommandArgs (int argc, char **argv); */ oslProcessError SAL_CALL osl_getEnvironment(rtl_uString *strVar, rtl_uString **strValue); +/** Set the value of one enviroment variable. + @param strVar [in] denotes the name of the variable to set. + @param strValue [in] string of the new value of environment variable. + + @since UDK 3.2.13 +*/ +oslProcessError SAL_CALL osl_setEnvironment(rtl_uString *strVar, rtl_uString *strValue); + +/** Unsets the value of one enviroment variable. + @param strVar [in] denotes the name of the variable to unset. + + @since UDK 3.2.13 +*/ +oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString *strVar); + /** Get the working directory of the current process as a file URL. The file URL is encoded as common for the OSL file API. diff --git a/sal/osl/os2/process_impl.cxx b/sal/osl/os2/process_impl.cxx index 27b12bbe0f6a..307f311e3730 100644 --- a/sal/osl/os2/process_impl.cxx +++ b/sal/osl/os2/process_impl.cxx @@ -281,6 +281,70 @@ oslProcessError SAL_CALL osl_getEnvironment(rtl_uString* pustrEnvVar, rtl_uStrin return (result); } +/*************************************** + osl_setEnvironment(). + **************************************/ +oslProcessError SAL_CALL osl_setEnvironment(rtl_uString* pustrEnvVar, rtl_uString* pustrValue) +{ + oslProcessError result = osl_Process_E_Unknown; + rtl_TextEncoding encoding = osl_getThreadTextEncoding(); + rtl_String* pstr_env_var = 0; + rtl_String* pstr_val = 0; + + OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter"); + OSL_PRECOND(pustrValue, "osl_setEnvironment(): Invalid parameter"); + + rtl_uString2String( + &pstr_env_var, + rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding, + OUSTRING_TO_OSTRING_CVTFLAGS); + + rtl_uString2String( + &pstr_val, + rtl_uString_getStr(pustrValue), rtl_uString_getLength(pustrValue), encoding, + OUSTRING_TO_OSTRING_CVTFLAGS); + + if (pstr_env_var != 0 && pstr_val != 0) + { + if (setenv(rtl_string_getStr(pstr_env_var), rtl_string_getStr(pstr_val), 1) == 0) + result = osl_Process_E_None; + } + + if (pstr_val != 0) + rtl_string_release(pstr_val); + + if (pstr_env_var != 0) + rtl_string_release(pstr_env_var); + + return (result); +} + +/*************************************** + osl_clearEnvironment(). + **************************************/ +oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString* pustrEnvVar) +{ + oslProcessError result = osl_Process_E_Unknown; + rtl_TextEncoding encoding = osl_getThreadTextEncoding(); + rtl_String* pstr_env_var = 0; + + OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter"); + + rtl_uString2String( + &pstr_env_var, + rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding, + OUSTRING_TO_OSTRING_CVTFLAGS); + + if (pstr_env_var) + { + if (unsetenv(rtl_string_getStr(pstr_env_var)) == 0) + result = osl_Process_E_None; + rtl_string_release(pstr_env_var); + } + + return (result); +} + /*************************************** osl_getProcessWorkingDir(). **************************************/ diff --git a/sal/osl/unx/process_impl.cxx b/sal/osl/unx/process_impl.cxx index e712b6748e7f..fb7eb3d9220d 100644 --- a/sal/osl/unx/process_impl.cxx +++ b/sal/osl/unx/process_impl.cxx @@ -50,10 +50,11 @@ #define INCLUDED_STRING_H #endif #include "osl/diagnose.h" -#include +#include "osl/file.h" #include "osl/module.h" #include "osl/thread.h" #include "rtl/ustring.hxx" +#include "rtl/strbuf.h" #ifndef _OSL_FILE_PATH_HELPER_H_ #include "file_path_helper.h" @@ -323,6 +324,100 @@ oslProcessError SAL_CALL osl_getEnvironment(rtl_uString* pustrEnvVar, rtl_uStrin return (result); } +/*************************************** + osl_setEnvironment(). + **************************************/ +oslProcessError SAL_CALL osl_setEnvironment(rtl_uString* pustrEnvVar, rtl_uString* pustrValue) +{ + oslProcessError result = osl_Process_E_Unknown; + rtl_TextEncoding encoding = osl_getThreadTextEncoding(); + rtl_String* pstr_env_var = 0; + rtl_String* pstr_val = 0; + + OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter"); + OSL_PRECOND(pustrValue, "osl_setEnvironment(): Invalid parameter"); + + rtl_uString2String( + &pstr_env_var, + rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding, + OUSTRING_TO_OSTRING_CVTFLAGS); + + rtl_uString2String( + &pstr_val, + rtl_uString_getStr(pustrValue), rtl_uString_getLength(pustrValue), encoding, + OUSTRING_TO_OSTRING_CVTFLAGS); + + if (pstr_env_var != 0 && pstr_val != 0) + { +#if defined (SOLARIS) + rtl_String * pBuffer; + + sal_Int32 nCapacity = rtl_stringbuffer_newFromStringBuffer( &pBuffer, + rtl_string_getLength(pstr_env_var) + rtl_string_getLength(pstr_val) + 1, + pstr_env_var ); + rtl_stringbuffer_insert( &pBuffer, &nCapacity, pBuffer->length, "=", 1); + rtl_stringbuffer_insert( &pBuffer, &nCapacity, pBuffer->length, + rtl_string_getStr(pstr_val), rtl_string_getLength(pstr_val) ); + + rtl_string_acquire(pBuffer); // argument to putenv must leak + + if (putenv(rtl_string_getStr(pBuffer)) == 0) + result = osl_Process_E_None; +#else + if (setenv(rtl_string_getStr(pstr_env_var), rtl_string_getStr(pstr_val), 1) == 0) + result = osl_Process_E_None; +#endif + } + + if (pstr_val) + rtl_string_release(pstr_val); + + if (pstr_env_var != 0) + rtl_string_release(pstr_env_var); + + return (result); +} + +/*************************************** + osl_clearEnvironment(). + **************************************/ +oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString* pustrEnvVar) +{ + oslProcessError result = osl_Process_E_Unknown; + rtl_TextEncoding encoding = osl_getThreadTextEncoding(); + rtl_String* pstr_env_var = 0; + + OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter"); + + rtl_uString2String( + &pstr_env_var, + rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding, + OUSTRING_TO_OSTRING_CVTFLAGS); + + if (pstr_env_var) + { +#if defined (SOLARIS) + rtl_String * pBuffer; + + sal_Int32 nCapacity = rtl_stringbuffer_newFromStringBuffer( &pBuffer, + rtl_string_getLength(pstr_env_var) + 1, pstr_env_var ); + rtl_stringbuffer_insert( &pBuffer, &nCapacity, pBuffer->length, "=", 1); + + rtl_string_acquire(pBuffer); // argument to putenv must leak + + if (putenv(rtl_string_getStr(pBuffer)) == 0) + result = osl_Process_E_None; +#else + if (unsetenv(rtl_string_getStr(pstr_env_var)) == 0) + result = osl_Process_E_None; +#endif + rtl_string_release(pstr_env_var); + } + + return (result); +} + + /*************************************** osl_getProcessWorkingDir(). **************************************/ diff --git a/sal/osl/w32/process.cxx b/sal/osl/w32/process.cxx index 96187be7e203..695c62db18bb 100644 --- a/sal/osl/w32/process.cxx +++ b/sal/osl/w32/process.cxx @@ -413,6 +413,22 @@ oslProcessError SAL_CALL osl_getEnvironment(rtl_uString *ustrVar, rtl_uString ** return osl_Process_E_Unknown; } +oslProcessError SAL_CALL osl_setEnvironment(rtl_uString *ustrVar, rtl_uString *ustrValue) +{ + if (SetEnvironmentVariableW(ustrVar->buffer, ustrValue->buffer)) + return osl_Process_E_None; + return osl_Process_E_Unknown; +} + +oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString *ustrVar) +{ + //If the second parameter is NULL, the variable is deleted from the current + //process's environment. + if (SetEnvironmentVariableW(ustrVar->buffer, NULL)) + return osl_Process_E_None; + return osl_Process_E_Unknown; +} + /*************************************************************************** * Current Working Directory. ***************************************************************************/ diff --git a/sal/util/sal.map b/sal/util/sal.map index d5faa563ae3f..8b1c079ec899 100755 --- a/sal/util/sal.map +++ b/sal/util/sal.map @@ -597,6 +597,13 @@ UDK_3.10 { # OOo 3.2 rtl_math_acosh; } UDK_3.9; + +UDK_3.11 { # OOo 3.4 + global: + osl_setEnvironment; + osl_clearEnvironment; +} UDK_3.10; + PRIVATE_1.0 { global: osl_detail_ObjectRegistry_storeAddresses;