author | ar <ar> | 2004-06-13 17:46:33 (UTC) |
---|---|---|
committer | ar <ar> | 2004-06-13 17:46:33 (UTC) |
commit | ecf1fb42bef9d64869349abd4e550f0b6d2cfa59 (patch) (side-by-side diff) | |
tree | 2001746dd484b155d04b7f1500b14538bf0b8b08 | |
parent | 07d700581b9f608d3105eb8d82d9b4cfa0084317 (diff) | |
download | opie-ecf1fb42bef9d64869349abd4e550f0b6d2cfa59.zip opie-ecf1fb42bef9d64869349abd4e550f0b6d2cfa59.tar.gz opie-ecf1fb42bef9d64869349abd4e550f0b6d2cfa59.tar.bz2 |
- fix error-handling again ;)
-rw-r--r-- | library/filemanager.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/library/filemanager.cpp b/library/filemanager.cpp index 99837fe..adfe590 100644 --- a/library/filemanager.cpp +++ b/library/filemanager.cpp @@ -181,194 +181,194 @@ bool FileManager::copyFile( const AppLnk &src, const AppLnk &dest ) if ( !sf.open( IO_ReadOnly ) ) return FALSE; QString fn = dest.file() + ".new"; ensurePathExists( fn ); QFile df( fn ); if ( !df.open( IO_WriteOnly|IO_Raw ) ) return FALSE; const int bufsize = 16384; char buffer[bufsize]; bool ok = TRUE; int bytesRead = 0; while ( ok && !sf.atEnd() ) { bytesRead = sf.readBlock( buffer, bufsize ); if ( bytesRead < 0 ) ok = FALSE; while ( ok && bytesRead > 0 ) { int bytesWritten = df.writeBlock( buffer, bytesRead ); if ( bytesWritten < 0 ) ok = FALSE; else bytesRead -= bytesWritten; } } if ( ok ) ok = dest.writeLink(); if ( ok ) { // okay now rename the file... if ( !renameFile( fn.latin1(), dest.file().latin1() ) ) { qWarning( "problem renaming file %s to %s, errno: %d", fn.latin1(), dest.file().latin1(), errno ); // remove the tmp file, otherwise, it will just lay around... QFile::remove( fn.latin1() ); } } else { QFile::remove( fn.latin1() ); } return ok; } bool FileManager::copyFile( const QString & src, const QString & dest ) { bool success = true; struct stat status; int read_fd=0; int write_fd=0; struct stat stat_buf; off_t offset = 0; QFile srcFile(src); QFile destFile(dest); if(!srcFile.open( IO_ReadOnly|IO_Raw)) { return success = false; } read_fd = srcFile.handle(); if(read_fd != -1) { fstat (read_fd, &stat_buf); if( !destFile.open( IO_WriteOnly|IO_Raw ) ) return success = false; write_fd = destFile.handle(); if(write_fd != -1) { int err=0; QString msg; #ifdef Q_OS_MACX #ifdef SENDFILE /* FreeBSD does support a different kind of * sendfile. (eilers) * I took this from Very Secure FTPd * Licence: GPL * Author: Chris Evans * sysdeputil.c */ /* XXX - start_pos will truncate on 32-bit machines - can we * say "start from current pos"? */ off_t written = 0; int retval = 0; retval = sendfile(read_fd, write_fd, offset, stat_buf.st_size, NULL, &written, 0); /* Translate to Linux-like retval */ if (written > 0) { err = (int) written; } #else /* SENDFILE */ err == -1; msg = "FAILURE: Using unsupported function \"sendfile()\" Need Workaround !!"; success = false; # warning "Need workaround for sendfile!!(eilers)" #endif /* SENDFILE */ #else err = sendfile(write_fd, read_fd, &offset, stat_buf.st_size); - if( err != -1) { - switch(err) { + if( err == -1) { + switch(errno) { case EBADF : msg = "The input file was not opened for reading or the output file was not opened for writing. "; case EINVAL: msg = "Descriptor is not valid or locked. "; case ENOMEM: msg = "Insufficient memory to read from in_fd."; case EIO: msg = "Unspecified error while reading from in_fd."; }; success = false; } #endif /* Q_OS_MACX */ if( !success ) qWarning( msg ); } else { qWarning("open write failed %s, %s",src.latin1(), dest.latin1()); success = false; } } else { qWarning("open read failed %s, %s",src.latin1(), dest.latin1()); success = false; } srcFile.close(); destFile.close(); // Set file permissions if( stat( (const char *) src, &status ) == 0 ) { chmod( (const char *) dest, status.st_mode ); } return success; } bool FileManager::renameFile( const QString & src, const QString & dest ) { if(copyFile( src, dest )) { if(QFile::remove(src) ) { return true; } } return false; } /* bool FileManager::copyFile( const QString & src, const QString & dest ) { bool success = true; struct stat status; int read_fd=0; int write_fd=0; struct stat stat_buf; off_t offset = 0; QFile srcFile(src); QFile destFile(dest); if(!srcFile.open( IO_ReadOnly|IO_Raw)) { return success = false; } read_fd = srcFile.handle(); if(read_fd != -1) { fstat (read_fd, &stat_buf); if( !destFile.open( IO_WriteOnly|IO_Raw ) ) return success = false; write_fd = destFile.handle(); if(write_fd != -1) { int err=0; QString msg; err = sendfile(write_fd, read_fd, &offset, stat_buf.st_size); if( err == -1) { switch(err) { case EBADF : msg = "The input file was not opened for reading or the output file was not opened for writing. "; case EINVAL: msg = "Descriptor is not valid or locked. "; case ENOMEM: msg = "Insufficient memory to read from in_fd."; case EIO: msg = "Unspecified error while reading from in_fd."; }; success = false; } } else { qWarning("open write failed %s, %s",src.latin1(), dest.latin1()); success = false; } } else { qWarning("open read failed %s, %s",src.latin1(), dest.latin1()); success = false; } srcFile.close(); destFile.close(); // Set file permissions if( stat( (const char *) src, &status ) == 0 ) { chmod( (const char *) dest, status.st_mode ); } return success; } bool FileManager::renameFile( const QString & src, const QString & dest ) { if(copyFile( src, dest )) { if(QFile::remove(src) ) { return true; } } |