diff --git a/LCS/Stream/include/Stream/SocketStream.h b/LCS/Stream/include/Stream/SocketStream.h index 1f77cf751c27e5f981fd5739e668ddef6de0a16d..238be586b305581c8c776af5c917c08e218a1cff 100644 --- a/LCS/Stream/include/Stream/SocketStream.h +++ b/LCS/Stream/include/Stream/SocketStream.h @@ -64,6 +64,8 @@ class SocketStream : public FileDescriptorBasedStream void accept(time_t timeout); + static void syncNFS(); + static std::string readkey(const string &nfskey, time_t &timeout); static void writekey(const string &nfskey, uint16 port); static void deletekey(const string &nfskey); diff --git a/LCS/Stream/src/SocketStream.cc b/LCS/Stream/src/SocketStream.cc index d69c98c5b4c20b276ea71029fe04b469f27e2ab7..d920a5d754d8e169f19f5acab6148e6f0b4b0c0e 100644 --- a/LCS/Stream/src/SocketStream.cc +++ b/LCS/Stream/src/SocketStream.cc @@ -261,24 +261,30 @@ void SocketStream::setReadBufferSize(size_t size) } -std::string SocketStream::readkey(const std::string &nfskey, time_t &timeout) +void SocketStream::syncNFS() { - for(;;) { - // sync NFS - DIR *dir = opendir("."); + // sync NFS + DIR *dir = opendir("."); - if (!dir) - throw SystemCallException("opendir", errno, THROW_ARGS); + if (!dir) + throw SystemCallException("opendir", errno, THROW_ARGS); - if (!readdir(dir)) - throw SystemCallException("readdir", errno, THROW_ARGS); + if (!readdir(dir)) + throw SystemCallException("readdir", errno, THROW_ARGS); - if (closedir(dir) != 0) - throw SystemCallException("closedir", errno, THROW_ARGS); + if (closedir(dir) != 0) + throw SystemCallException("closedir", errno, THROW_ARGS); +} + +std::string SocketStream::readkey(const std::string &nfskey, time_t &timeout) +{ + for(;;) { char portStr[16]; ssize_t len; + syncNFS(); + len = readlink(nfskey.c_str(), portStr, sizeof portStr - 1); // reserve 1 character to insert \0 below if (len >= 0) { @@ -313,6 +319,8 @@ void SocketStream::writekey(const std::string &nfskey, uint16 port) void SocketStream::deletekey(const std::string &nfskey) { + syncNFS(); + if (unlink(nfskey.c_str()) < 0) throw SystemCallException("unlink", errno, THROW_ARGS); }