xref: /aoo41x/main/sal/osl/w32/process.cxx (revision 1ad19ac0)
187d2adbcSAndrew Rist /**************************************************************
287d2adbcSAndrew Rist  *
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 #define UNICODE
25cdf0e10cSrcweir #include "system.h"
26cdf0e10cSrcweir #ifdef _MSC_VER
27cdf0e10cSrcweir #pragma warning(push,1) /* disable warnings within system headers */
28cdf0e10cSrcweir #endif
29cdf0e10cSrcweir #include <shellapi.h>
30cdf0e10cSrcweir #ifdef _MSC_VER
31cdf0e10cSrcweir #pragma warning(pop)
32cdf0e10cSrcweir #endif
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <osl/diagnose.h>
35cdf0e10cSrcweir #include <osl/security.h>
36cdf0e10cSrcweir #include <osl/nlsupport.h>
37cdf0e10cSrcweir #include <osl/mutex.h>
38cdf0e10cSrcweir #include <osl/thread.h>
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #include "procimpl.h"
41cdf0e10cSrcweir #include "sockimpl.h"
42cdf0e10cSrcweir #include "file_url.h"
43cdf0e10cSrcweir #include "path_helper.hxx"
44cdf0e10cSrcweir #include <rtl/ustrbuf.h>
45cdf0e10cSrcweir #include <rtl/alloc.h>
46cdf0e10cSrcweir 
47cdf0e10cSrcweir /***************************************************************************
48cdf0e10cSrcweir  * Process.
49cdf0e10cSrcweir  ***************************************************************************/
50cdf0e10cSrcweir 
osl_terminateProcess(oslProcess Process)51cdf0e10cSrcweir oslProcessError SAL_CALL osl_terminateProcess(oslProcess Process)
52cdf0e10cSrcweir {
53cdf0e10cSrcweir 	if (Process == NULL)
54cdf0e10cSrcweir 		return osl_Process_E_Unknown;
55cdf0e10cSrcweir 
56cdf0e10cSrcweir 	if (TerminateProcess(((oslProcessImpl*)Process)->m_hProcess, 0))
57cdf0e10cSrcweir 		return osl_Process_E_None;
58cdf0e10cSrcweir 
59cdf0e10cSrcweir 
60cdf0e10cSrcweir 	return osl_Process_E_Unknown;
61cdf0e10cSrcweir }
62cdf0e10cSrcweir 
63cdf0e10cSrcweir /***************************************************************************/
64cdf0e10cSrcweir 
osl_getProcess(oslProcessIdentifier Ident)65cdf0e10cSrcweir oslProcess SAL_CALL osl_getProcess(oslProcessIdentifier Ident)
66cdf0e10cSrcweir {
67cdf0e10cSrcweir 	oslProcessImpl* pProcImpl;
68cdf0e10cSrcweir     HANDLE hProcess = OpenProcess(
69cdf0e10cSrcweir         STANDARD_RIGHTS_REQUIRED | PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, (DWORD)Ident);
70cdf0e10cSrcweir 
71cdf0e10cSrcweir 	if (hProcess)
72cdf0e10cSrcweir 	{
73cdf0e10cSrcweir 		pProcImpl = reinterpret_cast< oslProcessImpl*>( rtl_allocateMemory(sizeof(oslProcessImpl)) );
74cdf0e10cSrcweir 		pProcImpl->m_hProcess  = hProcess;
75cdf0e10cSrcweir 		pProcImpl->m_IdProcess = Ident;
76cdf0e10cSrcweir 	}
77cdf0e10cSrcweir 	else
78cdf0e10cSrcweir 		pProcImpl = NULL;
79cdf0e10cSrcweir 
80cdf0e10cSrcweir 	return (pProcImpl);
81cdf0e10cSrcweir }
82cdf0e10cSrcweir 
83cdf0e10cSrcweir /***************************************************************************/
84cdf0e10cSrcweir 
osl_freeProcessHandle(oslProcess Process)85cdf0e10cSrcweir void SAL_CALL osl_freeProcessHandle(oslProcess Process)
86cdf0e10cSrcweir {
87cdf0e10cSrcweir 	if (Process != NULL)
88cdf0e10cSrcweir 	{
89cdf0e10cSrcweir 		CloseHandle(((oslProcessImpl*)Process)->m_hProcess);
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 		rtl_freeMemory((oslProcessImpl*)Process);
92cdf0e10cSrcweir 	}
93cdf0e10cSrcweir }
94cdf0e10cSrcweir 
95cdf0e10cSrcweir /***************************************************************************/
96cdf0e10cSrcweir 
osl_getProcessInfo(oslProcess Process,oslProcessData Fields,oslProcessInfo * pInfo)97cdf0e10cSrcweir oslProcessError SAL_CALL osl_getProcessInfo(oslProcess Process, oslProcessData Fields,
98cdf0e10cSrcweir 								   oslProcessInfo* pInfo)
99cdf0e10cSrcweir {
100cdf0e10cSrcweir 	HANDLE hProcess;
101cdf0e10cSrcweir 	DWORD  IdProcess;
102cdf0e10cSrcweir 
103cdf0e10cSrcweir 	if (Process == NULL)
104cdf0e10cSrcweir 	{
105cdf0e10cSrcweir 		hProcess  = GetCurrentProcess();
106cdf0e10cSrcweir 		IdProcess = GetCurrentProcessId();
107cdf0e10cSrcweir 	}
108cdf0e10cSrcweir 	else
109cdf0e10cSrcweir 	{
110cdf0e10cSrcweir 		hProcess  = ((oslProcessImpl*)Process)->m_hProcess;
111cdf0e10cSrcweir 		IdProcess = ((oslProcessImpl*)Process)->m_IdProcess;
112cdf0e10cSrcweir 	}
113cdf0e10cSrcweir 
114cdf0e10cSrcweir 	if (! pInfo || (pInfo->Size != sizeof(oslProcessInfo)))
115cdf0e10cSrcweir 		return osl_Process_E_Unknown;
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 	pInfo->Fields = 0;
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 	if (Fields & osl_Process_IDENTIFIER)
120cdf0e10cSrcweir 	{
121cdf0e10cSrcweir 		pInfo->Ident  = IdProcess;
122cdf0e10cSrcweir 		pInfo->Fields |= osl_Process_IDENTIFIER;
123cdf0e10cSrcweir 	}
124cdf0e10cSrcweir 
125cdf0e10cSrcweir 	if (Fields & osl_Process_EXITCODE)
126cdf0e10cSrcweir 	{
127cdf0e10cSrcweir 		if (GetExitCodeProcess(hProcess, &(pInfo->Code)) && (pInfo->Code != STILL_ACTIVE))
128cdf0e10cSrcweir 			pInfo->Fields |= osl_Process_EXITCODE;
129cdf0e10cSrcweir 	}
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 	if (Fields & osl_Process_HEAPUSAGE)
132cdf0e10cSrcweir 	{
133cdf0e10cSrcweir 		void*   lpAddress=0;
134cdf0e10cSrcweir 		MEMORY_BASIC_INFORMATION Info;
135cdf0e10cSrcweir 
136cdf0e10cSrcweir 		pInfo->HeapUsage = 0;
137cdf0e10cSrcweir 
138cdf0e10cSrcweir 		do
139cdf0e10cSrcweir 		{
140cdf0e10cSrcweir 			if (VirtualQueryEx(hProcess, lpAddress, &Info, sizeof(Info)) == 0)
141cdf0e10cSrcweir 				break;
142cdf0e10cSrcweir 
143cdf0e10cSrcweir 			if ((Info.State == MEM_COMMIT) && (Info.Type == MEM_PRIVATE))
144cdf0e10cSrcweir 				pInfo->HeapUsage += Info.RegionSize;
145cdf0e10cSrcweir 
146cdf0e10cSrcweir 			lpAddress = (LPBYTE)lpAddress + Info.RegionSize;
147cdf0e10cSrcweir 		}
148cdf0e10cSrcweir 		while (lpAddress < (void *)0x80000000); // 2GB address space
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 		pInfo->Fields |= osl_Process_HEAPUSAGE;
151cdf0e10cSrcweir 	}
152cdf0e10cSrcweir 
153cdf0e10cSrcweir 	if (Fields & osl_Process_CPUTIMES)
154cdf0e10cSrcweir 	{
155cdf0e10cSrcweir 		FILETIME CreationTime, ExitTime, KernelTime, UserTime;
156cdf0e10cSrcweir 
157cdf0e10cSrcweir 		if (GetProcessTimes(hProcess, &CreationTime, &ExitTime,
158cdf0e10cSrcweir 									  &KernelTime, &UserTime))
159cdf0e10cSrcweir 		{
160cdf0e10cSrcweir 			__int64 Value;
161cdf0e10cSrcweir 
162cdf0e10cSrcweir 			Value = *((__int64 *)&UserTime);
163cdf0e10cSrcweir 			pInfo->UserTime.Seconds   = (unsigned long) (Value / 10000000L);
164cdf0e10cSrcweir 			pInfo->UserTime.Nanosec   = (unsigned long)((Value % 10000000L) * 100);
165cdf0e10cSrcweir 
166cdf0e10cSrcweir 			Value = *((__int64 *)&KernelTime);
167cdf0e10cSrcweir 			pInfo->SystemTime.Seconds = (unsigned long) (Value / 10000000L);
168cdf0e10cSrcweir 			pInfo->SystemTime.Nanosec = (unsigned long)((Value % 10000000L) * 100);
169cdf0e10cSrcweir 
170cdf0e10cSrcweir 			pInfo->Fields |= osl_Process_CPUTIMES;
171cdf0e10cSrcweir 		}
172cdf0e10cSrcweir 	}
173cdf0e10cSrcweir 
174cdf0e10cSrcweir 	return (pInfo->Fields == Fields) ? osl_Process_E_None : osl_Process_E_Unknown;
175cdf0e10cSrcweir }
176cdf0e10cSrcweir 
177cdf0e10cSrcweir /***************************************************************************/
178cdf0e10cSrcweir 
osl_joinProcess(oslProcess Process)179cdf0e10cSrcweir oslProcessError SAL_CALL osl_joinProcess(oslProcess Process)
180cdf0e10cSrcweir {
181cdf0e10cSrcweir     return osl_joinProcessWithTimeout(Process, NULL);
182cdf0e10cSrcweir }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir /***************************************************************************/
185cdf0e10cSrcweir 
osl_joinProcessWithTimeout(oslProcess Process,const TimeValue * pTimeout)186cdf0e10cSrcweir oslProcessError SAL_CALL osl_joinProcessWithTimeout(oslProcess Process, const TimeValue* pTimeout)
187cdf0e10cSrcweir {
188cdf0e10cSrcweir     DWORD           timeout   = INFINITE;
189cdf0e10cSrcweir     oslProcessError osl_error = osl_Process_E_None;
190cdf0e10cSrcweir     DWORD           ret;
191cdf0e10cSrcweir 
192cdf0e10cSrcweir     if (NULL == Process)
193cdf0e10cSrcweir         return osl_Process_E_Unknown;
194cdf0e10cSrcweir 
195cdf0e10cSrcweir 	if (pTimeout)
196cdf0e10cSrcweir 		timeout = pTimeout->Seconds * 1000 + pTimeout->Nanosec / 1000000L;
197cdf0e10cSrcweir 
198cdf0e10cSrcweir     ret = WaitForSingleObject(((oslProcessImpl*)Process)->m_hProcess, timeout);
199cdf0e10cSrcweir 
200cdf0e10cSrcweir     if (WAIT_FAILED == ret)
201cdf0e10cSrcweir         osl_error = osl_Process_E_Unknown;
202cdf0e10cSrcweir     else if (WAIT_TIMEOUT == ret)
203cdf0e10cSrcweir         osl_error = osl_Process_E_TimedOut;
204cdf0e10cSrcweir 
205cdf0e10cSrcweir     return osl_error;
206cdf0e10cSrcweir }
207cdf0e10cSrcweir 
208cdf0e10cSrcweir /***************************************************************************
209cdf0e10cSrcweir  * osl_bootstrap_getExecutableFile_Impl().
210cdf0e10cSrcweir  *
211cdf0e10cSrcweir  * @internal
212cdf0e10cSrcweir  * @see rtl_bootstrap
213cdf0e10cSrcweir  * @see #i37371#
214cdf0e10cSrcweir  *
215cdf0e10cSrcweir  ***************************************************************************/
216cdf0e10cSrcweir 
osl_bootstrap_getExecutableFile_Impl(rtl_uString ** ppFileURL)217cdf0e10cSrcweir extern "C" oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl (
218cdf0e10cSrcweir 	rtl_uString ** ppFileURL
219cdf0e10cSrcweir ) SAL_THROW_EXTERN_C()
220cdf0e10cSrcweir {
221cdf0e10cSrcweir     oslProcessError result = osl_Process_E_NotFound;
222cdf0e10cSrcweir 
223cdf0e10cSrcweir     ::osl::LongPathBuffer< sal_Unicode > aBuffer( MAX_LONG_PATH );
224cdf0e10cSrcweir 	DWORD buflen = 0;
225cdf0e10cSrcweir 
226cdf0e10cSrcweir 	if ((buflen = GetModuleFileNameW (0, ::osl::mingw_reinterpret_cast<LPWSTR>(aBuffer), aBuffer.getBufSizeInSymbols())) > 0)
227cdf0e10cSrcweir 	{
228cdf0e10cSrcweir 		rtl_uString * pAbsPath = 0;
229cdf0e10cSrcweir 		rtl_uString_newFromStr_WithLength (&(pAbsPath), aBuffer, buflen);
230cdf0e10cSrcweir 		if (pAbsPath)
231cdf0e10cSrcweir 		{
232cdf0e10cSrcweir 			/* Convert from path to url. */
233cdf0e10cSrcweir 			if (osl_getFileURLFromSystemPath (pAbsPath, ppFileURL) == osl_File_E_None)
234cdf0e10cSrcweir 			{
235cdf0e10cSrcweir 				/* Success. */
236cdf0e10cSrcweir 				result = osl_Process_E_None;
237cdf0e10cSrcweir 			}
238cdf0e10cSrcweir 			rtl_uString_release (pAbsPath);
239cdf0e10cSrcweir 		}
240cdf0e10cSrcweir 	}
241cdf0e10cSrcweir 
242cdf0e10cSrcweir 	return (result);
243cdf0e10cSrcweir }
244cdf0e10cSrcweir 
245cdf0e10cSrcweir /***************************************************************************
246cdf0e10cSrcweir  * Command Line Arguments.
247cdf0e10cSrcweir  ***************************************************************************/
248cdf0e10cSrcweir 
249cdf0e10cSrcweir struct CommandArgs_Impl
250cdf0e10cSrcweir {
251cdf0e10cSrcweir 	sal_uInt32     m_nCount;
252cdf0e10cSrcweir 	rtl_uString ** m_ppArgs;
253cdf0e10cSrcweir };
254cdf0e10cSrcweir 
255cdf0e10cSrcweir static struct CommandArgs_Impl g_command_args =
256cdf0e10cSrcweir {
257cdf0e10cSrcweir 	0,
258cdf0e10cSrcweir 	0
259cdf0e10cSrcweir };
260cdf0e10cSrcweir 
261cdf0e10cSrcweir #ifdef _MSC_VER
262cdf0e10cSrcweir #pragma warning( push )
263cdf0e10cSrcweir #pragma warning( disable: 4100 )
264cdf0e10cSrcweir #endif
osl_createCommandArgs_Impl(int argc,char ** argv)265cdf0e10cSrcweir static rtl_uString ** osl_createCommandArgs_Impl (int argc, char ** argv)
266cdf0e10cSrcweir {
267cdf0e10cSrcweir 	rtl_uString ** ppArgs =
268cdf0e10cSrcweir 		(rtl_uString**)rtl_allocateZeroMemory (argc * sizeof(rtl_uString*));
269cdf0e10cSrcweir 	if (ppArgs != 0)
270cdf0e10cSrcweir 	{
271cdf0e10cSrcweir 		int i;
272cdf0e10cSrcweir 		int nArgs;
273cdf0e10cSrcweir 		LPWSTR *wargv = CommandLineToArgvW( GetCommandLineW(), &nArgs );
274cdf0e10cSrcweir 		OSL_ASSERT( nArgs == argc );
275cdf0e10cSrcweir 		for (i = 0; i < nArgs; i++)
276cdf0e10cSrcweir 		{
277cdf0e10cSrcweir 			/* Convert to unicode */
278cdf0e10cSrcweir 			rtl_uString_newFromStr( &(ppArgs[i]), reinterpret_cast<const sal_Unicode*>(wargv[i]) );
279cdf0e10cSrcweir 		}
280cdf0e10cSrcweir 		if (ppArgs[0] != 0)
281cdf0e10cSrcweir 		{
282cdf0e10cSrcweir 			/* Ensure absolute path */
283cdf0e10cSrcweir             ::osl::LongPathBuffer< sal_Unicode > aBuffer( MAX_LONG_PATH );
284cdf0e10cSrcweir 			DWORD dwResult = 0;
285cdf0e10cSrcweir 
286cdf0e10cSrcweir 			dwResult = SearchPath (
287cdf0e10cSrcweir 				0, reinterpret_cast<LPCWSTR>(ppArgs[0]->buffer), L".exe", aBuffer.getBufSizeInSymbols(), ::osl::mingw_reinterpret_cast<LPWSTR>(aBuffer), 0);
288cdf0e10cSrcweir 			if ((0 < dwResult) && (dwResult < aBuffer.getBufSizeInSymbols()))
289cdf0e10cSrcweir 			{
290cdf0e10cSrcweir 				/* Replace argv[0] with it's absolute path */
291cdf0e10cSrcweir 				rtl_uString_newFromStr_WithLength(
292cdf0e10cSrcweir 					&(ppArgs[0]), aBuffer, dwResult);
293cdf0e10cSrcweir 			}
294cdf0e10cSrcweir 		}
295cdf0e10cSrcweir 		if (ppArgs[0] != 0)
296cdf0e10cSrcweir 		{
297cdf0e10cSrcweir 			/* Convert to FileURL, see @ osl_getExecutableFile() */
298cdf0e10cSrcweir 			rtl_uString * pResult = 0;
299cdf0e10cSrcweir 			osl_getFileURLFromSystemPath (ppArgs[0], &pResult);
300cdf0e10cSrcweir 			if (pResult != 0)
301cdf0e10cSrcweir 			{
302cdf0e10cSrcweir 				rtl_uString_assign (&(ppArgs[0]), pResult);
303cdf0e10cSrcweir 				rtl_uString_release (pResult);
304cdf0e10cSrcweir 			}
305cdf0e10cSrcweir 		}
306cdf0e10cSrcweir 	}
307cdf0e10cSrcweir 	return (ppArgs);
308cdf0e10cSrcweir 
309cdf0e10cSrcweir }
310cdf0e10cSrcweir #ifdef _MSC_VER
311cdf0e10cSrcweir #pragma warning( pop )
312cdf0e10cSrcweir #endif
313cdf0e10cSrcweir 
314cdf0e10cSrcweir /***************************************************************************/
315cdf0e10cSrcweir 
osl_getExecutableFile(rtl_uString ** ppustrFile)316cdf0e10cSrcweir oslProcessError SAL_CALL osl_getExecutableFile( rtl_uString **ppustrFile )
317cdf0e10cSrcweir {
318cdf0e10cSrcweir     oslProcessError result = osl_Process_E_NotFound;
319cdf0e10cSrcweir 
320cdf0e10cSrcweir 	osl_acquireMutex (*osl_getGlobalMutex());
321cdf0e10cSrcweir     OSL_ASSERT(g_command_args.m_nCount > 0);
322cdf0e10cSrcweir 	if (g_command_args.m_nCount > 0)
323cdf0e10cSrcweir 	{
324cdf0e10cSrcweir 		/* CommandArgs set. Obtain arv[0]. */
325cdf0e10cSrcweir 		rtl_uString_assign (ppustrFile, g_command_args.m_ppArgs[0]);
326cdf0e10cSrcweir 		result = osl_Process_E_None;
327cdf0e10cSrcweir 	}
328cdf0e10cSrcweir 	osl_releaseMutex (*osl_getGlobalMutex());
329cdf0e10cSrcweir 
330cdf0e10cSrcweir 	return (result);
331cdf0e10cSrcweir }
332cdf0e10cSrcweir 
333cdf0e10cSrcweir /***************************************************************************/
334cdf0e10cSrcweir 
osl_getCommandArgCount(void)335cdf0e10cSrcweir sal_uInt32 SAL_CALL osl_getCommandArgCount(void)
336cdf0e10cSrcweir {
337cdf0e10cSrcweir 	sal_uInt32 result = 0;
338cdf0e10cSrcweir 
339cdf0e10cSrcweir 	osl_acquireMutex (*osl_getGlobalMutex());
340cdf0e10cSrcweir     OSL_ASSERT(g_command_args.m_nCount > 0);
341cdf0e10cSrcweir 	if (g_command_args.m_nCount > 0)
342cdf0e10cSrcweir 	{
343cdf0e10cSrcweir 		/* We're not counting argv[0] here. */
344cdf0e10cSrcweir 		result = g_command_args.m_nCount - 1;
345cdf0e10cSrcweir 	}
346cdf0e10cSrcweir 	osl_releaseMutex (*osl_getGlobalMutex());
347cdf0e10cSrcweir 
348cdf0e10cSrcweir 	return (result);
349cdf0e10cSrcweir }
350cdf0e10cSrcweir 
351cdf0e10cSrcweir /***************************************************************************/
352cdf0e10cSrcweir 
osl_getCommandArg(sal_uInt32 nArg,rtl_uString ** strCommandArg)353cdf0e10cSrcweir oslProcessError SAL_CALL osl_getCommandArg( sal_uInt32 nArg, rtl_uString **strCommandArg)
354cdf0e10cSrcweir {
355cdf0e10cSrcweir 	oslProcessError result = osl_Process_E_NotFound;
356cdf0e10cSrcweir 
357cdf0e10cSrcweir 	osl_acquireMutex (*osl_getGlobalMutex());
358cdf0e10cSrcweir     OSL_ASSERT(g_command_args.m_nCount > 0);
359cdf0e10cSrcweir 	if (g_command_args.m_nCount > (nArg + 1))
360cdf0e10cSrcweir 	{
361cdf0e10cSrcweir 		/* We're not counting argv[0] here. */
362cdf0e10cSrcweir 		rtl_uString_assign (strCommandArg, g_command_args.m_ppArgs[nArg + 1]);
363cdf0e10cSrcweir 		result = osl_Process_E_None;
364cdf0e10cSrcweir 	}
365cdf0e10cSrcweir 	osl_releaseMutex (*osl_getGlobalMutex());
366cdf0e10cSrcweir 
367cdf0e10cSrcweir 	return (result);
368cdf0e10cSrcweir }
369cdf0e10cSrcweir 
370cdf0e10cSrcweir /***************************************************************************/
371cdf0e10cSrcweir 
osl_setCommandArgs(int argc,char ** argv)372cdf0e10cSrcweir void SAL_CALL osl_setCommandArgs (int argc, char ** argv)
373cdf0e10cSrcweir {
374cdf0e10cSrcweir     OSL_ASSERT(argc > 0);
375cdf0e10cSrcweir 	osl_acquireMutex (*osl_getGlobalMutex());
376cdf0e10cSrcweir 	if (g_command_args.m_nCount == 0)
377cdf0e10cSrcweir 	{
378cdf0e10cSrcweir 		rtl_uString** ppArgs = osl_createCommandArgs_Impl (argc, argv);
379cdf0e10cSrcweir 		if (ppArgs != 0)
380cdf0e10cSrcweir 		{
381cdf0e10cSrcweir 			g_command_args.m_nCount = argc;
382cdf0e10cSrcweir 			g_command_args.m_ppArgs = ppArgs;
383cdf0e10cSrcweir 		}
384cdf0e10cSrcweir 	}
385cdf0e10cSrcweir 	osl_releaseMutex (*osl_getGlobalMutex());
386cdf0e10cSrcweir }
387cdf0e10cSrcweir 
388cdf0e10cSrcweir /***************************************************************************
389cdf0e10cSrcweir  * Environment
390cdf0e10cSrcweir  ***************************************************************************/
391cdf0e10cSrcweir #define ENV_BUFFER_SIZE (32*1024-1)
392cdf0e10cSrcweir 
osl_getEnvironment(rtl_uString * ustrVar,rtl_uString ** ustrValue)393cdf0e10cSrcweir oslProcessError SAL_CALL osl_getEnvironment(rtl_uString *ustrVar, rtl_uString **ustrValue)
394cdf0e10cSrcweir {
395cdf0e10cSrcweir     WCHAR buff[ENV_BUFFER_SIZE];
396cdf0e10cSrcweir 
397cdf0e10cSrcweir     if (GetEnvironmentVariableW(reinterpret_cast<LPCWSTR>(ustrVar->buffer), buff, ENV_BUFFER_SIZE) > 0)
398cdf0e10cSrcweir     {
399cdf0e10cSrcweir         rtl_uString_newFromStr(ustrValue, reinterpret_cast<const sal_Unicode*>(buff));
400cdf0e10cSrcweir     	return osl_Process_E_None;
401cdf0e10cSrcweir     }
402cdf0e10cSrcweir 	return osl_Process_E_Unknown;
403cdf0e10cSrcweir }
404cdf0e10cSrcweir 
osl_setEnvironment(rtl_uString * ustrVar,rtl_uString * ustrValue)405cdf0e10cSrcweir oslProcessError SAL_CALL osl_setEnvironment(rtl_uString *ustrVar, rtl_uString *ustrValue)
406cdf0e10cSrcweir {
407*1ad19ac0SHerbert Dürr     // set Windows environment variable
408cdf0e10cSrcweir     LPCWSTR lpName = reinterpret_cast<LPCWSTR>(ustrVar->buffer);
409cdf0e10cSrcweir     LPCWSTR lpValue = reinterpret_cast<LPCWSTR>(ustrValue->buffer);
410*1ad19ac0SHerbert Dürr     if( !SetEnvironmentVariableW( lpName, lpValue))
411*1ad19ac0SHerbert Dürr         return osl_Process_E_Unknown;
412*1ad19ac0SHerbert Dürr 
413*1ad19ac0SHerbert Dürr     // also set the variable in the crt environment
414*1ad19ac0SHerbert Dürr     _wputenv_s( lpName, lpValue);
415*1ad19ac0SHerbert Dürr     return osl_Process_E_None;
416cdf0e10cSrcweir }
417cdf0e10cSrcweir 
osl_clearEnvironment(rtl_uString * ustrVar)418cdf0e10cSrcweir oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString *ustrVar)
419cdf0e10cSrcweir {
420*1ad19ac0SHerbert Dürr     // delete the variable from the current process environment
421*1ad19ac0SHerbert Dürr     // by setting SetEnvironmentVariable's second parameter to NULL
422cdf0e10cSrcweir     LPCWSTR lpName = reinterpret_cast<LPCWSTR>(ustrVar->buffer);
423*1ad19ac0SHerbert Dürr     if( !SetEnvironmentVariableW( lpName, NULL))
424*1ad19ac0SHerbert Dürr         return osl_Process_E_Unknown;
425*1ad19ac0SHerbert Dürr 
426*1ad19ac0SHerbert Dürr     // also remove the variable from the crt environment
427*1ad19ac0SHerbert Dürr     wchar_t aEmptyName = 0;
428*1ad19ac0SHerbert Dürr     _wputenv_s( lpName, &aEmptyName);
429*1ad19ac0SHerbert Dürr     return osl_Process_E_None;
430cdf0e10cSrcweir }
431cdf0e10cSrcweir 
432cdf0e10cSrcweir /***************************************************************************
433cdf0e10cSrcweir  * Current Working Directory.
434cdf0e10cSrcweir  ***************************************************************************/
435cdf0e10cSrcweir 
436cdf0e10cSrcweir extern "C" oslMutex	g_CurrentDirectoryMutex;
437cdf0e10cSrcweir 
osl_getProcessWorkingDir(rtl_uString ** pustrWorkingDir)438cdf0e10cSrcweir oslProcessError SAL_CALL osl_getProcessWorkingDir( rtl_uString **pustrWorkingDir )
439cdf0e10cSrcweir {
440cdf0e10cSrcweir     ::osl::LongPathBuffer< sal_Unicode > aBuffer( MAX_LONG_PATH );
441cdf0e10cSrcweir 	DWORD	dwLen = 0;
442cdf0e10cSrcweir 
443cdf0e10cSrcweir 
444cdf0e10cSrcweir 	osl_acquireMutex( g_CurrentDirectoryMutex );
445cdf0e10cSrcweir 	dwLen = GetCurrentDirectory( aBuffer.getBufSizeInSymbols(), ::osl::mingw_reinterpret_cast<LPWSTR>(aBuffer) );
446cdf0e10cSrcweir 	osl_releaseMutex( g_CurrentDirectoryMutex );
447cdf0e10cSrcweir 
448cdf0e10cSrcweir 	if ( dwLen && dwLen < aBuffer.getBufSizeInSymbols() )
449cdf0e10cSrcweir 	{
450cdf0e10cSrcweir 		oslFileError	eError;
451cdf0e10cSrcweir 		rtl_uString		*ustrTemp = NULL;;
452cdf0e10cSrcweir 
453cdf0e10cSrcweir 		rtl_uString_newFromStr_WithLength( &ustrTemp, aBuffer, dwLen );
454cdf0e10cSrcweir 		eError = osl_getFileURLFromSystemPath( ustrTemp, pustrWorkingDir );
455cdf0e10cSrcweir 
456cdf0e10cSrcweir 		rtl_uString_release( ustrTemp );
457cdf0e10cSrcweir 
458cdf0e10cSrcweir 		if ( osl_File_E_None != eError )
459cdf0e10cSrcweir 			return osl_Process_E_Unknown;
460cdf0e10cSrcweir 		else
461cdf0e10cSrcweir 			return osl_Process_E_None;
462cdf0e10cSrcweir 	}
463cdf0e10cSrcweir 	else
464cdf0e10cSrcweir 		return osl_Process_E_Unknown;
465cdf0e10cSrcweir }
466cdf0e10cSrcweir 
467cdf0e10cSrcweir /***************************************************************************
468cdf0e10cSrcweir  * Process Locale.
469cdf0e10cSrcweir  ***************************************************************************/
470cdf0e10cSrcweir 
471cdf0e10cSrcweir extern "C" void _imp_getProcessLocale( rtl_Locale ** ppLocale );
472cdf0e10cSrcweir 
473cdf0e10cSrcweir static rtl_Locale * g_theProcessLocale = NULL;
474cdf0e10cSrcweir 
475cdf0e10cSrcweir /***************************************************************************/
476cdf0e10cSrcweir 
osl_getProcessLocale(rtl_Locale ** ppLocale)477cdf0e10cSrcweir oslProcessError SAL_CALL osl_getProcessLocale( rtl_Locale ** ppLocale )
478cdf0e10cSrcweir {
479cdf0e10cSrcweir     osl_acquireMutex( *osl_getGlobalMutex() );
480cdf0e10cSrcweir 
481cdf0e10cSrcweir     /* determine the users default locale */
482cdf0e10cSrcweir     if( NULL == g_theProcessLocale )
483cdf0e10cSrcweir         _imp_getProcessLocale( &g_theProcessLocale );
484cdf0e10cSrcweir 
485cdf0e10cSrcweir     /* or return the cached value */
486cdf0e10cSrcweir     *ppLocale = g_theProcessLocale;
487cdf0e10cSrcweir 
488cdf0e10cSrcweir     osl_releaseMutex( *osl_getGlobalMutex() );
489cdf0e10cSrcweir     return osl_Process_E_None;
490cdf0e10cSrcweir }
491cdf0e10cSrcweir 
492cdf0e10cSrcweir /***************************************************************************/
493cdf0e10cSrcweir 
osl_setProcessLocale(rtl_Locale * pLocale)494cdf0e10cSrcweir oslProcessError SAL_CALL osl_setProcessLocale( rtl_Locale * pLocale )
495cdf0e10cSrcweir {
496cdf0e10cSrcweir     osl_acquireMutex( *osl_getGlobalMutex() );
497cdf0e10cSrcweir 
498cdf0e10cSrcweir     /* check if locale is supported */
499cdf0e10cSrcweir     if( RTL_TEXTENCODING_DONTKNOW == osl_getTextEncodingFromLocale( pLocale ) )
500cdf0e10cSrcweir         return osl_Process_E_Unknown;
501cdf0e10cSrcweir 
502cdf0e10cSrcweir     /* just remember the locale here */
503cdf0e10cSrcweir     g_theProcessLocale = pLocale;
504cdf0e10cSrcweir 
505cdf0e10cSrcweir     osl_releaseMutex( *osl_getGlobalMutex() );
506cdf0e10cSrcweir     return osl_Process_E_None;
507cdf0e10cSrcweir }
508cdf0e10cSrcweir 
509cdf0e10cSrcweir /************************************************
510cdf0e10cSrcweir  * Portal send/receive interface implementation
511cdf0e10cSrcweir  ************************************************/
512cdf0e10cSrcweir 
ReadPipe(oslPipe hPipe,void * pBuffer,sal_Int32 BytesToRead,sal_Int32 * nBytes)513cdf0e10cSrcweir static sal_Bool ReadPipe(oslPipe hPipe,
514cdf0e10cSrcweir                 void* pBuffer,
515cdf0e10cSrcweir                 sal_Int32 BytesToRead,
516cdf0e10cSrcweir                 sal_Int32* nBytes)
517cdf0e10cSrcweir {
518cdf0e10cSrcweir         *nBytes = osl_receivePipe(hPipe, pBuffer, BytesToRead);
519cdf0e10cSrcweir         OSL_TRACE("tried to recieve %d, recieved %d.\n",
520cdf0e10cSrcweir                         BytesToRead, *nBytes);
521cdf0e10cSrcweir         return (sal_Bool)((*nBytes >= 0) && (osl_getLastPipeError(hPipe) == osl_Pipe_E_None));
522cdf0e10cSrcweir }
523cdf0e10cSrcweir 
WritePipe(oslPipe hPipe,void * pBuffer,sal_Int32 BytesToSend,sal_Int32 * nBytes)524cdf0e10cSrcweir static sal_Bool WritePipe(oslPipe hPipe,
525cdf0e10cSrcweir                 void* pBuffer,
526cdf0e10cSrcweir                 sal_Int32 BytesToSend,
527cdf0e10cSrcweir                 sal_Int32* nBytes)
528cdf0e10cSrcweir {
529cdf0e10cSrcweir         *nBytes = osl_sendPipe(hPipe, pBuffer, BytesToSend);
530cdf0e10cSrcweir         OSL_TRACE("tried to send %d, sent %d\n",
531cdf0e10cSrcweir                         BytesToSend, *nBytes);
532cdf0e10cSrcweir         return (sal_Bool)((*nBytes == BytesToSend) && (osl_getLastPipeError(hPipe) == osl_Pipe_E_None));
533cdf0e10cSrcweir }
534cdf0e10cSrcweir 
osl_sendResourcePipe(oslPipe hPipe,oslSocket pSocket)535cdf0e10cSrcweir sal_Bool SAL_CALL osl_sendResourcePipe(oslPipe hPipe, oslSocket pSocket)
536cdf0e10cSrcweir {
537cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
538cdf0e10cSrcweir 	sal_Int32 bytes = 0;
539cdf0e10cSrcweir 
540cdf0e10cSrcweir 	/* 	duplicate handle on this other side ->
541cdf0e10cSrcweir 		receive remote process
542cdf0e10cSrcweir 		duplicate handle and send it */
543cdf0e10cSrcweir 	DWORD remoteProcessID = 0;
544cdf0e10cSrcweir 	HANDLE fd = (HANDLE)pSocket->m_Socket;
545cdf0e10cSrcweir 	oslDescriptorType code = osl_Process_TypeSocket;
546cdf0e10cSrcweir 
547cdf0e10cSrcweir 	OSL_TRACE("osl_sendResourcePipe: enter...");
548cdf0e10cSrcweir 
549cdf0e10cSrcweir 	if (ReadPipe(hPipe, &remoteProcessID, sizeof(remoteProcessID), &bytes))
550cdf0e10cSrcweir 	{
551cdf0e10cSrcweir 		HANDLE hRemoteProc = OpenProcess(PROCESS_DUP_HANDLE,
552cdf0e10cSrcweir 										 FALSE,
553cdf0e10cSrcweir 										 remoteProcessID);
554cdf0e10cSrcweir 
555cdf0e10cSrcweir 		if (hRemoteProc != (HANDLE)NULL)
556cdf0e10cSrcweir 		{
557cdf0e10cSrcweir 			HANDLE newFd;
558cdf0e10cSrcweir 
559cdf0e10cSrcweir 			if (DuplicateHandle(GetCurrentProcess(),
560cdf0e10cSrcweir 								fd,
561cdf0e10cSrcweir 								hRemoteProc,
562cdf0e10cSrcweir 								&newFd,
563cdf0e10cSrcweir 								0, FALSE, DUPLICATE_SAME_ACCESS))
564cdf0e10cSrcweir 			{
565cdf0e10cSrcweir 				if (
566cdf0e10cSrcweir 					WritePipe(hPipe, &code, sizeof(code), &bytes) &&
567cdf0e10cSrcweir 					WritePipe(hPipe, &newFd, sizeof(fd), &bytes)
568cdf0e10cSrcweir 					)
569cdf0e10cSrcweir 					bRet = sal_True;
570cdf0e10cSrcweir 			}
571cdf0e10cSrcweir 
572cdf0e10cSrcweir 			CloseHandle(hRemoteProc);
573cdf0e10cSrcweir 		}
574cdf0e10cSrcweir 	}
575cdf0e10cSrcweir 
576cdf0e10cSrcweir 	if (bRet)
577cdf0e10cSrcweir 	{
578cdf0e10cSrcweir 		sal_Int32 commitCode;
579cdf0e10cSrcweir 		OSL_TRACE("osl_sendResourcePipe: handle sent successfully, verify...\n");
580cdf0e10cSrcweir 
581cdf0e10cSrcweir 		if (
582cdf0e10cSrcweir 			!ReadPipe(hPipe, &commitCode, sizeof(commitCode), &bytes) ||
583cdf0e10cSrcweir 			(commitCode <= 0)
584cdf0e10cSrcweir 			)
585cdf0e10cSrcweir 			bRet = sal_False;
586cdf0e10cSrcweir 	}
587cdf0e10cSrcweir 
588cdf0e10cSrcweir 	OSL_TRACE("osl_sendResourcePipe: exit... %d\n", bRet);
589cdf0e10cSrcweir 	return(bRet);
590cdf0e10cSrcweir }
591cdf0e10cSrcweir 
592cdf0e10cSrcweir 
osl_receiveResourcePipe(oslPipe hPipe)593cdf0e10cSrcweir oslSocket SAL_CALL osl_receiveResourcePipe(oslPipe hPipe)
594cdf0e10cSrcweir {
595cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
596cdf0e10cSrcweir 	sal_Int32 bytes = 0;
597cdf0e10cSrcweir 	sal_Int32 commitCode;
598cdf0e10cSrcweir 	oslSocket pSocket = NULL;
599cdf0e10cSrcweir 
600cdf0e10cSrcweir 	/* duplicate handle on the other side ->
601cdf0e10cSrcweir 	   send my process id receive duplicated handle */
602cdf0e10cSrcweir 	HANDLE fd = INVALID_HANDLE_VALUE;
603cdf0e10cSrcweir 	DWORD myProcessID = GetCurrentProcessId();
604cdf0e10cSrcweir 	oslDescriptorType code = osl_Process_TypeNone;
605cdf0e10cSrcweir 
606cdf0e10cSrcweir 	OSL_TRACE("osl_receiveResourcePipe: enter...\n");
607cdf0e10cSrcweir 
608cdf0e10cSrcweir 	if (
609cdf0e10cSrcweir 		WritePipe(hPipe, &myProcessID, sizeof(myProcessID), &bytes) &&
610cdf0e10cSrcweir 		ReadPipe(hPipe, &code, sizeof(code), &bytes) &&
611cdf0e10cSrcweir                 ReadPipe(hPipe, &fd, sizeof(fd), &bytes)
612cdf0e10cSrcweir 		)
613cdf0e10cSrcweir 	{
614cdf0e10cSrcweir 		if (code == osl_Process_TypeSocket)
615cdf0e10cSrcweir 		{
616cdf0e10cSrcweir 			pSocket = __osl_createSocketImpl((SOCKET)fd);
617cdf0e10cSrcweir 			bRet = sal_True;
618cdf0e10cSrcweir 		}
619cdf0e10cSrcweir 		else
620cdf0e10cSrcweir 		{
621cdf0e10cSrcweir 			OSL_TRACE("osl_receiveResourcePipe: UKNOWN\n");
622cdf0e10cSrcweir 			bRet = sal_False;
623cdf0e10cSrcweir 		}
624cdf0e10cSrcweir         }
625cdf0e10cSrcweir 
626cdf0e10cSrcweir 	if (bRet)
627cdf0e10cSrcweir 		commitCode = 1;
628cdf0e10cSrcweir 	else
629cdf0e10cSrcweir 		commitCode = 0;
630cdf0e10cSrcweir 
631cdf0e10cSrcweir 	WritePipe(hPipe, &commitCode, sizeof(commitCode), &bytes);
632cdf0e10cSrcweir 
633cdf0e10cSrcweir 	OSL_TRACE("osl_receiveResourcePipe: exit... %d, %p\n", bRet, pSocket);
634cdf0e10cSrcweir 
635cdf0e10cSrcweir 	return pSocket;
636cdf0e10cSrcweir }
637