Also did you look at NFSv4 / what made you decide to go with NFSv3? My (superficial) impression was that NFSv4 did a lot of simplifying and throwing out legacy stuff (e.g. rpcbind), but I don't know too many details on this…
[edit: NFSv4 answered on parent / https://news.ycombinator.com/item?id=37575304 ]
FWIW I think NFSv4 would be a rewrite rather than an extension :D
NFSv4 did throw out a lot of the legacy stuff, but also added a bunch of other state information like locks and delegation which is quite a bit more annoying to implement. Technically cos this is meant for "localhost-mounting-only", delegation should be easy to build (since we are expecting only exactly 1 mount). But v3 had far fewer APIs to implement, and so is a good starting point.
I know from lore that there are compliance-test suites for the POSIX file system API, but I believe those are commercial products :(
/// /*
/// * Remote file service routines
/// */
/// program NFS4_PROGRAM {
/// version NFS_V4 {
/// void
/// NFSPROC4_NULL(void) = 0;
///
/// COMPOUND4res
/// NFSPROC4_COMPOUND(COMPOUND4args) = 1;
///
/// } = 4;
/// } = 100003;Wait, what......
.. So not only is it an easy-to-run Rust NFS server and client (I gave up on NFS some years ago because I couldn't figure out how to run Samba) but it's also meant to use as a _substitute_ for FUSE in stacks like SSHFS or an app wanting to serve debug data as files?
Awesome!
Edit: Oh. It's async. The other bit that I liked from fuser: the default implementations in the trait cut down on the boiler plate. Setting the RO mount option got you defaults that DTRT.
Btw, why did you decide to use NFS instead of WebDAV? WebDAV should be easier to implement and is also supported on all platforms.
The fact you just need to impl one trait is amazing. I will definitely be testing this out