X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fseekable.cpp;h=a75cf33e67725fe6e978f98d927681cce59e16d5;hp=0c3b0b955f162e0d5d3b926cd7379b7aeab2e4f5;hb=1a6331551a025ddcc1772ae447c326ec70e0e107;hpb=7264384ae4dc1adaf861750516030826a8c91645 diff --git a/source/io/seekable.cpp b/source/io/seekable.cpp index 0c3b0b9..a75cf33 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