aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib/nfs/Connection.cxx30
-rw-r--r--src/lib/nfs/Connection.hxx3
2 files changed, 33 insertions, 0 deletions
diff --git a/src/lib/nfs/Connection.cxx b/src/lib/nfs/Connection.cxx
index e5dc87727..33e75a7c5 100644
--- a/src/lib/nfs/Connection.cxx
+++ b/src/lib/nfs/Connection.cxx
@@ -35,6 +35,21 @@ extern "C" {
#include <poll.h> /* for POLLIN, POLLOUT */
inline bool
+NfsConnection::CancellableCallback::Stat(nfs_context *ctx,
+ const char *path,
+ Error &error)
+{
+ int result = nfs_stat_async(ctx, path, Callback, this);
+ if (result < 0) {
+ error.Format(nfs_domain, "nfs_stat_async() failed: %s",
+ nfs_get_error(ctx));
+ return false;
+ }
+
+ return true;
+}
+
+inline bool
NfsConnection::CancellableCallback::Open(nfs_context *ctx,
const char *path, int flags,
Error &error)
@@ -177,6 +192,21 @@ NfsConnection::RemoveLease(NfsLease &lease)
}
bool
+NfsConnection::Stat(const char *path, NfsCallback &callback, Error &error)
+{
+ assert(!callbacks.Contains(callback));
+
+ auto &c = callbacks.Add(callback, *this, false);
+ if (!c.Stat(context, path, error)) {
+ callbacks.Remove(c);
+ return false;
+ }
+
+ ScheduleSocket();
+ return true;
+}
+
+bool
NfsConnection::Open(const char *path, int flags, NfsCallback &callback,
Error &error)
{
diff --git a/src/lib/nfs/Connection.hxx b/src/lib/nfs/Connection.hxx
index d0a8a5da2..a82921d4e 100644
--- a/src/lib/nfs/Connection.hxx
+++ b/src/lib/nfs/Connection.hxx
@@ -64,6 +64,8 @@ class NfsConnection : SocketMonitor, DeferredMonitor {
connection(_connection),
open(_open), close_fh(nullptr) {}
+ bool Stat(nfs_context *context, const char *path,
+ Error &error);
bool Open(nfs_context *context, const char *path, int flags,
Error &error);
bool Stat(nfs_context *context, struct nfsfh *fh,
@@ -155,6 +157,7 @@ public:
void AddLease(NfsLease &lease);
void RemoveLease(NfsLease &lease);
+ bool Stat(const char *path, NfsCallback &callback, Error &error);
bool Open(const char *path, int flags, NfsCallback &callback,
Error &error);
bool Stat(struct nfsfh *fh, NfsCallback &callback, Error &error);