summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpputools/source/registercomponent/registercomponent.cxx15
-rw-r--r--pyuno/source/loader/pyuno_loader.cxx17
-rw-r--r--sal/inc/osl/process.h15
-rw-r--r--sal/osl/os2/process_impl.cxx92
-rw-r--r--sal/osl/unx/process_impl.cxx107
-rw-r--r--sal/osl/w32/process.cxx19
-rwxr-xr-xsal/util/sal.map7
7 files changed, 249 insertions, 23 deletions
diff --git a/cpputools/source/registercomponent/registercomponent.cxx b/cpputools/source/registercomponent/registercomponent.cxx
index 7cab63db0b60..23f83bf8ccdf 100644
--- a/cpputools/source/registercomponent/registercomponent.cxx
+++ b/cpputools/source/registercomponent/registercomponent.cxx
@@ -67,10 +67,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) {
@@ -314,14 +310,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 c0d0eecebbe3..73d6086c0119 100644
--- a/pyuno/source/loader/pyuno_loader.cxx
+++ b/pyuno/source/loader/pyuno_loader.cxx
@@ -124,8 +124,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 )
{
@@ -141,21 +140,19 @@ static void prependPythonPath( const OUString & pythonPathBootstrap )
}
OUString systemPath;
osl_getSystemPathFromFileURL( fileUrl.pData, &(systemPath.pData) );
- bufPYTHONPATH.append( rtl::OUStringToOString( systemPath.pData, osl_getThreadTextEncoding() ));
- bufPYTHONPATH.append( SAL_PATHSEPARATOR );
+ bufPYTHONPATH.append( systemPath );
+ bufPYTHONPATH.append( static_cast<sal_Unicode>(SAL_PATHSEPARATOR) );
if( nNew == -1 )
break;
nIndex = nNew + 1;
}
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 5e28012fd33c..6553046fb3af 100644
--- a/sal/osl/os2/process_impl.cxx
+++ b/sal/osl/os2/process_impl.cxx
@@ -279,6 +279,98 @@ oslProcessError SAL_CALL osl_getEnvironment(rtl_uString* pustrEnvVar, rtl_uStrin
}
/***************************************
+ 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)
+ {
+ //Can't determine if OS/2 EMX has a working setenv or not, so use putenv,
+ //feel free to use setenv here if its available and works
+ rtl_String * pBuffer = NULL;
+
+ 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 on success
+
+ if (putenv(rtl_string_getStr(pBuffer)) == 0)
+ result = osl_Process_E_None;
+ else
+ rtl_string_release(pBuffer);
+ }
+
+ 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)
+ {
+ //Can't determine if OS/2 EMX has a working unsetenv or not, so use putenv,
+ //feel free to use unsetenv here if its available and works
+ rtl_String * pBuffer = NULL;
+
+ 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 on success
+
+ if (putenv(rtl_string_getStr(pBuffer)) == 0)
+ result = osl_Process_E_None;
+ else
+ rtl_string_release(pBuffer);
+
+ rtl_string_release(pstr_env_var);
+ }
+
+ return (result);
+}
+
+/***************************************
osl_getProcessWorkingDir().
**************************************/
oslProcessError SAL_CALL osl_getProcessWorkingDir(rtl_uString **ppustrWorkingDir)
diff --git a/sal/osl/unx/process_impl.cxx b/sal/osl/unx/process_impl.cxx
index 3855d85f63f9..b9da304c895f 100644
--- a/sal/osl/unx/process_impl.cxx
+++ b/sal/osl/unx/process_impl.cxx
@@ -51,10 +51,11 @@
#define INCLUDED_STRING_H
#endif
#include "osl/diagnose.h"
-#include <osl/file.h>
+#include "osl/file.h"
#include "osl/module.h"
#include "osl/thread.h"
#include "rtl/ustring.hxx"
+#include "rtl/strbuf.h"
#include "file_path_helper.h"
@@ -321,6 +322,110 @@ oslProcessError SAL_CALL osl_getEnvironment(rtl_uString* pustrEnvVar, rtl_uStrin
}
/***************************************
+ 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 = NULL;
+
+ 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 on success
+
+ if (putenv(rtl_string_getStr(pBuffer)) == 0)
+ result = osl_Process_E_None;
+ else
+ rtl_string_release(pBuffer);
+#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 = NULL;
+
+ 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 on success
+
+ if (putenv(rtl_string_getStr(pBuffer)) == 0)
+ result = osl_Process_E_None;
+ else
+ rtl_string_release(pBuffer);
+#elif (defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
+ //MacOSX baseline is 10.4, which has an old-school void return
+ //for unsetenv.
+ //See: http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/10.4/man3/unsetenv.3.html?useVersion=10.4
+ unsetenv(rtl_string_getStr(pstr_env_var));
+ 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().
**************************************/
oslProcessError SAL_CALL osl_getProcessWorkingDir(rtl_uString **ppustrWorkingDir)
diff --git a/sal/osl/w32/process.cxx b/sal/osl/w32/process.cxx
index 1c178d990de7..6506b62dbd61 100644
--- a/sal/osl/w32/process.cxx
+++ b/sal/osl/w32/process.cxx
@@ -414,6 +414,25 @@ 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)
+{
+ LPCWSTR lpName = reinterpret_cast<LPCWSTR>(ustrVar->buffer);
+ LPCWSTR lpValue = reinterpret_cast<LPCWSTR>(ustrValue->buffer);
+ if (SetEnvironmentVariableW(lpName, lpValue))
+ 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.
+ LPCWSTR lpName = reinterpret_cast<LPCWSTR>(ustrVar->buffer);
+ if (SetEnvironmentVariableW(lpName, 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;