/* Compute the OOo md5 hash from 'pText' */ static rtl_uString * get_md5hash( rtl_uString *pText ) { rtl_uString *pResult = NULL; sal_Int32 nCapacity = 100; unsigned char *pData = NULL; sal_uInt32 nSize = 0; rtlDigest digest; sal_uInt32 md5_key_len = 0; sal_uInt8* md5_buf = NULL; sal_uInt32 i = 0; #if OSL_DEBUG_LEVEL > 1 rtl_String *pOut; #endif if ( !pText ) return NULL; #if OSL_DEBUG_LEVEL > 1 pOut = ustr_to_str( pText ); fprintf (stderr, "Generate pipe md5 for '%s'\n", pOut->buffer); rtl_string_release( pOut ); #endif pData = (unsigned char *)rtl_uString_getStr( pText ); nSize = rtl_uString_getLength( pText ) * sizeof( sal_Unicode ); if ( !pData ) return NULL; digest = rtl_digest_create( rtl_Digest_AlgorithmMD5 ); if ( digest == 0 ) return NULL; md5_key_len = rtl_digest_queryLength( digest ); md5_buf = (sal_uInt8 *)calloc( md5_key_len, sizeof( sal_uInt8 ) ); rtl_digest_init( digest, pData , nSize ); rtl_digest_update( digest, pData, nSize ); rtl_digest_get( digest, md5_buf, md5_key_len ); rtl_digest_destroy( digest ); /* create hex-value string from the MD5 value to keep the string size minimal */ rtl_uString_new_WithLength( &pResult, nCapacity ); for ( ; i < md5_key_len; ++i ) { char val[3]; snprintf( val, 3, "%x", md5_buf[i] ); /* sic! we ignore some of the 0's */ rtl_uStringbuffer_insert_ascii( &pResult, &nCapacity, rtl_uString_getLength( pResult ), val, strlen( val ) ); } /* cleanup */ free( md5_buf ); return pResult; }
/* Escape: "," -> "\\,", "\0" -> "\\0", "\\" -> "\\\\" */ static rtl_uString * escape_path( rtl_uString *pToEscape ) { rtl_uString *pBuffer = NULL; sal_Int32 nCapacity = 1000; sal_Int32 i = 0; sal_Int32 nEscapeLength = rtl_uString_getLength( pToEscape ); rtl_uString_new_WithLength( &pBuffer, nCapacity ); for ( ; i < nEscapeLength; ++i ) { sal_Unicode c = pToEscape->buffer[i]; switch ( c ) { case (sal_Unicode)'\0': rtl_uStringbuffer_insert_ascii( &pBuffer, &nCapacity, rtl_uString_getLength( pBuffer ), RTL_CONSTASCII_STRINGPARAM( "\\0" ) ); break; case (sal_Unicode)',': rtl_uStringbuffer_insert_ascii( &pBuffer, &nCapacity, rtl_uString_getLength( pBuffer ), RTL_CONSTASCII_STRINGPARAM( "\\," ) ); break; case (sal_Unicode)'\\': rtl_uStringbuffer_insert_ascii( &pBuffer, &nCapacity, rtl_uString_getLength( pBuffer ), RTL_CONSTASCII_STRINGPARAM( "\\\\" ) ); break; default: rtl_uStringbuffer_insert( &pBuffer, &nCapacity, rtl_uString_getLength( pBuffer ), &c, 1 ); } } return pBuffer; }
/* Send args to the OOo instance (using the 'fd' file descriptor) */ static sal_Bool send_args( int fd, rtl_uString *pCwdPath ) { rtl_uString *pBuffer = NULL, *pTmp = NULL; sal_Int32 nCapacity = 1000; rtl_String *pOut = NULL; sal_Bool bResult; size_t nLen; rtl_uString *pEscapedCwdPath = escape_path( pCwdPath ); sal_uInt32 nArg = 0; sal_uInt32 nArgCount = rtl_getAppCommandArgCount(); rtl_uString_new_WithLength( &pBuffer, nCapacity ); rtl_uString_new( &pTmp ); rtl_uStringbuffer_insert_ascii( &pBuffer, &nCapacity, rtl_uString_getLength( pBuffer ), RTL_CONSTASCII_STRINGPARAM( "InternalIPC::Arguments" ) ); if ( rtl_uString_getLength( pEscapedCwdPath ) ) { rtl_uStringbuffer_insert_ascii( &pBuffer, &nCapacity, rtl_uString_getLength( pBuffer ), RTL_CONSTASCII_STRINGPARAM( "1" ) ); rtl_uStringbuffer_insert( &pBuffer, &nCapacity, rtl_uString_getLength( pBuffer ), rtl_uString_getStr( pEscapedCwdPath ), rtl_uString_getLength( pEscapedCwdPath ) ); } else { rtl_uStringbuffer_insert_ascii( &pBuffer, &nCapacity, rtl_uString_getLength( pBuffer ), RTL_CONSTASCII_STRINGPARAM( "0" ) ); } for ( nArg = 0; nArg < nArgCount; ++nArg ) { rtl_uString *pEscapedTmp = NULL; rtl_uStringbuffer_insert_ascii( &pBuffer, &nCapacity, rtl_uString_getLength( pBuffer ), ",", 1 ); rtl_getAppCommandArg( nArg, &pTmp ); pEscapedTmp = escape_path( pTmp ); rtl_uStringbuffer_insert( &pBuffer, &nCapacity, rtl_uString_getLength( pBuffer ), rtl_uString_getStr( pEscapedTmp ), rtl_uString_getLength( pEscapedTmp ) ); rtl_uString_release( pEscapedTmp ); } if ( !rtl_convertUStringToString( &pOut, rtl_uString_getStr( pBuffer ), rtl_uString_getLength( pBuffer ), RTL_TEXTENCODING_UTF8, ( RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR ) ) ) { fprintf( stderr, "ERROR: cannot convert arguments to UTF-8\n" ); exit( 1 ); } nLen = rtl_string_getLength( pOut ) + 1; bResult = ( write( fd, rtl_string_getStr( pOut ), nLen ) == (ssize_t) nLen ); if ( bResult ) { char resp[ strlen( "InternalIPC::ProcessingDone" ) ]; ssize_t n = read( fd, resp, SAL_N_ELEMENTS( resp ) ); bResult = n == (ssize_t) SAL_N_ELEMENTS( resp ) && (memcmp( resp, "InternalIPC::ProcessingDone", SAL_N_ELEMENTS( resp ) ) == 0); } /* cleanup */ rtl_uString_release( pEscapedCwdPath ); rtl_uString_release( pBuffer ); rtl_uString_release( pTmp ); rtl_string_release( pOut ); return bResult; }
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; }