summaryrefslogtreecommitdiff
path: root/netfs/daemon
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2016-04-11 08:51:07 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2016-04-11 08:51:07 +0100
commitfd2105de19c61d3b9da64352b65b1b55d5d91f35 (patch)
tree38e671f26cce7d8616b753ae1413f4964379a05e /netfs/daemon
parentTidy up passing of type converter to file server (diff)
downloadnetfs-fd2105de19c61d3b9da64352b65b1b55d5d91f35.tar.bz2
netfs-fd2105de19c61d3b9da64352b65b1b55d5d91f35.tar.xz
netfs-fd2105de19c61d3b9da64352b65b1b55d5d91f35.zip
Prototype listdir
Diffstat (limited to 'netfs/daemon')
-rw-r--r--netfs/daemon/daemonDirectory.cpp29
-rw-r--r--netfs/daemon/daemonDirectory.h6
-rw-r--r--netfs/daemon/daemonVolume.cpp2
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