mirror of
https://github.com/rclone/rclone.git
synced 2024-12-13 21:03:53 +08:00
68 lines
1.2 KiB
Go
68 lines
1.2 KiB
Go
|
// FUSE main Fs
|
||
|
|
||
|
// +build linux darwin freebsd
|
||
|
|
||
|
package mount
|
||
|
|
||
|
import (
|
||
|
"bazil.org/fuse"
|
||
|
fusefs "bazil.org/fuse/fs"
|
||
|
"github.com/ncw/rclone/fs"
|
||
|
)
|
||
|
|
||
|
// Default permissions
|
||
|
const (
|
||
|
dirPerms = 0755
|
||
|
filePerms = 0644
|
||
|
)
|
||
|
|
||
|
// FS represents the top level filing system
|
||
|
type FS struct {
|
||
|
f fs.Fs
|
||
|
}
|
||
|
|
||
|
// Check interface satistfied
|
||
|
var _ fusefs.FS = (*FS)(nil)
|
||
|
|
||
|
// Root returns the root node
|
||
|
func (f *FS) Root() (fusefs.Node, error) {
|
||
|
fs.Debug(f.f, "Root()")
|
||
|
return newDir(f.f, ""), nil
|
||
|
}
|
||
|
|
||
|
// mount the file system
|
||
|
//
|
||
|
// The mount point will be ready when this returns.
|
||
|
//
|
||
|
// returns an error, and an error channel for the serve process to
|
||
|
// report an error when fusermount is called.
|
||
|
func mount(f fs.Fs, mountpoint string) (<-chan error, error) {
|
||
|
c, err := fuse.Mount(mountpoint)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
filesys := &FS{
|
||
|
f: f,
|
||
|
}
|
||
|
|
||
|
// Serve the mount point in the background returning error to errChan
|
||
|
errChan := make(chan error, 1)
|
||
|
go func() {
|
||
|
err := fusefs.Serve(c, filesys)
|
||
|
closeErr := c.Close()
|
||
|
if err == nil {
|
||
|
err = closeErr
|
||
|
}
|
||
|
errChan <- err
|
||
|
}()
|
||
|
|
||
|
// check if the mount process has an error to report
|
||
|
<-c.Ready
|
||
|
if err := c.MountError; err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return errChan, nil
|
||
|
}
|