summaryrefslogtreecommitdiff
path: root/lib/common/FileStream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/common/FileStream.cpp')
-rw-r--r--lib/common/FileStream.cpp55
1 files changed, 41 insertions, 14 deletions
diff --git a/lib/common/FileStream.cpp b/lib/common/FileStream.cpp
index 57da9be8..9548ca72 100644
--- a/lib/common/FileStream.cpp
+++ b/lib/common/FileStream.cpp
@@ -1,4 +1,4 @@
-// distribution boxbackup-0.10 (svn version: 494)
+// distribution boxbackup-0.11rc1 (svn version: 2023_2024)
//
// Copyright (c) 2003 - 2006
// Ben Summers and contributors. All rights reserved.
@@ -48,6 +48,9 @@
#include "Box.h"
#include "FileStream.h"
#include "CommonException.h"
+#include "Logging.h"
+
+#include <errno.h>
#include "MemLeakFindOn.h"
@@ -68,13 +71,21 @@ FileStream::FileStream(const char *Filename, int flags, int mode)
mIsEOF(false)
{
#ifdef WIN32
- if(mOSFileHandle == 0)
+ if(mOSFileHandle == INVALID_HANDLE_VALUE)
#else
if(mOSFileHandle < 0)
#endif
{
MEMLEAKFINDER_NOT_A_LEAK(this);
- THROW_EXCEPTION(CommonException, OSFileOpenError)
+
+ if(errno == EACCES)
+ {
+ THROW_EXCEPTION(CommonException, AccessDenied)
+ }
+ else
+ {
+ THROW_EXCEPTION(CommonException, OSFileOpenError)
+ }
}
#ifdef WIN32
this->fileName = Filename;
@@ -85,7 +96,7 @@ FileStream::FileStream(const char *Filename, int flags, int mode)
// --------------------------------------------------------------------------
//
// Function
-// Name: FileStream::FileStream(int)
+// Name: FileStream::FileStream(tOSFileHandle)
// Purpose: Constructor, using existing file descriptor
// Created: 2003/08/28
//
@@ -94,11 +105,19 @@ FileStream::FileStream(tOSFileHandle FileDescriptor)
: mOSFileHandle(FileDescriptor),
mIsEOF(false)
{
+#ifdef WIN32
+ if(mOSFileHandle == INVALID_HANDLE_VALUE)
+#else
if(mOSFileHandle < 0)
+#endif
{
MEMLEAKFINDER_NOT_A_LEAK(this);
+ BOX_ERROR("FileStream: called with invalid file handle");
THROW_EXCEPTION(CommonException, OSFileOpenError)
}
+#ifdef WIN32
+ this->fileName = "HANDLE";
+#endif
}
#if 0
@@ -114,9 +133,14 @@ FileStream::FileStream(const FileStream &rToCopy)
: mOSFileHandle(::dup(rToCopy.mOSFileHandle)),
mIsEOF(rToCopy.mIsEOF)
{
+#ifdef WIN32
+ if(mOSFileHandle == INVALID_HANDLE_VALUE)
+#else
if(mOSFileHandle < 0)
+#endif
{
MEMLEAKFINDER_NOT_A_LEAK(this);
+ BOX_ERROR("FileStream: copying unopened file");
THROW_EXCEPTION(CommonException, OSFileOpenError)
}
}
@@ -168,8 +192,14 @@ int FileStream::Read(void *pBuffer, int NBytes, int Timeout)
{
r = numBytesRead;
}
+ else if (GetLastError() == ERROR_BROKEN_PIPE)
+ {
+ r = 0;
+ }
else
{
+ BOX_ERROR("Failed to read from file: " <<
+ GetErrorMessage(GetLastError()));
r = -1;
}
#else
@@ -233,7 +263,7 @@ void FileStream::Write(const void *pBuffer, int NBytes)
NULL
);
- if ( (res == 0) || (numBytesWritten != NBytes))
+ if ((res == 0) || (numBytesWritten != (DWORD)NBytes))
{
// DWORD err = GetLastError();
THROW_EXCEPTION(CommonException, OSFileWriteError)
@@ -304,7 +334,7 @@ void FileStream::Seek(IOStream::pos_type Offset, int SeekType)
conv.QuadPart = Offset;
DWORD retVal = SetFilePointer(this->mOSFileHandle, conv.LowPart, &conv.HighPart, ConvertSeekTypeToOSWhence(SeekType));
- if ( retVal == INVALID_SET_FILE_POINTER && (GetLastError() != NO_ERROR) )
+ if(retVal == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR)
{
THROW_EXCEPTION(CommonException, OSFileError)
}
@@ -330,25 +360,22 @@ void FileStream::Seek(IOStream::pos_type Offset, int SeekType)
// --------------------------------------------------------------------------
void FileStream::Close()
{
- if(mOSFileHandle < 0)
+ if(mOSFileHandle == INVALID_FILE)
{
THROW_EXCEPTION(CommonException, FileAlreadyClosed)
}
+
#ifdef WIN32
if(::CloseHandle(mOSFileHandle) == 0)
- {
- THROW_EXCEPTION(CommonException, OSFileCloseError)
- }
- mOSFileHandle = NULL;
- mIsEOF = true;
#else
if(::close(mOSFileHandle) != 0)
+#endif
{
THROW_EXCEPTION(CommonException, OSFileCloseError)
}
- mOSFileHandle = -1;
+
+ mOSFileHandle = INVALID_FILE;
mIsEOF = true;
-#endif
}