ProDOS/Posix Exceptions

git-svn-id: https://profuse.googlecode.com/svn/branches/v2@124 aa027e90-d47c-11dd-86d7-074df07e0730
This commit is contained in:
ksherlock 2009-12-02 01:19:34 +00:00
parent b3334ac210
commit b660593d25
3 changed files with 58 additions and 22 deletions

View File

@ -11,20 +11,36 @@ class Exception : public std::exception
public: public:
Exception(const char *cp); Exception(const char *cp);
Exception(const std::string &str); Exception(const std::string &str);
Exception(const char *cp, int error);
Exception(const std::string& string, int error);
virtual ~Exception() throw (); virtual ~Exception() throw ();
virtual const char *what(); virtual const char *what();
int error() const; int error() const { return _error; }
protected:
Exception(const char *cp, int error);
Exception(const std::string& string, int error);
private: private:
int _error; int _error;
std::string _string; std::string _string;
}; };
class POSIXException : public Exception {
public:
POSIXException(const char *cp, int error);
POSIXException(const std::string& string, int error);
};
class ProDOSException : public Exception {
public:
ProDOSException(const char *cp, int error);
ProDOSException(const std::string& string, int error);
};
inline Exception::Exception(const char *cp): inline Exception::Exception(const char *cp):
_error(0), _error(0),
_string(cp) _string(cp)
@ -49,11 +65,28 @@ inline Exception::Exception(const std::string& string, int error):
{ {
} }
inline int Exception::error() const inline POSIXException::POSIXException(const char *cp, int error) :
Exception(cp, error)
{ {
return _error;
} }
inline POSIXException::POSIXException(const std::string& string, int error) :
Exception(string, error)
{
}
inline ProDOSException::ProDOSException(const char *cp, int error) :
Exception(cp, error)
{
}
inline ProDOSException::ProDOSException(const std::string& string, int error) :
Exception(string, error)
{
}
} }
#endif #endif

View File

@ -36,7 +36,7 @@ MappedFile::MappedFile(const char *name, bool readOnly)
if (fd < 0) if (fd < 0)
{ {
throw Exception(__METHOD__ ": Unable to open file.", errno); throw POSIXException(__METHOD__ ": Unable to open file.", errno);
} }
// init may throw; auto_fd guarantees the file will be closed if that happens. // init may throw; auto_fd guarantees the file will be closed if that happens.
init(fd, readOnly); init(fd, readOnly);
@ -63,12 +63,12 @@ MappedFile::MappedFile(const char *name, size_t size)
auto_fd fd(::open(name, O_CREAT | O_TRUNC | O_RDWR, 0644)); auto_fd fd(::open(name, O_CREAT | O_TRUNC | O_RDWR, 0644));
if (fd < 0) if (fd < 0)
throw Exception(__METHOD__ ": Unable to create file.", errno); throw POSIXException(__METHOD__ ": Unable to create file.", errno);
// TODO -- is ftruncate portable? // TODO -- is ftruncate portable?
if (::ftruncate(fd, _size) < 0) if (::ftruncate(fd, _size) < 0)
{ {
throw Exception(__METHOD__ ": Unable to truncate file.", errno); throw POSIXException(__METHOD__ ": Unable to truncate file.", errno);
} }
//_map = ::mmap(NULL, _size, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, _fd, 0); //_map = ::mmap(NULL, _size, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, _fd, 0);
@ -80,7 +80,7 @@ MappedFile::MappedFile(const char *name, size_t size)
MAP_FILE | MAP_SHARED MAP_FILE | MAP_SHARED
); );
if (map == MAP_FAILED) throw Exception(__METHOD__ ": Unable to map file.", errno); if (map == MAP_FAILED) throw POSIXException(__METHOD__ ": Unable to map file.", errno);
_fd = fd.release(); _fd = fd.release();
_map = map.release(); _map = map.release();
@ -110,7 +110,7 @@ void MappedFile::init(int f, bool readOnly)
_size = ::lseek(f, 0, SEEK_END); _size = ::lseek(f, 0, SEEK_END);
if (_size < 0) if (_size < 0)
throw Exception(__METHOD__ ": Unable to determine file size.", errno); throw POSIXException(__METHOD__ ": Unable to determine file size.", errno);
/* /*
_map = ::mmap(NULL, _size, readOnly ? PROT_READ : PROT_READ | PROT_WRITE, _map = ::mmap(NULL, _size, readOnly ? PROT_READ : PROT_READ | PROT_WRITE,
@ -123,7 +123,7 @@ void MappedFile::init(int f, bool readOnly)
readOnly ? MAP_FILE : MAP_FILE | MAP_SHARED readOnly ? MAP_FILE : MAP_FILE | MAP_SHARED
); );
if (map == MAP_FAILED) throw Exception(__METHOD__ ": Unable to map file.", errno); if (map == MAP_FAILED) throw POSIXException(__METHOD__ ": Unable to map file.", errno);
_fd = f; _fd = f;
_map = map.release(); _map = map.release();
@ -227,7 +227,7 @@ void MappedFile::sync()
if (_readOnly) return; if (_readOnly) return;
if (::msync(_map, _size, MS_SYNC) < 0) if (::msync(_map, _size, MS_SYNC) < 0)
throw Exception(__METHOD__ ": msync error.", errno); throw POSIXException(__METHOD__ ": msync error.", errno);
} }
void MappedFile::reset() void MappedFile::reset()

View File

@ -36,7 +36,7 @@ void RawDevice::devSize(int fd)
struct dk_minfo minfo; struct dk_minfo minfo;
if (::ioctl(fd, DKIOCGMEDIAINFO, &minfo) < 0) if (::ioctl(fd, DKIOCGMEDIAINFO, &minfo) < 0)
throw Exception(__METHOD__ ": Unable to determine device size.", errno); throw POSIXException(__METHOD__ ": Unable to determine device size.", errno);
_size = minfo.dki_lbsize * minfo.dki_capacity; _size = minfo.dki_lbsize * minfo.dki_capacity;
_blockSize = 512; // not really, but whatever. _blockSize = 512; // not really, but whatever.
@ -55,11 +55,11 @@ void RawDevice::devSize(int fd)
uint64_t blockCount; // 64 bit uint64_t blockCount; // 64 bit
if (::ioctl(fd, DKIOCGETBLOCKSIZE, &blockSize) < 0) if (::ioctl(fd, DKIOCGETBLOCKSIZE, &blockSize) < 0)
throw Exception(__METHOD__ ": Unable to determine block size.", errno); throw POSIXException(__METHOD__ ": Unable to determine block size.", errno);
if (::ioctl(fd, DKIOCGETBLOCKCOUNT, &blockCount) < 0) if (::ioctl(fd, DKIOCGETBLOCKCOUNT, &blockCount) < 0)
throw Exception(__METHOD__ ": Unable to determine block count.", errno); throw POSIXException(__METHOD__ ": Unable to determine block count.", errno);
_blockSize = blockSize; _blockSize = blockSize;
_size = _blockSize * blockCount; _size = _blockSize * blockCount;
@ -79,7 +79,7 @@ void RawDevice::devSize(int fd)
int blocks; int blocks;
if (::ioctl(fd, BLKGETSIZE, &blocks) < 0) if (::ioctl(fd, BLKGETSIZE, &blocks) < 0)
throw Exception(__METHOD__ ": Unable to determine device size.", errno); throw POSIXException(__METHOD__ ": Unable to determine device size.", errno);
_size = 512 * blocks; _size = 512 * blocks;
_blockSize = 512; // _blockSize = 512; //
@ -110,7 +110,7 @@ RawDevice::RawDevice(const char *name, bool readOnly)
} }
if (fd < 0) if (fd < 0)
throw Exception(__METHOD__ ": Unable to open device.", errno); throw POSIXException(__METHOD__ ": Unable to open device.", errno);
_fd = -1; _fd = -1;
@ -147,8 +147,10 @@ void RawDevice::read(unsigned block, void *bp)
// TODO -- EINTR? // TODO -- EINTR?
if (ok != 512) if (ok != 512)
throw Exception(__METHOD__ ": Error reading block.", throw ok < 0
ok < 0 ? errno : 0); ? POSIXException(__METHOD__ ": Error reading block.", errno)
: Exception(__METHOD__ ": Error reading block.");
} }
@ -166,8 +168,9 @@ void RawDevice::write(unsigned block, const void *bp)
size_t ok = ::pwrite(_fd, bp, 512, block * 512); size_t ok = ::pwrite(_fd, bp, 512, block * 512);
if (ok != 512) if (ok != 512)
throw Exception(__METHOD__ ": Error writing block.", throw ok < 0
ok < 0 ? errno : 0); ? POSIXException(__METHOD__ ": Error writing block.", errno)
: Exception(__METHOD__ ": Error writing block.");
} }
@ -184,5 +187,5 @@ void RawDevice::sync()
if (_readOnly) return; if (_readOnly) return;
if (::fsync(_fd) < 0) if (::fsync(_fd) < 0)
throw Exception(__METHOD__ ": fsync error.", errno); throw POSIXException(__METHOD__ ": fsync error.", errno);
} }