static oslFileError osl_setup_createTempFile_impl_( rtl_uString* pustrDirectoryURL, oslFileHandle* pHandle, rtl_uString** ppustrTempFileURL, rtl_uString** ppustr_base_dir, sal_Bool* b_delete_on_close) { oslFileError osl_error; OSL_PRECOND(((0 != pHandle) || (0 != ppustrTempFileURL)), "Invalid parameter!"); if ((0 == pHandle) && (0 == ppustrTempFileURL)) { osl_error = osl_File_E_INVAL; } else { osl_error = osl_setup_base_directory_impl_( pustrDirectoryURL, ppustr_base_dir); *b_delete_on_close = (0 == ppustrTempFileURL); } return osl_error; }
static oslFileError osl_create_temp_file_impl_( const rtl_uString* pustr_base_directory, oslFileHandle* file_handle, rtl_uString** ppustr_temp_file_name) { rtl_uString* rand_name = 0; sal_uInt32 len_base_dir = 0; rtl_uString* tmp_file_path = 0; rtl_uString* tmp_file_url = 0; sal_Int32 capacity = 0; oslFileError osl_error = osl_File_E_None; sal_Int32 offset_file_name; const sal_Unicode* puchr; OSL_PRECOND(pustr_base_directory, "Invalid Parameter"); OSL_PRECOND(file_handle, "Invalid Parameter"); OSL_PRECOND(ppustr_temp_file_name, "Invalid Parameter"); len_base_dir = rtl_uString_getLength(pustr_base_directory); rtl_uStringbuffer_newFromStr_WithLength( &tmp_file_path, rtl_uString_getStr((rtl_uString*)pustr_base_directory), len_base_dir); rtl_uStringbuffer_ensureCapacity( &tmp_file_path, &capacity, (len_base_dir + 1 + RAND_NAME_LENGTH)); offset_file_name = len_base_dir; puchr = rtl_uString_getStr(tmp_file_path); /* ensure that the last character is a '/' */ if ((sal_Unicode)'/' != puchr[len_base_dir - 1]) { rtl_uStringbuffer_insert_ascii( &tmp_file_path, &capacity, len_base_dir, "/", 1); offset_file_name++; } while(1) /* try until success */ { osl_gen_random_name_impl_(&rand_name); rtl_uStringbuffer_insert( &tmp_file_path, &capacity, offset_file_name, rtl_uString_getStr(rand_name), rtl_uString_getLength(rand_name)); osl_error = osl_getFileURLFromSystemPath( tmp_file_path, &tmp_file_url); if (osl_File_E_None == osl_error) { /* RW permission for the user only! */ mode_t old_mode = umask(077); osl_error = osl_openFile( tmp_file_url, file_handle, osl_File_OpenFlag_Read | osl_File_OpenFlag_Write | osl_File_OpenFlag_Create); umask(old_mode); } /* in case of error osl_File_E_EXIST we simply try again else we give up */ if ((osl_File_E_None == osl_error) || (osl_error != osl_File_E_EXIST)) { if (rand_name) rtl_uString_release(rand_name); if (tmp_file_url) rtl_uString_release(tmp_file_url); break; } } /* while(1) */ if (osl_File_E_None == osl_error) rtl_uString_assign(ppustr_temp_file_name, tmp_file_path); if (tmp_file_path) rtl_uString_release(tmp_file_path); return osl_error; }
oslProcessError SAL_CALL osl_joinProcessWithTimeout(oslProcess Process, const TimeValue* pTimeout) { oslProcessImpl* pChild = ChildList; oslProcessError osl_error = osl_Process_E_None; OSL_PRECOND(Process, "osl_joinProcess: Invalid parameter"); OSL_ASSERT(ChildListMutex); if (NULL == Process || 0 == ChildListMutex) return osl_Process_E_Unknown; osl_acquireMutex(ChildListMutex); /* check if process is a child of ours */ while (pChild != NULL) { if (pChild == (oslProcessImpl*)Process) break; pChild = pChild->m_pnext; } osl_releaseMutex(ChildListMutex); if (pChild != NULL) { oslConditionResult cond_res = osl_waitCondition(pChild->m_terminated, pTimeout); if (osl_cond_result_timeout == cond_res) osl_error = osl_Process_E_TimedOut; else if (osl_cond_result_ok != cond_res) osl_error = osl_Process_E_Unknown; } else /* alien process; StatusThread will not be able to set the condition terminated */ { pid_t pid = ((oslProcessImpl*)Process)->m_pid; if (pTimeout) { int timeout = 0; struct timeval tend; gettimeofday(&tend, NULL); tend.tv_sec += pTimeout->Seconds; while (!is_process_dead(pid) && ((timeout = is_timeout(&tend)) == 0)) sleep(1); if (timeout) osl_error = osl_Process_E_TimedOut; } else /* infinite */ { while (!is_process_dead(pid)) sleep(1); } } return osl_error; }