summaryrefslogtreecommitdiff
path: root/netfs/daemon/daemonFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'netfs/daemon/daemonFile.cpp')
-rw-r--r--netfs/daemon/daemonFile.cpp73
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;
+ }
+}