diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2016-04-11 08:51:07 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2016-04-11 08:51:07 +0100 |
commit | fd2105de19c61d3b9da64352b65b1b55d5d91f35 (patch) | |
tree | 38e671f26cce7d8616b753ae1413f4964379a05e /netfs/daemon | |
parent | Tidy up passing of type converter to file server (diff) | |
download | netfs-fd2105de19c61d3b9da64352b65b1b55d5d91f35.tar.bz2 netfs-fd2105de19c61d3b9da64352b65b1b55d5d91f35.tar.xz netfs-fd2105de19c61d3b9da64352b65b1b55d5d91f35.zip |
Prototype listdir
Diffstat (limited to 'netfs/daemon')
-rw-r--r-- | netfs/daemon/daemonDirectory.cpp | 29 | ||||
-rw-r--r-- | netfs/daemon/daemonDirectory.h | 6 | ||||
-rw-r--r-- | netfs/daemon/daemonVolume.cpp | 2 |
3 files changed, 32 insertions, 5 deletions
diff --git a/netfs/daemon/daemonDirectory.cpp b/netfs/daemon/daemonDirectory.cpp index 8c6c344..134fde5 100644 --- a/netfs/daemon/daemonDirectory.cpp +++ b/netfs/daemon/daemonDirectory.cpp @@ -4,9 +4,11 @@ #include <map> #include <sys/stat.h> #include <sys/types.h> +#include <fcntl.h> #include "daemonDirectory.h" -DirectoryServer::DirectoryServer(DIR * d) : +DirectoryServer::DirectoryServer(DIR * d, TypeConverter & t) : + TypeConverter(t), od(d) { } @@ -24,7 +26,7 @@ DirectoryServer::close(const Ice::Current & ice) throw NetFS::SystemError(errno); // LCOV_EXCL_STOP } - ice.adapter->remove(ice.id); + ice.adapter->removeFacet(ice.id, "v2"); } NetFS::NameList @@ -43,3 +45,26 @@ DirectoryServer::readdir(const Ice::Current&) return list; } +NetFS::DirectoryContents +DirectoryServer::listdir(const Ice::Current&) +{ + errno = 0; + NetFS::DirectoryContents list; + int fd = dirfd(od); + while (dirent * d = ::readdir(od)) { + if (errno) { + // LCOV_EXCL_START + throw NetFS::SystemError(errno); + // LCOV_EXCL_STOP + } + struct stat s; + if (::fstatat(fd, d->d_name, &s, AT_SYMLINK_NOFOLLOW) != 0) { + // LCOV_EXCL_START + throw NetFS::SystemError(errno); + // LCOV_EXCL_STOP + } + list[d->d_name] = convert(s); + } + return list; +} + diff --git a/netfs/daemon/daemonDirectory.h b/netfs/daemon/daemonDirectory.h index 2909dae..28c04a9 100644 --- a/netfs/daemon/daemonDirectory.h +++ b/netfs/daemon/daemonDirectory.h @@ -3,14 +3,16 @@ #include <directory.h> #include <dirent.h> +#include <typeConverter.h> -class DirectoryServer : public NetFS::Directory { +class DirectoryServer : public NetFS::DirectoryV2, TypeConverter { public: - DirectoryServer(DIR * od); + DirectoryServer(DIR * od, TypeConverter &); virtual ~DirectoryServer(); virtual void close(const Ice::Current&) override; virtual NetFS::NameList readdir(const Ice::Current&) override; + virtual NetFS::DirectoryContents listdir(const Ice::Current&) override; private: DIR * od; diff --git a/netfs/daemon/daemonVolume.cpp b/netfs/daemon/daemonVolume.cpp index fef26a1..ea5714a 100644 --- a/netfs/daemon/daemonVolume.cpp +++ b/netfs/daemon/daemonVolume.cpp @@ -275,7 +275,7 @@ VolumeServer::opendir(const NetFS::ReqEnv & re, const std::string & path, const if (!od) { throw NetFS::SystemError(errno); } - return NetFS::DirectoryPrx::checkedCast(ice.adapter->addWithUUID(new DirectoryServer(od))); + return NetFS::DirectoryPrx::checkedCast(ice.adapter->addFacetWithUUID(new DirectoryServer(od, converter), "v2")); } void |