diff --git a/src/core/archive.cpp b/src/core/archive.cpp index 6075f79..ab4e7cf 100644 --- a/src/core/archive.cpp +++ b/src/core/archive.cpp @@ -671,7 +671,8 @@ void cFileArchive::OpenRead(const TCHAR* filename, uint32 openFlags) flags |= ( ( openFlags & FA_OPEN_TEXT ) ? cFile::OPEN_TEXT : 0 ); flags |= ( ( openFlags & FA_SCANNING ) ? cFile::OPEN_SCANNING : 0 ); flags |= ( ( openFlags & FA_DIRECT ) ? cFile::OPEN_DIRECT : 0 ); - + + mOpenFlags = openFlags; mCurrentFilename = filename; mCurrentFile.Open( filename, flags ); isWritable = false; @@ -699,6 +700,7 @@ void cFileArchive::OpenReadWrite(const TCHAR* filename, uint32 openFlags) flags |= ( ( openFlags & FA_SCANNING ) ? cFile::OPEN_SCANNING : 0 ); flags |= ( ( openFlags & FA_DIRECT ) ? cFile::OPEN_DIRECT : 0 ); + mOpenFlags = openFlags; mCurrentFilename = filename; mCurrentFile.Open( filename, flags ); isWritable = true; @@ -746,9 +748,10 @@ void cFileArchive::Close() ///////////////////////////////////////////////////////////////////////// int cFileArchive::Read(void* pDest, int count) { + try { - if ( mReadHead + count > mFileSize ) + if ( mReadHead + count > mFileSize && !(mOpenFlags & FA_DIRECT)) count = static_cast( mFileSize - mReadHead ); if ( pDest != NULL ) diff --git a/src/core/archive.h b/src/core/archive.h index b5e485b..d70d977 100644 --- a/src/core/archive.h +++ b/src/core/archive.h @@ -293,6 +293,7 @@ protected: bool isWritable; cFile mCurrentFile; TSTRING mCurrentFilename; //current file + uint32 mOpenFlags; }; /////////////////////////////////////////////////////////////// diff --git a/src/core/file_unix.cpp b/src/core/file_unix.cpp index 6a9225d..c5f6b3c 100644 --- a/src/core/file_unix.cpp +++ b/src/core/file_unix.cpp @@ -62,22 +62,6 @@ #include "core/fsservices.h" #include "core/errorutil.h" -/////////////////////////////////////////////////////////////////////////////// -// util_GetErrnoString -- return the result of strerror(errno) as a tstring -/////////////////////////////////////////////////////////////////////////////// -/*static TSTRING util_GetErrnoString() -{ - TSTRING ret; - char* pErrorStr = strerror(errno); -#ifdef _UNICODE -#error We dont currently support unicode on unix -#else - ret = pErrorStr; -#endif - return ret; -}*/ - -/////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// // cFile_i : Insulated implementation for cFile objects. /////////////////////////////////////////////////////////////////////////// @@ -87,6 +71,7 @@ struct cFile_i cFile_i(); ~cFile_i(); + int m_fd; //underlying file descriptor FILE* mpCurrStream; //currently defined file stream TSTRING mFileName; //the name of the file we are currently referencing. uint32 mFlags; //Flags used to open the file @@ -218,6 +203,7 @@ void cFile::Open( const TSTRING& sFileNameC, uint32 flags ) { throw( eFileOpen( sFileName, iFSServices::GetInstance()->GetErrString() ) ); } + mpData->m_fd = fh; #if !IS_AROS if( flags & OPEN_LOCKED_TEMP ) @@ -263,7 +249,7 @@ void cFile::Open( const TSTRING& sFileNameC, uint32 flags ) #ifdef HAVE_POSIX_FADVISE - if (flags & OPEN_SCANNING) + if (flags & OPEN_SCANNING && !(flags & OPEN_DIRECT)) { posix_fadvise(fh,0,0, POSIX_FADV_SEQUENTIAL); posix_fadvise(fh,0,0, POSIX_FADV_NOREUSE); @@ -363,12 +349,19 @@ cFile::File_t cFile::Read( void* buffer, File_t nBytes ) const //throw(eFile) if( nBytes == 0 ) return 0; - iBytesRead = fread( buffer, sizeof(byte), nBytes, mpData->mpCurrStream ); - - if( ferror( mpData->mpCurrStream ) != 0 ) - throw eFileRead( mpData->mFileName, iFSServices::GetInstance()->GetErrString() ) ; - else - return iBytesRead; + if (mpData->mFlags & OPEN_DIRECT) { + iBytesRead = read(mpData->m_fd, buffer, nBytes); + if (iBytesRead<0) { + throw eFileRead(mpData->mFileName, iFSServices::GetInstance()->GetErrString()); + } + } else { + iBytesRead = fread( buffer, sizeof(byte), nBytes, mpData->mpCurrStream ); + if( ferror( mpData->mpCurrStream ) != 0 ) { + throw eFileRead( mpData->mFileName, iFSServices::GetInstance()->GetErrString() ) ; + } + } + + return iBytesRead; } /////////////////////////////////////////////////////////////////////////// diff --git a/src/fco/signature.cpp b/src/fco/signature.cpp index 0316d5e..e3c9739 100644 --- a/src/fco/signature.cpp +++ b/src/fco/signature.cpp @@ -41,6 +41,7 @@ #include #include "fcoundefprop.h" #include "core/archive.h" +#include "core/debug.h" #ifndef HAVE_OPENSSL_MD5_H # ifdef HAVE_STRINGS_H # include /* for bcopy(), this is only needed for Solaris */ @@ -107,10 +108,15 @@ bool cArchiveSigGen::s_direct = false; void cArchiveSigGen::SetBlocks( int32 n ) { + cDebug d("cArchiveSigGen::SetBlocks"); + s_blocks=n; - s_base = new byte[iSignature::SUGGESTED_BLOCK_SIZE * (s_blocks+1)]; - unsigned long nMod = (unsigned long)s_base % iSignature::SUGGESTED_BLOCK_SIZE; - s_buf = s_base + (iSignature::SUGGESTED_BLOCK_SIZE - nMod); + d.TraceDebug("Num blocks = %u\n", s_blocks); + s_base = new byte[iSignature::SUGGESTED_BLOCK_SIZE * (s_blocks+2)]; + unsigned long mod = (unsigned long)s_base % iSignature::SUGGESTED_BLOCK_SIZE; + unsigned long offset = (iSignature::SUGGESTED_BLOCK_SIZE - mod); + d.TraceDebug("mod = %u | offset = %u\n", mod, offset); + s_buf = s_base + offset; s_bytes = iSignature::SUGGESTED_BLOCK_SIZE * s_blocks; } diff --git a/src/tripwire/twcmdline.cpp b/src/tripwire/twcmdline.cpp index fa02298..a5d048b 100644 --- a/src/tripwire/twcmdline.cpp +++ b/src/tripwire/twcmdline.cpp @@ -435,7 +435,7 @@ static void FillOutConfigInfo(cTWModeCommon* pModeInfo, const cConfigFile& cf) } int blocks = 0; - if (cf.Lookup(TSTRING(_T("HASH_DIRECT")), str)) + if (cf.Lookup(TSTRING(_T("HASH_DIRECT_IO")), str)) { if (_tcsicmp(str.c_str(), _T("true")) == 0) {