X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fseekable.cpp;h=35ab5a05104fef55fbe625a3e55cdff2d1b18590;hp=12ff6aa11dc26bc9bc4ffe5af5d5e07150e62443;hb=42ff7c629b2aa7411963bdcc2259a06b1d1de6d3;hpb=a56e05106571f28dc3044296849ccd5127d7d859 diff --git a/source/io/seekable.cpp b/source/io/seekable.cpp index 12ff6aa..35ab5a0 100644 --- a/source/io/seekable.cpp +++ b/source/io/seekable.cpp @@ -1,10 +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" @@ -42,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 @@ -58,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