xref: /aoo41x/main/sal/osl/os2/process_impl.cxx (revision dcc6e752)
187d2adbcSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
387d2adbcSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
487d2adbcSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
587d2adbcSAndrew Rist  * distributed with this work for additional information
687d2adbcSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
787d2adbcSAndrew Rist  * to you under the Apache License, Version 2.0 (the
887d2adbcSAndrew Rist  * "License"); you may not use this file except in compliance
987d2adbcSAndrew Rist  * with the License.  You may obtain a copy of the License at
1087d2adbcSAndrew Rist  *
1187d2adbcSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
1287d2adbcSAndrew Rist  *
1387d2adbcSAndrew Rist  * Unless required by applicable law or agreed to in writing,
1487d2adbcSAndrew Rist  * software distributed under the License is distributed on an
1587d2adbcSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1687d2adbcSAndrew Rist  * KIND, either express or implied.  See the License for the
1787d2adbcSAndrew Rist  * specific language governing permissions and limitations
1887d2adbcSAndrew Rist  * under the License.
1987d2adbcSAndrew Rist  *
2087d2adbcSAndrew Rist  *************************************************************/
2187d2adbcSAndrew Rist 
2287d2adbcSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir 
25cdf0e10cSrcweir #define INCL_DOS
26cdf0e10cSrcweir #include <os2.h>
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include "osl/process.h"
29cdf0e10cSrcweir #include <osl/mutex.h>
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #ifndef INCLUDED_LIMITS_H
32cdf0e10cSrcweir #include <limits.h>
33cdf0e10cSrcweir #define INCLUDED_LIMITS_H
34cdf0e10cSrcweir #endif
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #ifndef INCLUDED_PTHREAD_H
37cdf0e10cSrcweir #include <pthread.h>
38cdf0e10cSrcweir #define INCLUDED_PTHREAD_H
39cdf0e10cSrcweir #endif
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #ifndef INCLUDED_STDLIB_H
42cdf0e10cSrcweir #include <stdlib.h>
43cdf0e10cSrcweir #define INCLUDED_STDLIB_H
44cdf0e10cSrcweir #endif
45cdf0e10cSrcweir 
46cdf0e10cSrcweir #ifndef INCLUDED_STRING_H
47cdf0e10cSrcweir #include <string.h>
48cdf0e10cSrcweir #define INCLUDED_STRING_H
49cdf0e10cSrcweir #endif
50cdf0e10cSrcweir #include "osl/diagnose.h"
51cdf0e10cSrcweir #include <osl/file.h>
52cdf0e10cSrcweir #include "osl/module.h"
53cdf0e10cSrcweir #include "osl/thread.h"
54cdf0e10cSrcweir #include "rtl/ustring.hxx"
55cdf0e10cSrcweir 
56cdf0e10cSrcweir #ifndef _OSL_FILE_PATH_HELPER_H_
57cdf0e10cSrcweir #include "file_path_helper.h"
58cdf0e10cSrcweir #endif
59cdf0e10cSrcweir 
60cdf0e10cSrcweir #ifndef _OSL_UUNXAPI_H_
61cdf0e10cSrcweir #include "uunxapi.h"
62cdf0e10cSrcweir #endif
63cdf0e10cSrcweir 
64cdf0e10cSrcweir /***************************************
65cdf0e10cSrcweir   osl_bootstrap_getExecutableFile_Impl().
66cdf0e10cSrcweir 
67cdf0e10cSrcweir   @internal
68cdf0e10cSrcweir   @see rtl_bootstrap
69cdf0e10cSrcweir   @see #i37371#
70cdf0e10cSrcweir 
71cdf0e10cSrcweir  **************************************/
72cdf0e10cSrcweir 
73cdf0e10cSrcweir extern "C" oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl (
74cdf0e10cSrcweir 	rtl_uString ** ppFileURL
75cdf0e10cSrcweir ) SAL_THROW_EXTERN_C();
76cdf0e10cSrcweir 
77cdf0e10cSrcweir 
osl_bootstrap_getExecutableFile_Impl(rtl_uString ** ppFileURL)78cdf0e10cSrcweir oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl (
79cdf0e10cSrcweir 	rtl_uString ** ppFileURL
80cdf0e10cSrcweir ) SAL_THROW_EXTERN_C()
81cdf0e10cSrcweir {
82cdf0e10cSrcweir     oslProcessError result = osl_Process_E_NotFound;
83cdf0e10cSrcweir     CHAR    szName[CCHMAXPATH];
84cdf0e10cSrcweir 	PPIB    ppib;
85cdf0e10cSrcweir 	PTIB    ptib;
86cdf0e10cSrcweir 	APIRET	rc;
87cdf0e10cSrcweir 
88cdf0e10cSrcweir 	rc = DosGetInfoBlocks(&ptib, &ppib);
89cdf0e10cSrcweir 	rc = DosQueryModuleName(ppib->pib_hmte, sizeof(szName), szName);
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 	if (rc == 0)
92cdf0e10cSrcweir 	{
93cdf0e10cSrcweir 		rtl_uString * pAbsPath = 0;
94cdf0e10cSrcweir 
95cdf0e10cSrcweir         rtl_string2UString(
96cdf0e10cSrcweir 			&pAbsPath,
97cdf0e10cSrcweir 			szName, strlen(szName), osl_getThreadTextEncoding(),
98cdf0e10cSrcweir 			OSTRING_TO_OUSTRING_CVTFLAGS);
99cdf0e10cSrcweir 
100cdf0e10cSrcweir 		if (pAbsPath)
101cdf0e10cSrcweir 		{
102cdf0e10cSrcweir 			/* Convert from path to url. */
103cdf0e10cSrcweir 			if (osl_getFileURLFromSystemPath (pAbsPath, ppFileURL) == osl_File_E_None)
104cdf0e10cSrcweir 			{
105cdf0e10cSrcweir 				/* Success. */
106cdf0e10cSrcweir 				result = osl_Process_E_None;
107cdf0e10cSrcweir 			}
108cdf0e10cSrcweir 			rtl_uString_release (pAbsPath);
109cdf0e10cSrcweir 		}
110cdf0e10cSrcweir 	}
111cdf0e10cSrcweir 
112cdf0e10cSrcweir 	return (result);
113cdf0e10cSrcweir }
114cdf0e10cSrcweir 
115cdf0e10cSrcweir /***************************************
116cdf0e10cSrcweir  CommandArgs_Impl.
117cdf0e10cSrcweir  **************************************/
118cdf0e10cSrcweir struct CommandArgs_Impl
119cdf0e10cSrcweir {
120cdf0e10cSrcweir 	oslMutex		m_mutex;
121cdf0e10cSrcweir 	sal_uInt32      m_nCount;
122cdf0e10cSrcweir 	rtl_uString **  m_ppArgs;
123cdf0e10cSrcweir };
124cdf0e10cSrcweir 
125cdf0e10cSrcweir static struct CommandArgs_Impl g_command_args =
126cdf0e10cSrcweir {
127cdf0e10cSrcweir 	osl_createMutex(),
128cdf0e10cSrcweir 	0,
129cdf0e10cSrcweir 	0
130cdf0e10cSrcweir };
131cdf0e10cSrcweir 
132cdf0e10cSrcweir /***************************************
133cdf0e10cSrcweir   osl_getExecutableFile().
134cdf0e10cSrcweir  **************************************/
osl_getExecutableFile(rtl_uString ** ppustrFile)135cdf0e10cSrcweir oslProcessError SAL_CALL osl_getExecutableFile (rtl_uString ** ppustrFile)
136cdf0e10cSrcweir {
137cdf0e10cSrcweir 	oslProcessError result = osl_Process_E_NotFound;
138cdf0e10cSrcweir 
139cdf0e10cSrcweir 	osl_acquireMutex(g_command_args.m_mutex);
140cdf0e10cSrcweir     OSL_ASSERT(g_command_args.m_nCount > 0);
141cdf0e10cSrcweir 	if (g_command_args.m_nCount > 0)
142cdf0e10cSrcweir 	{
143cdf0e10cSrcweir 		/* CommandArgs set. Obtain argv[0]. */
144cdf0e10cSrcweir 		rtl_uString_assign (ppustrFile, g_command_args.m_ppArgs[0]);
145cdf0e10cSrcweir 		result = osl_Process_E_None;
146cdf0e10cSrcweir 	}
147cdf0e10cSrcweir 	osl_releaseMutex(g_command_args.m_mutex);
148cdf0e10cSrcweir 
149cdf0e10cSrcweir 	return (result);
150cdf0e10cSrcweir }
151cdf0e10cSrcweir 
152cdf0e10cSrcweir /***************************************
153cdf0e10cSrcweir  osl_getCommandArgCount().
154cdf0e10cSrcweir  **************************************/
osl_getCommandArgCount(void)155cdf0e10cSrcweir sal_uInt32 SAL_CALL osl_getCommandArgCount (void)
156cdf0e10cSrcweir {
157cdf0e10cSrcweir 	sal_uInt32 result = 0;
158cdf0e10cSrcweir 
159cdf0e10cSrcweir 	osl_acquireMutex(g_command_args.m_mutex);
160cdf0e10cSrcweir     OSL_ASSERT(g_command_args.m_nCount > 0);
161cdf0e10cSrcweir 	if (g_command_args.m_nCount > 0)
162cdf0e10cSrcweir 		result = g_command_args.m_nCount - 1;
163cdf0e10cSrcweir 	osl_releaseMutex(g_command_args.m_mutex);
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 	return (result);
166cdf0e10cSrcweir }
167cdf0e10cSrcweir 
168cdf0e10cSrcweir /***************************************
169cdf0e10cSrcweir  osl_getCommandArg().
170cdf0e10cSrcweir  **************************************/
osl_getCommandArg(sal_uInt32 nArg,rtl_uString ** strCommandArg)171cdf0e10cSrcweir oslProcessError SAL_CALL osl_getCommandArg (sal_uInt32 nArg, rtl_uString ** strCommandArg)
172cdf0e10cSrcweir {
173cdf0e10cSrcweir 	oslProcessError result = osl_Process_E_NotFound;
174cdf0e10cSrcweir 
175cdf0e10cSrcweir 	osl_acquireMutex(g_command_args.m_mutex);
176cdf0e10cSrcweir     OSL_ASSERT(g_command_args.m_nCount > 0);
177cdf0e10cSrcweir 	if (g_command_args.m_nCount > (nArg + 1))
178cdf0e10cSrcweir 	{
179cdf0e10cSrcweir 		rtl_uString_assign (strCommandArg, g_command_args.m_ppArgs[nArg + 1]);
180cdf0e10cSrcweir 		result = osl_Process_E_None;
181cdf0e10cSrcweir 	}
182cdf0e10cSrcweir 	osl_releaseMutex(g_command_args.m_mutex);
183cdf0e10cSrcweir 
184cdf0e10cSrcweir 	return (result);
185cdf0e10cSrcweir }
186cdf0e10cSrcweir 
187cdf0e10cSrcweir /***************************************
188cdf0e10cSrcweir  osl_setCommandArgs().
189cdf0e10cSrcweir  **************************************/
osl_setCommandArgs(int argc,char ** argv)190cdf0e10cSrcweir void SAL_CALL osl_setCommandArgs (int argc, char ** argv)
191cdf0e10cSrcweir {
192cdf0e10cSrcweir     OSL_ASSERT(argc > 0);
193cdf0e10cSrcweir 	osl_acquireMutex(g_command_args.m_mutex);
194cdf0e10cSrcweir 	OSL_ENSURE (g_command_args.m_nCount == 0, "osl_setCommandArgs(): CommandArgs already set.");
195cdf0e10cSrcweir 	if (g_command_args.m_nCount == 0)
196cdf0e10cSrcweir 	{
197cdf0e10cSrcweir 		rtl_uString** ppArgs = (rtl_uString**)rtl_allocateZeroMemory (argc * sizeof(rtl_uString*));
198cdf0e10cSrcweir 		if (ppArgs != 0)
199cdf0e10cSrcweir 		{
200cdf0e10cSrcweir 			rtl_TextEncoding encoding = osl_getThreadTextEncoding();
201cdf0e10cSrcweir 			for (int i = 0; i < argc; i++)
202cdf0e10cSrcweir 			{
203cdf0e10cSrcweir 				rtl_string2UString (
204cdf0e10cSrcweir 					&(ppArgs[i]),
205cdf0e10cSrcweir 					argv[i], rtl_str_getLength (argv[i]), encoding,
206cdf0e10cSrcweir 					OSTRING_TO_OUSTRING_CVTFLAGS);
207cdf0e10cSrcweir 			}
208cdf0e10cSrcweir 			if (ppArgs[0] != 0)
209cdf0e10cSrcweir 			{
210cdf0e10cSrcweir 				/* see @ osl_getExecutableFile(). */
211cdf0e10cSrcweir 				if (rtl_ustr_indexOfChar (rtl_uString_getStr(ppArgs[0]), sal_Unicode('/')) == -1)
212cdf0e10cSrcweir 				{
213cdf0e10cSrcweir 					const rtl::OUString PATH (RTL_CONSTASCII_USTRINGPARAM("PATH"));
214cdf0e10cSrcweir 
215cdf0e10cSrcweir 					rtl_uString * pSearchPath = 0;
216cdf0e10cSrcweir 					osl_getEnvironment (PATH.pData, &pSearchPath);
217cdf0e10cSrcweir 					if (pSearchPath)
218cdf0e10cSrcweir 					{
219cdf0e10cSrcweir 						rtl_uString * pSearchResult = 0;
220cdf0e10cSrcweir 						osl_searchPath (ppArgs[0], pSearchPath, &pSearchResult);
221cdf0e10cSrcweir 						if (pSearchResult)
222cdf0e10cSrcweir 						{
223cdf0e10cSrcweir 							rtl_uString_assign (&(ppArgs[0]), pSearchResult);
224cdf0e10cSrcweir 							rtl_uString_release (pSearchResult);
225cdf0e10cSrcweir 						}
226cdf0e10cSrcweir 						rtl_uString_release (pSearchPath);
227cdf0e10cSrcweir 					}
228cdf0e10cSrcweir 				}
229cdf0e10cSrcweir 
230cdf0e10cSrcweir 				rtl_uString * pArg0 = 0;
231cdf0e10cSrcweir 				if (realpath_u (ppArgs[0], &pArg0))
232cdf0e10cSrcweir 				{
233cdf0e10cSrcweir 					osl_getFileURLFromSystemPath (pArg0, &(ppArgs[0]));
234cdf0e10cSrcweir 					rtl_uString_release (pArg0);
235cdf0e10cSrcweir 				}
236cdf0e10cSrcweir 			}
237cdf0e10cSrcweir 			g_command_args.m_nCount = argc;
238cdf0e10cSrcweir 			g_command_args.m_ppArgs = ppArgs;
239cdf0e10cSrcweir 		}
240cdf0e10cSrcweir 	}
241cdf0e10cSrcweir 	osl_releaseMutex(g_command_args.m_mutex);
242cdf0e10cSrcweir 
243cdf0e10cSrcweir }
244cdf0e10cSrcweir 
245cdf0e10cSrcweir /***************************************
246cdf0e10cSrcweir  osl_getEnvironment().
247cdf0e10cSrcweir  **************************************/
osl_getEnvironment(rtl_uString * pustrEnvVar,rtl_uString ** ppustrValue)248cdf0e10cSrcweir oslProcessError SAL_CALL osl_getEnvironment(rtl_uString* pustrEnvVar, rtl_uString** ppustrValue)
249cdf0e10cSrcweir {
250cdf0e10cSrcweir 	oslProcessError  result   = osl_Process_E_NotFound;
251cdf0e10cSrcweir 	rtl_TextEncoding encoding = osl_getThreadTextEncoding();
252cdf0e10cSrcweir 	rtl_String* pstr_env_var  = 0;
253cdf0e10cSrcweir 
254cdf0e10cSrcweir 	OSL_PRECOND(pustrEnvVar, "osl_getEnvironment(): Invalid parameter");
255cdf0e10cSrcweir 	OSL_PRECOND(ppustrValue, "osl_getEnvironment(): Invalid parameter");
256cdf0e10cSrcweir 
257cdf0e10cSrcweir 	rtl_uString2String(
258cdf0e10cSrcweir 		&pstr_env_var,
259cdf0e10cSrcweir 		rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding,
260cdf0e10cSrcweir 		OUSTRING_TO_OSTRING_CVTFLAGS);
261cdf0e10cSrcweir 	if (pstr_env_var != 0)
262cdf0e10cSrcweir 	{
263cdf0e10cSrcweir 		const char* p_env_var = getenv (rtl_string_getStr (pstr_env_var));
264cdf0e10cSrcweir 		if (p_env_var != 0)
265cdf0e10cSrcweir 		{
266cdf0e10cSrcweir 			rtl_string2UString(
267cdf0e10cSrcweir 				ppustrValue,
268cdf0e10cSrcweir 				p_env_var, strlen(p_env_var), encoding,
269cdf0e10cSrcweir 				OSTRING_TO_OUSTRING_CVTFLAGS);
270cdf0e10cSrcweir 			OSL_ASSERT(*ppustrValue != NULL);
271cdf0e10cSrcweir 
272cdf0e10cSrcweir 			result = osl_Process_E_None;
273cdf0e10cSrcweir 		}
274cdf0e10cSrcweir 		rtl_string_release(pstr_env_var);
275cdf0e10cSrcweir 	}
276cdf0e10cSrcweir 
277cdf0e10cSrcweir 	return (result);
278cdf0e10cSrcweir }
279cdf0e10cSrcweir 
280cdf0e10cSrcweir /***************************************
281cdf0e10cSrcweir  osl_setEnvironment().
282cdf0e10cSrcweir  **************************************/
osl_setEnvironment(rtl_uString * pustrEnvVar,rtl_uString * pustrValue)283cdf0e10cSrcweir oslProcessError SAL_CALL osl_setEnvironment(rtl_uString* pustrEnvVar, rtl_uString* pustrValue)
284cdf0e10cSrcweir {
285cdf0e10cSrcweir 	oslProcessError  result   = osl_Process_E_Unknown;
286cdf0e10cSrcweir 	rtl_TextEncoding encoding = osl_getThreadTextEncoding();
287cdf0e10cSrcweir 	rtl_String* pstr_env_var  = 0;
288cdf0e10cSrcweir 	rtl_String* pstr_val  = 0;
289cdf0e10cSrcweir 
290cdf0e10cSrcweir 	OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter");
291cdf0e10cSrcweir 	OSL_PRECOND(pustrValue, "osl_setEnvironment(): Invalid parameter");
292cdf0e10cSrcweir 
293cdf0e10cSrcweir 	rtl_uString2String(
294cdf0e10cSrcweir 		&pstr_env_var,
295cdf0e10cSrcweir 		rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding,
296cdf0e10cSrcweir 		OUSTRING_TO_OSTRING_CVTFLAGS);
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 	rtl_uString2String(
299cdf0e10cSrcweir 		&pstr_val,
300cdf0e10cSrcweir 		rtl_uString_getStr(pustrValue), rtl_uString_getLength(pustrValue), encoding,
301cdf0e10cSrcweir 		OUSTRING_TO_OSTRING_CVTFLAGS);
302cdf0e10cSrcweir 
303cdf0e10cSrcweir 	if (pstr_env_var != 0 && pstr_val != 0)
304cdf0e10cSrcweir 	{
305*dcc6e752SPedro Giffuni 		if (setenv(rtl_string_getStr(pstr_env_var), rtl_string_getStr(pstr_val), 1) == 0)
306cdf0e10cSrcweir 			result = osl_Process_E_None;
307cdf0e10cSrcweir 	}
308cdf0e10cSrcweir 
309cdf0e10cSrcweir 	if (pstr_val)
310cdf0e10cSrcweir 		rtl_string_release(pstr_val);
311cdf0e10cSrcweir 
312cdf0e10cSrcweir 	if (pstr_env_var != 0)
313cdf0e10cSrcweir 		rtl_string_release(pstr_env_var);
314cdf0e10cSrcweir 
315cdf0e10cSrcweir 	return (result);
316cdf0e10cSrcweir }
317cdf0e10cSrcweir 
318cdf0e10cSrcweir /***************************************
319cdf0e10cSrcweir  osl_clearEnvironment().
320cdf0e10cSrcweir  **************************************/
osl_clearEnvironment(rtl_uString * pustrEnvVar)321cdf0e10cSrcweir oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString* pustrEnvVar)
322cdf0e10cSrcweir {
323cdf0e10cSrcweir 	oslProcessError  result   = osl_Process_E_Unknown;
324cdf0e10cSrcweir 	rtl_TextEncoding encoding = osl_getThreadTextEncoding();
325cdf0e10cSrcweir 	rtl_String* pstr_env_var  = 0;
326cdf0e10cSrcweir 
327cdf0e10cSrcweir 	OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter");
328cdf0e10cSrcweir 
329cdf0e10cSrcweir 	rtl_uString2String(
330cdf0e10cSrcweir 		&pstr_env_var,
331cdf0e10cSrcweir 		rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding,
332cdf0e10cSrcweir 		OUSTRING_TO_OSTRING_CVTFLAGS);
333cdf0e10cSrcweir 
334cdf0e10cSrcweir 	if (pstr_env_var)
335cdf0e10cSrcweir 	{
336*dcc6e752SPedro Giffuni 		if (unsetenv(rtl_string_getStr(pstr_env_var)) == 0)
337cdf0e10cSrcweir 			result = osl_Process_E_None;
338cdf0e10cSrcweir 		rtl_string_release(pstr_env_var);
339cdf0e10cSrcweir 	}
340cdf0e10cSrcweir 
341cdf0e10cSrcweir 	return (result);
342cdf0e10cSrcweir }
343cdf0e10cSrcweir 
344cdf0e10cSrcweir /***************************************
345cdf0e10cSrcweir  osl_getProcessWorkingDir().
346cdf0e10cSrcweir  **************************************/
osl_getProcessWorkingDir(rtl_uString ** ppustrWorkingDir)347cdf0e10cSrcweir oslProcessError SAL_CALL osl_getProcessWorkingDir(rtl_uString **ppustrWorkingDir)
348cdf0e10cSrcweir {
349cdf0e10cSrcweir     oslProcessError result = osl_Process_E_Unknown;
350cdf0e10cSrcweir 	char buffer[PATH_MAX];
351cdf0e10cSrcweir 
352cdf0e10cSrcweir 	OSL_PRECOND(ppustrWorkingDir, "osl_getProcessWorkingDir(): Invalid parameter");
353cdf0e10cSrcweir 
354cdf0e10cSrcweir     if (getcwd (buffer, sizeof(buffer)) != 0)
355cdf0e10cSrcweir     {
356cdf0e10cSrcweir         rtl_uString* ustrTmp = 0;
357cdf0e10cSrcweir 
358cdf0e10cSrcweir         rtl_string2UString(
359cdf0e10cSrcweir 			&ustrTmp,
360cdf0e10cSrcweir 			buffer, strlen(buffer), osl_getThreadTextEncoding(),
361cdf0e10cSrcweir 			OSTRING_TO_OUSTRING_CVTFLAGS);
362cdf0e10cSrcweir         if (ustrTmp != 0)
363cdf0e10cSrcweir         {
364cdf0e10cSrcweir 			if (osl_getFileURLFromSystemPath (ustrTmp, ppustrWorkingDir) == osl_File_E_None)
365cdf0e10cSrcweir 				result = osl_Process_E_None;
366cdf0e10cSrcweir 			rtl_uString_release (ustrTmp);
367cdf0e10cSrcweir 		}
368cdf0e10cSrcweir 	}
369cdf0e10cSrcweir 
370cdf0e10cSrcweir     return (result);
371cdf0e10cSrcweir }
372cdf0e10cSrcweir 
373cdf0e10cSrcweir /******************************************************************************
374cdf0e10cSrcweir  *
375cdf0e10cSrcweir  *              new functions to set/return the current process locale
376cdf0e10cSrcweir  *
377cdf0e10cSrcweir  *****************************************************************************/
378cdf0e10cSrcweir 
379cdf0e10cSrcweir struct ProcessLocale_Impl
380cdf0e10cSrcweir {
381cdf0e10cSrcweir 	oslMutex		m_mutex;
382cdf0e10cSrcweir 	rtl_Locale *    m_pLocale;
383cdf0e10cSrcweir };
384cdf0e10cSrcweir 
385cdf0e10cSrcweir static struct ProcessLocale_Impl g_process_locale =
386cdf0e10cSrcweir {
387cdf0e10cSrcweir 	osl_createMutex(),
388cdf0e10cSrcweir 	0
389cdf0e10cSrcweir };
390cdf0e10cSrcweir 
391cdf0e10cSrcweir extern "C" void _imp_getProcessLocale( rtl_Locale ** );
392cdf0e10cSrcweir extern "C" int  _imp_setProcessLocale( rtl_Locale * );
393cdf0e10cSrcweir 
394cdf0e10cSrcweir /**********************************************
395cdf0e10cSrcweir  osl_getProcessLocale().
396cdf0e10cSrcweir  *********************************************/
osl_getProcessLocale(rtl_Locale ** ppLocale)397cdf0e10cSrcweir oslProcessError SAL_CALL osl_getProcessLocale( rtl_Locale ** ppLocale )
398cdf0e10cSrcweir {
399cdf0e10cSrcweir     OSL_PRECOND(ppLocale, "osl_getProcessLocale(): Invalid parameter.");
400cdf0e10cSrcweir 
401cdf0e10cSrcweir     osl_acquireMutex(g_process_locale.m_mutex);
402cdf0e10cSrcweir 
403cdf0e10cSrcweir     if (g_process_locale.m_pLocale == 0)
404cdf0e10cSrcweir         _imp_getProcessLocale (&(g_process_locale.m_pLocale));
405cdf0e10cSrcweir     *ppLocale = g_process_locale.m_pLocale;
406cdf0e10cSrcweir 
407cdf0e10cSrcweir     osl_releaseMutex(g_process_locale.m_mutex);
408cdf0e10cSrcweir 
409cdf0e10cSrcweir     return (osl_Process_E_None);
410cdf0e10cSrcweir }
411cdf0e10cSrcweir 
412cdf0e10cSrcweir /**********************************************
413cdf0e10cSrcweir  osl_setProcessLocale().
414cdf0e10cSrcweir  *********************************************/
osl_setProcessLocale(rtl_Locale * pLocale)415cdf0e10cSrcweir oslProcessError SAL_CALL osl_setProcessLocale( rtl_Locale * pLocale )
416cdf0e10cSrcweir {
417cdf0e10cSrcweir     oslProcessError result = osl_Process_E_Unknown;
418cdf0e10cSrcweir 
419cdf0e10cSrcweir     OSL_PRECOND(pLocale, "osl_setProcessLocale(): Invalid parameter.");
420cdf0e10cSrcweir 
421cdf0e10cSrcweir     osl_acquireMutex(g_process_locale.m_mutex);
422cdf0e10cSrcweir     if (_imp_setProcessLocale (pLocale) == 0)
423cdf0e10cSrcweir     {
424cdf0e10cSrcweir         g_process_locale.m_pLocale = pLocale;
425cdf0e10cSrcweir         result = osl_Process_E_None;
426cdf0e10cSrcweir     }
427cdf0e10cSrcweir     osl_releaseMutex(g_process_locale.m_mutex);
428cdf0e10cSrcweir 
429cdf0e10cSrcweir     return (result);
430cdf0e10cSrcweir }
431cdf0e10cSrcweir 
432