oslProcessError SAL_CALL osl_executeProcess( rtl_uString *ustrImageName, rtl_uString *ustrArguments[], sal_uInt32 nArguments, oslProcessOption Options, oslSecurity Security, rtl_uString *ustrWorkDir, rtl_uString *ustrEnvironment[], sal_uInt32 nEnvironmentVars, oslProcess *pProcess ) { return osl_executeProcess_WithRedirectedIO( ustrImageName, ustrArguments, nArguments, Options, Security, ustrWorkDir, ustrEnvironment, nEnvironmentVars, pProcess, NULL, NULL, NULL ); }
static void exec_javaldx (Args *args) { char newpath[4096]; sal_uInt32 nArgs; rtl_uString *pApp; rtl_uString **ppArgs; rtl_uString *pTmp, *pTmp2; oslProcess javaldx = NULL; oslFileHandle fileOut= NULL; oslProcessError err; ppArgs = (rtl_uString **)calloc( args->nArgsEnv + 2, sizeof( rtl_uString* ) ); for ( nArgs = 0; nArgs < args->nArgsEnv; ++nArgs ) ppArgs[nArgs] = args->ppArgs[nArgs]; /* Use absolute path to redirectrc */ pTmp = NULL; rtl_uString_newFromAscii( &pTmp, "-env:INIFILENAME=vnd.sun.star.pathname:" ); rtl_uString_newConcat( &pTmp, pTmp, args->pAppPath ); pTmp2 = NULL; rtl_uString_newFromAscii( &pTmp2, "redirectrc" ); rtl_uString_newConcat( &pTmp, pTmp, pTmp2 ); ppArgs[nArgs] = pTmp; rtl_uString_release (pTmp2); nArgs++; /* And also to javaldx */ pApp = NULL; rtl_uString_newFromAscii( &pApp, "file://" ); rtl_uString_newConcat( &pApp, pApp, args->pAppPath ); pTmp = NULL; rtl_uString_newFromAscii( &pTmp, "javaldx" ); rtl_uString_newConcat( &pApp, pApp, pTmp ); rtl_uString_release( pTmp ); err = osl_executeProcess_WithRedirectedIO( pApp, ppArgs, nArgs, osl_Process_NORMAL, NULL, // security NULL, // work dir NULL, 0, &javaldx, // process handle NULL, &fileOut, NULL); rtl_uString_release( ppArgs[nArgs-1] ); rtl_uString_release( pApp ); free( ppArgs ); if( err != osl_Process_E_None) { fprintf (stderr, "Warning: failed to launch javaldx - java may not function correctly\n"); if (javaldx) osl_freeProcessHandle(javaldx); if (fileOut) osl_closeFile(fileOut); return; } else { char *chomp; sal_uInt64 bytes_read; /* Magically osl_readLine doesn't work with pipes with E_SPIPE - so be this lame instead: */ while (osl_readFile (fileOut, newpath, SAL_N_ELEMENTS (newpath), &bytes_read) == osl_File_E_INTR); if (bytes_read <= 0) { fprintf (stderr, "Warning: failed to read path from javaldx\n"); if (javaldx) osl_freeProcessHandle(javaldx); if (fileOut) osl_closeFile(fileOut); return; } newpath[bytes_read] = '\0'; if ((chomp = strstr (newpath, "\n"))) *chomp = '\0'; } extend_library_path (newpath); if (javaldx) osl_freeProcessHandle(javaldx); if (fileOut) osl_closeFile(fileOut); }