$OpenBSD: patch-src_tools_qfile_unix_cpp,v 1.2 2007/03/31 22:49:46 espie Exp $ --- src/tools/qfile_unix.cpp.orig Thu Oct 19 16:25:03 2006 +++ src/tools/qfile_unix.cpp Sat Mar 31 14:51:25 2007 @@ -53,6 +53,17 @@ static inline int qt_open(const char *pathname, int fl #include #include +class QFilePrivate +{ +public: + QString errorString; + int lastAccess; +}; + +#define ACCESS_NONE -1 +#define ACCESS_READ 0 +#define ACCESS_WRITE 1 + extern const char* qt_fileerr_read; bool qt_file_access( const QString& fn, int t ) @@ -522,6 +533,7 @@ bool QFile::at( Offset pos ) #else ok = ( ::fseek(fh, pos, SEEK_SET) == 0 ); #endif + d->lastAccess = ACCESS_NONE; } if ( ok ) #if defined(QT_LARGEFILE_SUPPORT) && !defined(QT_ABI_QT4) @@ -590,6 +602,10 @@ Q_LONG QFile::readBlock( char *p, Q_ULONG len ) setErrorStringErrno( errno ); } } else { // buffered file + if (d->lastAccess == ACCESS_WRITE) { + ::fseek(fh, 0, SEEK_CUR); + d->lastAccess = ACCESS_READ; + } nread += fread( p, 1, len-nread, fh ); if ( (uint)nread != len ) { if ( ferror( fh ) || nread==0 ) { @@ -641,8 +657,13 @@ Q_LONG QFile::writeBlock( const char *p, Q_ULONG len ) Q_ULONG nwritten; // number of bytes written if ( isRaw() ) // raw file nwritten = ::write( fd, (void *)p, len ); - else // buffered file + else { // buffered file + if (d->lastAccess == ACCESS_READ) { + ::fseek(fh, 0, SEEK_CUR); + d->lastAccess = ACCESS_WRITE; + } nwritten = fwrite( p, 1, len, fh ); + } if ( nwritten != len ) { // write error if ( errno == ENOSPC ) // disk is full setStatus( IO_ResourceError );