lib/nfs/Connection: use nfs_fstat64_async()

This is 64-bit-safe and anyway, nfs_fstat_async() doesn't work with
NFSv4.
This commit is contained in:
Max Kellermann 2024-05-07 20:48:00 +02:00
parent 67f01fbdb6
commit 9947d3e67f
3 changed files with 10 additions and 8 deletions

View File

@ -74,7 +74,7 @@ NfsConnection::CancellableCallback::Stat(nfs_context *ctx,
{ {
assert(connection.GetEventLoop().IsInside()); assert(connection.GetEventLoop().IsInside());
int result = nfs_fstat_async(ctx, fh, Callback, this); int result = nfs_fstat64_async(ctx, fh, Callback, this);
if (result < 0) if (result < 0)
throw NfsClientError(ctx, "nfs_fstat_async() failed"); throw NfsClientError(ctx, "nfs_fstat_async() failed");
} }

View File

@ -8,12 +8,15 @@
#include "event/Call.hxx" #include "event/Call.hxx"
#include "util/ASCII.hxx" #include "util/ASCII.hxx"
#include <nfsc/libnfs.h> // for struct nfs_stat_64
#include <cassert> #include <cassert>
#include <cstring> #include <cstring>
#include <stdexcept> #include <stdexcept>
#include <utility> #include <utility>
#include <fcntl.h> #include <fcntl.h>
#include <sys/stat.h> // for S_ISREG()
NfsFileReader::NfsFileReader() noexcept NfsFileReader::NfsFileReader() noexcept
:defer_open(nfs_get_event_loop(), BIND_THIS_METHOD(OnDeferredOpen)) :defer_open(nfs_get_event_loop(), BIND_THIS_METHOD(OnDeferredOpen))
@ -180,7 +183,7 @@ NfsFileReader::OpenCallback(nfsfh *_fh) noexcept
} }
inline void inline void
NfsFileReader::StatCallback(const struct stat *_st) noexcept NfsFileReader::StatCallback(const struct nfs_stat_64 *_st) noexcept
{ {
assert(connection != nullptr); assert(connection != nullptr);
assert(fh != nullptr); assert(fh != nullptr);
@ -195,12 +198,12 @@ NfsFileReader::StatCallback(const struct stat *_st) noexcept
const auto *st = _st; const auto *st = _st;
#endif #endif
if (!S_ISREG(st->st_mode)) { if (!S_ISREG(st->nfs_mode)) {
OnNfsFileError(std::make_exception_ptr(std::runtime_error("Not a regular file"))); OnNfsFileError(std::make_exception_ptr(std::runtime_error("Not a regular file")));
return; return;
} }
OnNfsFileOpen(st->st_size); OnNfsFileOpen(st->nfs_size);
} }
void void
@ -219,7 +222,7 @@ NfsFileReader::OnNfsCallback(unsigned status, void *data) noexcept
break; break;
case State::STAT: case State::STAT:
StatCallback((const struct stat *)data); StatCallback((const struct nfs_stat_64 *)data);
break; break;
case State::READ: case State::READ:

View File

@ -14,9 +14,8 @@
#include <span> #include <span>
#include <string> #include <string>
#include <sys/stat.h>
struct nfsfh; struct nfsfh;
struct nfs_stat_64;
class NfsConnection; class NfsConnection;
/** /**
@ -126,7 +125,7 @@ private:
void CancelOrClose() noexcept; void CancelOrClose() noexcept;
void OpenCallback(nfsfh *_fh) noexcept; void OpenCallback(nfsfh *_fh) noexcept;
void StatCallback(const struct stat *st) noexcept; void StatCallback(const struct nfs_stat_64 *st) noexcept;
/* virtual methods from NfsLease */ /* virtual methods from NfsLease */
void OnNfsConnectionReady() noexcept final; void OnNfsConnectionReady() noexcept final;