diff options
Diffstat (limited to 'netfs/daemon/daemonFile.cpp')
| -rw-r--r-- | netfs/daemon/daemonFile.cpp | 73 |
1 files changed, 43 insertions, 30 deletions
diff --git a/netfs/daemon/daemonFile.cpp b/netfs/daemon/daemonFile.cpp index 0df3c2a..cf34b7d 100644 --- a/netfs/daemon/daemonFile.cpp +++ b/netfs/daemon/daemonFile.cpp @@ -1,26 +1,19 @@ +#include "daemonFile.h" #include <Ice/ObjectAdapter.h> -#include <errno.h> -#include <map> +#include <cerrno> +#include <entCache.h> #include <fcntl.h> -#include <typeConverter.h> +#include <map> +#include <numeric.h> #include <sys/stat.h> -#include "daemonFile.h" -#include <entCache.h> +#include <typeConverter.h> +#include <unistd.h> -FileServer::FileServer(int f, EntryTypeConverter & t) : - EntryTypeConverter(t), - fd(f) -{ -} - -FileServer::~FileServer() -{ -} +FileServer::FileServer(int f, EntryTypeConverter & t) : EntryTypeConverter(t), fd(f) { } void -FileServer::ftruncate(const NetFS::ReqEnv re, Ice::Long size, const Ice::Current&) +FileServer::ftruncate(Ice::Long size, const Ice::Current &) { - (void)re; errno = 0; if (::ftruncate(fd, size) != 0) { throw NetFS::SystemError(errno); @@ -28,10 +21,9 @@ FileServer::ftruncate(const NetFS::ReqEnv re, Ice::Long size, const Ice::Current } NetFS::Attr -FileServer::fgetattr(const NetFS::ReqEnv re, const Ice::Current &) +FileServer::fgetattr(const Ice::Current &) { - (void)re; - struct stat s; + struct stat s { }; if (::fstat(fd, &s) != 0) { throw NetFS::SystemError(errno); } @@ -49,27 +41,48 @@ FileServer::close(const Ice::Current & ice) } NetFS::Buffer -FileServer::read(Ice::Long offset, Ice::Long size, const Ice::Current&) +FileServer::read(Ice::Long offset, Ice::Long size, const Ice::Current &) { NetFS::Buffer buf; - buf.resize(size); - errno = 0; - int r = pread(fd, &buf[0], size, offset); - if (r == -1) { - throw NetFS::SystemError(errno); - } - else if (r != size) { - buf.resize(r); + if (size) { + buf.resize(safe {size}); + errno = 0; + auto r = pread(fd, buf.data(), safe {size}, offset); + if (r == -1) { + throw NetFS::SystemError(errno); + } + else if (std::cmp_not_equal(r, size)) { + buf.resize(safe {r}); + } } return buf; } void -FileServer::write(Ice::Long offset, Ice::Long size, const NetFS::Buffer data, const Ice::Current&) +FileServer::write(Ice::Long offset, Ice::Long size, const ::std::pair<const ::Ice::Byte *, const ::Ice::Byte *> data, + const Ice::Current &) { errno = 0; - if (pwrite(fd, &data.front(), size, offset) != size) { + if (pwrite(fd, data.first, safe {size}, offset) != size) { throw NetFS::SystemError(errno); } } +Ice::Long +FileServer::copyrange(NetFS::FilePrxPtr to, Ice::Long offsrc, Ice::Long offdst, Ice::Long size, Ice::Int flags, + const Ice::Current & ice) +{ + if (auto obj = ice.adapter->findByProxy(to); auto file = std::dynamic_pointer_cast<FileServer>(obj)) { + errno = 0; + off_t src = offsrc, dst = offdst; + if (auto rtn = copy_file_range(fd, &src, file->fd, &dst, safe {size}, safe {flags}); rtn != -1) { + return rtn; + } + throw NetFS::SystemError(errno); + } + else { + const auto bytes = read(offsrc, size, ice); + to->write(offdst, size, {bytes.data(), bytes.data() + size}); + return size; + } +} |
