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