1*87d2adbcSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*87d2adbcSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*87d2adbcSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*87d2adbcSAndrew Rist * distributed with this work for additional information 6*87d2adbcSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*87d2adbcSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*87d2adbcSAndrew Rist * "License"); you may not use this file except in compliance 9*87d2adbcSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*87d2adbcSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*87d2adbcSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*87d2adbcSAndrew Rist * software distributed under the License is distributed on an 15*87d2adbcSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*87d2adbcSAndrew Rist * KIND, either express or implied. See the License for the 17*87d2adbcSAndrew Rist * specific language governing permissions and limitations 18*87d2adbcSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*87d2adbcSAndrew Rist *************************************************************/ 21*87d2adbcSAndrew Rist 22*87d2adbcSAndrew 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 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 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 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 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 179cdf0e10cSrcweir oslProcessError SAL_CALL osl_joinProcess(oslProcess Process) 180cdf0e10cSrcweir { 181cdf0e10cSrcweir return osl_joinProcessWithTimeout(Process, NULL); 182cdf0e10cSrcweir } 183cdf0e10cSrcweir 184cdf0e10cSrcweir /***************************************************************************/ 185cdf0e10cSrcweir 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 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 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 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 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 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 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 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 405cdf0e10cSrcweir oslProcessError SAL_CALL osl_setEnvironment(rtl_uString *ustrVar, rtl_uString *ustrValue) 406cdf0e10cSrcweir { 407cdf0e10cSrcweir LPCWSTR lpName = reinterpret_cast<LPCWSTR>(ustrVar->buffer); 408cdf0e10cSrcweir LPCWSTR lpValue = reinterpret_cast<LPCWSTR>(ustrValue->buffer); 409cdf0e10cSrcweir if (SetEnvironmentVariableW(lpName, lpValue)) 410cdf0e10cSrcweir return osl_Process_E_None; 411cdf0e10cSrcweir return osl_Process_E_Unknown; 412cdf0e10cSrcweir } 413cdf0e10cSrcweir 414cdf0e10cSrcweir oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString *ustrVar) 415cdf0e10cSrcweir { 416cdf0e10cSrcweir //If the second parameter is NULL, the variable is deleted from the current 417cdf0e10cSrcweir //process's environment. 418cdf0e10cSrcweir LPCWSTR lpName = reinterpret_cast<LPCWSTR>(ustrVar->buffer); 419cdf0e10cSrcweir if (SetEnvironmentVariableW(lpName, NULL)) 420cdf0e10cSrcweir return osl_Process_E_None; 421cdf0e10cSrcweir return osl_Process_E_Unknown; 422cdf0e10cSrcweir } 423cdf0e10cSrcweir 424cdf0e10cSrcweir /*************************************************************************** 425cdf0e10cSrcweir * Current Working Directory. 426cdf0e10cSrcweir ***************************************************************************/ 427cdf0e10cSrcweir 428cdf0e10cSrcweir extern "C" oslMutex g_CurrentDirectoryMutex; 429cdf0e10cSrcweir 430cdf0e10cSrcweir oslProcessError SAL_CALL osl_getProcessWorkingDir( rtl_uString **pustrWorkingDir ) 431cdf0e10cSrcweir { 432cdf0e10cSrcweir ::osl::LongPathBuffer< sal_Unicode > aBuffer( MAX_LONG_PATH ); 433cdf0e10cSrcweir DWORD dwLen = 0; 434cdf0e10cSrcweir 435cdf0e10cSrcweir 436cdf0e10cSrcweir osl_acquireMutex( g_CurrentDirectoryMutex ); 437cdf0e10cSrcweir dwLen = GetCurrentDirectory( aBuffer.getBufSizeInSymbols(), ::osl::mingw_reinterpret_cast<LPWSTR>(aBuffer) ); 438cdf0e10cSrcweir osl_releaseMutex( g_CurrentDirectoryMutex ); 439cdf0e10cSrcweir 440cdf0e10cSrcweir if ( dwLen && dwLen < aBuffer.getBufSizeInSymbols() ) 441cdf0e10cSrcweir { 442cdf0e10cSrcweir oslFileError eError; 443cdf0e10cSrcweir rtl_uString *ustrTemp = NULL;; 444cdf0e10cSrcweir 445cdf0e10cSrcweir rtl_uString_newFromStr_WithLength( &ustrTemp, aBuffer, dwLen ); 446cdf0e10cSrcweir eError = osl_getFileURLFromSystemPath( ustrTemp, pustrWorkingDir ); 447cdf0e10cSrcweir 448cdf0e10cSrcweir rtl_uString_release( ustrTemp ); 449cdf0e10cSrcweir 450cdf0e10cSrcweir if ( osl_File_E_None != eError ) 451cdf0e10cSrcweir return osl_Process_E_Unknown; 452cdf0e10cSrcweir else 453cdf0e10cSrcweir return osl_Process_E_None; 454cdf0e10cSrcweir } 455cdf0e10cSrcweir else 456cdf0e10cSrcweir return osl_Process_E_Unknown; 457cdf0e10cSrcweir } 458cdf0e10cSrcweir 459cdf0e10cSrcweir /*************************************************************************** 460cdf0e10cSrcweir * Process Locale. 461cdf0e10cSrcweir ***************************************************************************/ 462cdf0e10cSrcweir 463cdf0e10cSrcweir extern "C" void _imp_getProcessLocale( rtl_Locale ** ppLocale ); 464cdf0e10cSrcweir 465cdf0e10cSrcweir static rtl_Locale * g_theProcessLocale = NULL; 466cdf0e10cSrcweir 467cdf0e10cSrcweir /***************************************************************************/ 468cdf0e10cSrcweir 469cdf0e10cSrcweir oslProcessError SAL_CALL osl_getProcessLocale( rtl_Locale ** ppLocale ) 470cdf0e10cSrcweir { 471cdf0e10cSrcweir osl_acquireMutex( *osl_getGlobalMutex() ); 472cdf0e10cSrcweir 473cdf0e10cSrcweir /* determine the users default locale */ 474cdf0e10cSrcweir if( NULL == g_theProcessLocale ) 475cdf0e10cSrcweir _imp_getProcessLocale( &g_theProcessLocale ); 476cdf0e10cSrcweir 477cdf0e10cSrcweir /* or return the cached value */ 478cdf0e10cSrcweir *ppLocale = g_theProcessLocale; 479cdf0e10cSrcweir 480cdf0e10cSrcweir osl_releaseMutex( *osl_getGlobalMutex() ); 481cdf0e10cSrcweir return osl_Process_E_None; 482cdf0e10cSrcweir } 483cdf0e10cSrcweir 484cdf0e10cSrcweir /***************************************************************************/ 485cdf0e10cSrcweir 486cdf0e10cSrcweir oslProcessError SAL_CALL osl_setProcessLocale( rtl_Locale * pLocale ) 487cdf0e10cSrcweir { 488cdf0e10cSrcweir osl_acquireMutex( *osl_getGlobalMutex() ); 489cdf0e10cSrcweir 490cdf0e10cSrcweir /* check if locale is supported */ 491cdf0e10cSrcweir if( RTL_TEXTENCODING_DONTKNOW == osl_getTextEncodingFromLocale( pLocale ) ) 492cdf0e10cSrcweir return osl_Process_E_Unknown; 493cdf0e10cSrcweir 494cdf0e10cSrcweir /* just remember the locale here */ 495cdf0e10cSrcweir g_theProcessLocale = pLocale; 496cdf0e10cSrcweir 497cdf0e10cSrcweir osl_releaseMutex( *osl_getGlobalMutex() ); 498cdf0e10cSrcweir return osl_Process_E_None; 499cdf0e10cSrcweir } 500cdf0e10cSrcweir 501cdf0e10cSrcweir /************************************************ 502cdf0e10cSrcweir * Portal send/receive interface implementation 503cdf0e10cSrcweir ************************************************/ 504cdf0e10cSrcweir 505cdf0e10cSrcweir static sal_Bool ReadPipe(oslPipe hPipe, 506cdf0e10cSrcweir void* pBuffer, 507cdf0e10cSrcweir sal_Int32 BytesToRead, 508cdf0e10cSrcweir sal_Int32* nBytes) 509cdf0e10cSrcweir { 510cdf0e10cSrcweir *nBytes = osl_receivePipe(hPipe, pBuffer, BytesToRead); 511cdf0e10cSrcweir OSL_TRACE("tried to recieve %d, recieved %d.\n", 512cdf0e10cSrcweir BytesToRead, *nBytes); 513cdf0e10cSrcweir return (sal_Bool)((*nBytes >= 0) && (osl_getLastPipeError(hPipe) == osl_Pipe_E_None)); 514cdf0e10cSrcweir } 515cdf0e10cSrcweir 516cdf0e10cSrcweir static sal_Bool WritePipe(oslPipe hPipe, 517cdf0e10cSrcweir void* pBuffer, 518cdf0e10cSrcweir sal_Int32 BytesToSend, 519cdf0e10cSrcweir sal_Int32* nBytes) 520cdf0e10cSrcweir { 521cdf0e10cSrcweir *nBytes = osl_sendPipe(hPipe, pBuffer, BytesToSend); 522cdf0e10cSrcweir OSL_TRACE("tried to send %d, sent %d\n", 523cdf0e10cSrcweir BytesToSend, *nBytes); 524cdf0e10cSrcweir return (sal_Bool)((*nBytes == BytesToSend) && (osl_getLastPipeError(hPipe) == osl_Pipe_E_None)); 525cdf0e10cSrcweir } 526cdf0e10cSrcweir 527cdf0e10cSrcweir sal_Bool SAL_CALL osl_sendResourcePipe(oslPipe hPipe, oslSocket pSocket) 528cdf0e10cSrcweir { 529cdf0e10cSrcweir sal_Bool bRet = sal_False; 530cdf0e10cSrcweir sal_Int32 bytes = 0; 531cdf0e10cSrcweir 532cdf0e10cSrcweir /* duplicate handle on this other side -> 533cdf0e10cSrcweir receive remote process 534cdf0e10cSrcweir duplicate handle and send it */ 535cdf0e10cSrcweir DWORD remoteProcessID = 0; 536cdf0e10cSrcweir HANDLE fd = (HANDLE)pSocket->m_Socket; 537cdf0e10cSrcweir oslDescriptorType code = osl_Process_TypeSocket; 538cdf0e10cSrcweir 539cdf0e10cSrcweir OSL_TRACE("osl_sendResourcePipe: enter..."); 540cdf0e10cSrcweir 541cdf0e10cSrcweir if (ReadPipe(hPipe, &remoteProcessID, sizeof(remoteProcessID), &bytes)) 542cdf0e10cSrcweir { 543cdf0e10cSrcweir HANDLE hRemoteProc = OpenProcess(PROCESS_DUP_HANDLE, 544cdf0e10cSrcweir FALSE, 545cdf0e10cSrcweir remoteProcessID); 546cdf0e10cSrcweir 547cdf0e10cSrcweir if (hRemoteProc != (HANDLE)NULL) 548cdf0e10cSrcweir { 549cdf0e10cSrcweir HANDLE newFd; 550cdf0e10cSrcweir 551cdf0e10cSrcweir if (DuplicateHandle(GetCurrentProcess(), 552cdf0e10cSrcweir fd, 553cdf0e10cSrcweir hRemoteProc, 554cdf0e10cSrcweir &newFd, 555cdf0e10cSrcweir 0, FALSE, DUPLICATE_SAME_ACCESS)) 556cdf0e10cSrcweir { 557cdf0e10cSrcweir if ( 558cdf0e10cSrcweir WritePipe(hPipe, &code, sizeof(code), &bytes) && 559cdf0e10cSrcweir WritePipe(hPipe, &newFd, sizeof(fd), &bytes) 560cdf0e10cSrcweir ) 561cdf0e10cSrcweir bRet = sal_True; 562cdf0e10cSrcweir } 563cdf0e10cSrcweir 564cdf0e10cSrcweir CloseHandle(hRemoteProc); 565cdf0e10cSrcweir } 566cdf0e10cSrcweir } 567cdf0e10cSrcweir 568cdf0e10cSrcweir if (bRet) 569cdf0e10cSrcweir { 570cdf0e10cSrcweir sal_Int32 commitCode; 571cdf0e10cSrcweir OSL_TRACE("osl_sendResourcePipe: handle sent successfully, verify...\n"); 572cdf0e10cSrcweir 573cdf0e10cSrcweir if ( 574cdf0e10cSrcweir !ReadPipe(hPipe, &commitCode, sizeof(commitCode), &bytes) || 575cdf0e10cSrcweir (commitCode <= 0) 576cdf0e10cSrcweir ) 577cdf0e10cSrcweir bRet = sal_False; 578cdf0e10cSrcweir } 579cdf0e10cSrcweir 580cdf0e10cSrcweir OSL_TRACE("osl_sendResourcePipe: exit... %d\n", bRet); 581cdf0e10cSrcweir return(bRet); 582cdf0e10cSrcweir } 583cdf0e10cSrcweir 584cdf0e10cSrcweir 585cdf0e10cSrcweir oslSocket SAL_CALL osl_receiveResourcePipe(oslPipe hPipe) 586cdf0e10cSrcweir { 587cdf0e10cSrcweir sal_Bool bRet = sal_False; 588cdf0e10cSrcweir sal_Int32 bytes = 0; 589cdf0e10cSrcweir sal_Int32 commitCode; 590cdf0e10cSrcweir oslSocket pSocket = NULL; 591cdf0e10cSrcweir 592cdf0e10cSrcweir /* duplicate handle on the other side -> 593cdf0e10cSrcweir send my process id receive duplicated handle */ 594cdf0e10cSrcweir HANDLE fd = INVALID_HANDLE_VALUE; 595cdf0e10cSrcweir DWORD myProcessID = GetCurrentProcessId(); 596cdf0e10cSrcweir oslDescriptorType code = osl_Process_TypeNone; 597cdf0e10cSrcweir 598cdf0e10cSrcweir OSL_TRACE("osl_receiveResourcePipe: enter...\n"); 599cdf0e10cSrcweir 600cdf0e10cSrcweir if ( 601cdf0e10cSrcweir WritePipe(hPipe, &myProcessID, sizeof(myProcessID), &bytes) && 602cdf0e10cSrcweir ReadPipe(hPipe, &code, sizeof(code), &bytes) && 603cdf0e10cSrcweir ReadPipe(hPipe, &fd, sizeof(fd), &bytes) 604cdf0e10cSrcweir ) 605cdf0e10cSrcweir { 606cdf0e10cSrcweir if (code == osl_Process_TypeSocket) 607cdf0e10cSrcweir { 608cdf0e10cSrcweir pSocket = __osl_createSocketImpl((SOCKET)fd); 609cdf0e10cSrcweir bRet = sal_True; 610cdf0e10cSrcweir } 611cdf0e10cSrcweir else 612cdf0e10cSrcweir { 613cdf0e10cSrcweir OSL_TRACE("osl_receiveResourcePipe: UKNOWN\n"); 614cdf0e10cSrcweir bRet = sal_False; 615cdf0e10cSrcweir } 616cdf0e10cSrcweir } 617cdf0e10cSrcweir 618cdf0e10cSrcweir if (bRet) 619cdf0e10cSrcweir commitCode = 1; 620cdf0e10cSrcweir else 621cdf0e10cSrcweir commitCode = 0; 622cdf0e10cSrcweir 623cdf0e10cSrcweir WritePipe(hPipe, &commitCode, sizeof(commitCode), &bytes); 624cdf0e10cSrcweir 625cdf0e10cSrcweir OSL_TRACE("osl_receiveResourcePipe: exit... %d, %p\n", bRet, pSocket); 626cdf0e10cSrcweir 627cdf0e10cSrcweir return pSocket; 628cdf0e10cSrcweir } 629