X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Funix%2Fseekable.cpp;fp=source%2Fio%2Funix%2Fseekable.cpp;h=2c17114df3d617a1037e3ee6167cff051249fc88;hp=0000000000000000000000000000000000000000;hb=609c9a508cfdc7b42c46c4f21d17639204165a00;hpb=b4806214e905752617691f851717033fd3f266c2 diff --git a/source/io/unix/seekable.cpp b/source/io/unix/seekable.cpp new file mode 100644 index 0000000..2c17114 --- /dev/null +++ b/source/io/unix/seekable.cpp @@ -0,0 +1,47 @@ +#define _LARGEFILE64_SOURCE +#include +#include +#include +#include "handle.h" +#include "handle_private.h" +#include "seekable.h" + +using namespace std; + +namespace { + +using namespace Msp::IO; + +int sys_seek_type(SeekType st) +{ + if(st==S_BEG) + return SEEK_SET; + else if(st==S_CUR) + return SEEK_CUR; + else if(st==S_END) + return SEEK_END; + + throw invalid_argument("sys_seek_type"); +} + +} + +namespace Msp { +namespace IO { + +SeekOffset sys_seek(Handle &handle, SeekOffset offset, SeekType type) +{ + off64_t ret = lseek64(*handle, offset, sys_seek_type(type)); + if(ret==(off64_t)-1) + { + if(errno==EINVAL) + throw bad_seek(offset, type); + else + throw system_error("lseek64"); + } + + return ret; +} + +} // namespace IO +} // namespace Msp