X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fseekable.cpp;h=35ab5a05104fef55fbe625a3e55cdff2d1b18590;hp=0c3b0b955f162e0d5d3b926cd7379b7aeab2e4f5;hb=42ff7c629b2aa7411963bdcc2259a06b1d1de6d3;hpb=9ef362fabde5092288a8f59e6dae503c83a9462c diff --git a/source/io/seekable.cpp b/source/io/seekable.cpp index 0c3b0b9..35ab5a0 100644 --- a/source/io/seekable.cpp +++ b/source/io/seekable.cpp @@ -1,11 +1,12 @@ #ifndef WIN32 #define _LARGEFILE64_SOURCE +#include #include #else #include #endif -#include #include +#include #include "handle.h" #include "handle_private.h" #include "seekable.h" @@ -43,6 +44,14 @@ int sys_seek_type(SeekType st) namespace Msp { namespace IO { +bad_seek::bad_seek(SeekOffset offset, SeekType type): + runtime_error(type==S_BEG ? lexical_cast(offset) : + type==S_CUR ? format("CUR%+d", offset) : + type==S_END ? format("END%+d", offset) : + format("SeekType(%d)", type)) +{ } + + SeekOffset sys_seek(Handle &handle, SeekOffset offset, SeekType type) { #ifdef WIN32 @@ -59,7 +68,12 @@ SeekOffset sys_seek(Handle &handle, SeekOffset offset, SeekType type) #else off64_t ret = lseek64(*handle, offset, sys_seek_type(type)); if(ret==(off64_t)-1) - throw system_error("lseek64"); + { + if(errno==EINVAL) + throw bad_seek(offset, type); + else + throw system_error("lseek64"); + } return ret; #endif