38 lines
892 B
Go
38 lines
892 B
Go
//go:build linux
|
|
|
|
package mount
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"bazil.org/fuse"
|
|
"bazil.org/fuse/fs"
|
|
"gitea.dddbg.com/youbin/bdrclone/internal/baidu"
|
|
)
|
|
|
|
func Mount(ctx context.Context, client *baidu.Client, mountpoint string, options Options) error {
|
|
if options.Name == "" {
|
|
options.Name = "bdrclone"
|
|
}
|
|
mountOptions := []fuse.MountOption{fuse.FSName(options.Name), fuse.Subtype("bdrclone")}
|
|
if options.ReadOnly {
|
|
mountOptions = append(mountOptions, fuse.ReadOnly())
|
|
}
|
|
conn, err := fuse.Mount(mountpoint, mountOptions...)
|
|
if err != nil {
|
|
return fmt.Errorf("mount %s: %w", mountpoint, err)
|
|
}
|
|
defer conn.Close()
|
|
server := fs.New(conn, &fs.Config{})
|
|
serveErr := make(chan error, 1)
|
|
go func() { serveErr <- server.Serve(New(client, options.ReadOnly)) }()
|
|
select {
|
|
case err := <-serveErr:
|
|
return err
|
|
case <-ctx.Done():
|
|
_ = fuse.Unmount(mountpoint)
|
|
return <-serveErr
|
|
}
|
|
}
|