mirror of
https://github.com/rclone/rclone.git
synced 2024-11-30 04:15:26 +01:00
0e2f1d64e3
Before this change, if a user unmounted externally (for example, via the Finder UI), rclone would not be aware of this and wait forever to exit -- effectively causing a deadlock that would require Ctrl+C to terminate. After this change, when the handler detects an external unmount, it calls a function which allows rclone to cleanly shutdown the VFS and exit.
63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
//go:build unix
|
|
// +build unix
|
|
|
|
package nfs
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
|
|
nfs "github.com/willscott/go-nfs"
|
|
|
|
"github.com/rclone/rclone/fs"
|
|
"github.com/rclone/rclone/vfs"
|
|
"github.com/rclone/rclone/vfs/vfscommon"
|
|
)
|
|
|
|
// Server contains everything to run the Server
|
|
type Server struct {
|
|
opt Options
|
|
handler nfs.Handler
|
|
ctx context.Context // for global config
|
|
listener net.Listener
|
|
UnmountedExternally bool
|
|
}
|
|
|
|
// NewServer creates a new server
|
|
func NewServer(ctx context.Context, vfs *vfs.VFS, opt *Options) (s *Server, err error) {
|
|
if vfs.Opt.CacheMode == vfscommon.CacheModeOff {
|
|
fs.LogPrintf(fs.LogLevelWarning, ctx, "NFS writes don't work without a cache, the filesystem will be served read-only")
|
|
}
|
|
// Our NFS server doesn't have any authentication, we run it on localhost and random port by default
|
|
if opt.ListenAddr == "" {
|
|
opt.ListenAddr = "localhost:"
|
|
}
|
|
|
|
s = &Server{
|
|
ctx: ctx,
|
|
opt: *opt,
|
|
}
|
|
s.handler = newHandler(vfs, opt)
|
|
s.listener, err = net.Listen("tcp", s.opt.ListenAddr)
|
|
if err != nil {
|
|
fs.Errorf(nil, "NFS server failed to listen: %v\n", err)
|
|
}
|
|
return
|
|
}
|
|
|
|
// Addr returns the listening address of the server
|
|
func (s *Server) Addr() net.Addr {
|
|
return s.listener.Addr()
|
|
}
|
|
|
|
// Shutdown stops the server
|
|
func (s *Server) Shutdown() error {
|
|
return s.listener.Close()
|
|
}
|
|
|
|
// Serve starts the server
|
|
func (s *Server) Serve() (err error) {
|
|
fs.Logf(nil, "NFS Server running at %s\n", s.listener.Addr())
|
|
return nfs.Serve(s.listener, s.handler)
|
|
}
|