1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_desktop.hxx" 26 27 #include <sal/main.h> 28 #include <osl/process.h> 29 #include <rtl/ustring.hxx> 30 31 #include "../../../source/inc/exithelper.hxx" 32 33 using namespace rtl; 34 using namespace desktop; 35 36 SAL_IMPLEMENT_MAIN() 37 { 38 oslProcess process; 39 oslProcessError error; 40 41 OUString sExecutableFile; 42 rtl_uString **pCommandArgs; 43 sal_uInt32 nCommandArgs; 44 45 osl_getExecutableFile( &sExecutableFile.pData ); 46 47 sExecutableFile += OUString( RTL_CONSTASCII_USTRINGPARAM(".bin") ); 48 49 nCommandArgs = osl_getCommandArgCount(); 50 pCommandArgs = new rtl_uString *[nCommandArgs]; 51 52 for ( sal_uInt32 i = 0; i < nCommandArgs; i++ ) 53 { 54 pCommandArgs[i] = NULL; 55 osl_getCommandArg( i, &pCommandArgs[i] ); 56 } 57 58 bool bRestart = false; 59 bool bFirstRun = true; 60 oslProcessExitCode exitcode = 255; 61 62 do { 63 error = osl_executeProcess( 64 sExecutableFile.pData, 65 bFirstRun ? pCommandArgs : NULL, 66 bFirstRun ? nCommandArgs : 0, 67 0, 68 NULL, 69 NULL, 70 NULL, 71 0, 72 &process 73 ); 74 75 if ( osl_Process_E_None == error ) 76 { 77 oslProcessInfo info; 78 79 info.Size = sizeof(info); 80 81 error = osl_joinProcess( process ); 82 if ( osl_Process_E_None != error ) 83 break; 84 85 error = osl_getProcessInfo( process, osl_Process_EXITCODE, &info ); 86 if ( osl_Process_E_None != error ) 87 break; 88 89 if ( info.Fields & osl_Process_EXITCODE ) 90 { 91 exitcode = info.Code; 92 bRestart = (ExitHelper::E_CRASH_WITH_RESTART == exitcode || ExitHelper::E_NORMAL_RESTART == exitcode); 93 } 94 else 95 break; 96 97 osl_freeProcessHandle( process ); 98 99 } 100 101 bFirstRun = false; 102 103 } while ( bRestart ); 104 105 return exitcode; 106 } 107