// seek
wxFileOffset wxFile::Seek(wxFileOffset ofs, wxSeekMode mode)
{
- wxASSERT_MSG( IsOpened(), _T("can't seek on closed file") );
+ wxASSERT_MSG( IsOpened(), wxT("can't seek on closed file") );
wxCHECK_MSG( ofs != wxInvalidOffset || mode != wxFromStart,
wxInvalidOffset,
- _T("invalid absolute file offset") );
+ wxT("invalid absolute file offset") );
int origin;
switch ( mode ) {
default:
- wxFAIL_MSG(_T("unknown seek origin"));
+ wxFAIL_MSG(wxT("unknown seek origin"));
case wxFromStart:
origin = SEEK_SET;
{
wxASSERT( IsOpened() );
+ // we use a special method for Linux systems where files in sysfs (i.e.
+ // those under /sys typically) return length of 4096 bytes even when
+ // they're much smaller -- this is a problem as it results in errors later
+ // when we try reading 4KB from them
+#ifdef __LINUX__
+ struct stat st;
+ if ( fstat(m_fd, &st) == 0 )
+ {
+ // returning 0 for the special files indicates to the caller that they
+ // are not seekable
+ return st.st_blocks ? st.st_size : 0;
+ }
+ //else: failed to stat, try the normal method
+#endif // __LINUX__
+
wxFileOffset iRc = Tell();
if ( iRc != wxInvalidOffset ) {
// have to use const_cast :-(
iRc = wxEof(m_fd);
#endif // Windows/Unix
- if ( iRc == 1)
- {}
- else if ( iRc == 0 )
+ if ( iRc == 0 )
return false;
- else if ( iRc == wxInvalidOffset )
+
+ if ( iRc == wxInvalidOffset )
+ {
wxLogSysError(_("can't determine if the end of file is reached on descriptor %d"), m_fd);
- else
- wxFAIL_MSG(_T("invalid eof() return value."));
+ }
+ else if ( iRc != 1 )
+ {
+ wxFAIL_MSG(wxT("invalid eof() return value."));
+ }
return true;
}
{
m_file.Close();
if ( wxRemove(m_strTemp) != 0 )
+ {
wxLogSysError(_("can't remove temporary file '%s'"), m_strTemp.c_str());
+ }
}
#endif // wxUSE_FILE