Guile-RPC comes with an example NFS (Network File System) server,
provided by the
grpc-nfs-export command. More precisely, it
implements NFS version 2, i.e., the
NFS_PROGRAM RPC program
version 2 along with the
MOUNTPROG program version 1, which are
closely related (see RFC 1094). It is a TCP server.
Enough technical details. The important thing about
grpc-nfs-export is this: although it’s of little use in one’s
everyday life, this NFS server is nothing less than life-changing. It’s
different from any file system you’ve seen before. It’s the ultimate
debugging aid for any good Guile hacker.
The “file hierarchy” served by
what?—Guile’s module hierarchy! In other words, when mounting the
file system exported by
grpc-nfs-export, the available files
are bindings, while directories represent modules
(see The Guile module system in The GNU Guile Reference
Manual). The module hierarchy can also be browsed from the REPL using
nested-ref procedure. Here’s a sample session:
$ ./grpc-nfs-export & $ sudo mount -t nfs -o nfsvers=2,tcp,port=2049 localhost: /nfs/ $ ls /nfs/%app/modules/ guile/ guile-rpc/ guile-user/ ice-9/ r6rs/ rpc/ srfi/ $ ls /nfs/%app/modules/rpc/rpc/portmap/%module-public-interface/ lookup-rpc-service-name %portmapper-port lookup-rpc-service-number %portmapper-program-number portmapper-call-it portmapper-set portmapper-dump portmapper-unset portmapper-get-port %portmapper-version-number portmapper-null read-rpc-service-list $ cat /nfs/%app/modules/rpc/xdr/xdr-decode #<procedure xdr-decode (type port)> $ cat /nfs/%app/modules/rpc/xdr/%xdr-endianness big
Here is the option reference:
Print a summary of the command-line options and exit.
Print the version number of GNU Guile-RPC and exit.
Listen for NFS connections on port (default: 2049).
mount connections on mount-port (default: 6666).
Produce debugging messages.
grpc-nfs-export can be passed the name of a
Scheme source file, in which case it will load that file in a separate
thread while still serving NFS and
mount requests. This allows
the program’s global variables to be monitored via the NFS mount.
As of version 0.4, this toy server exhibits poor
performance, notably when running
ls (which translates into a
readdir and many
lookup RPCs, the latter being costly)
in directories containing a lot of files. This is probably partly due
to the use of TCP, and partly due to other inefficiencies that we hope
to fix soon.