github.com/hanwen/go-fuse@v1.0.0/fuse/pathfs/prefixfs.go (about) 1 // Copyright 2016 the Go-FUSE Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package pathfs 6 7 import ( 8 "fmt" 9 "path/filepath" 10 "time" 11 12 "github.com/hanwen/go-fuse/fuse" 13 "github.com/hanwen/go-fuse/fuse/nodefs" 14 ) 15 16 // PrefixFileSystem adds a path prefix to incoming calls. 17 type prefixFileSystem struct { 18 FileSystem FileSystem 19 Prefix string 20 } 21 22 func NewPrefixFileSystem(fs FileSystem, prefix string) FileSystem { 23 return &prefixFileSystem{fs, prefix} 24 } 25 26 func (fs *prefixFileSystem) SetDebug(debug bool) { 27 fs.FileSystem.SetDebug(debug) 28 } 29 30 func (fs *prefixFileSystem) prefixed(n string) string { 31 return filepath.Join(fs.Prefix, n) 32 } 33 34 func (fs *prefixFileSystem) GetAttr(name string, context *fuse.Context) (*fuse.Attr, fuse.Status) { 35 return fs.FileSystem.GetAttr(fs.prefixed(name), context) 36 } 37 38 func (fs *prefixFileSystem) Readlink(name string, context *fuse.Context) (string, fuse.Status) { 39 return fs.FileSystem.Readlink(fs.prefixed(name), context) 40 } 41 42 func (fs *prefixFileSystem) Mknod(name string, mode uint32, dev uint32, context *fuse.Context) fuse.Status { 43 return fs.FileSystem.Mknod(fs.prefixed(name), mode, dev, context) 44 } 45 46 func (fs *prefixFileSystem) Mkdir(name string, mode uint32, context *fuse.Context) fuse.Status { 47 return fs.FileSystem.Mkdir(fs.prefixed(name), mode, context) 48 } 49 50 func (fs *prefixFileSystem) Unlink(name string, context *fuse.Context) (code fuse.Status) { 51 return fs.FileSystem.Unlink(fs.prefixed(name), context) 52 } 53 54 func (fs *prefixFileSystem) Rmdir(name string, context *fuse.Context) (code fuse.Status) { 55 return fs.FileSystem.Rmdir(fs.prefixed(name), context) 56 } 57 58 func (fs *prefixFileSystem) Symlink(value string, linkName string, context *fuse.Context) (code fuse.Status) { 59 return fs.FileSystem.Symlink(value, fs.prefixed(linkName), context) 60 } 61 62 func (fs *prefixFileSystem) Rename(oldName string, newName string, context *fuse.Context) (code fuse.Status) { 63 return fs.FileSystem.Rename(fs.prefixed(oldName), fs.prefixed(newName), context) 64 } 65 66 func (fs *prefixFileSystem) Link(oldName string, newName string, context *fuse.Context) (code fuse.Status) { 67 return fs.FileSystem.Link(fs.prefixed(oldName), fs.prefixed(newName), context) 68 } 69 70 func (fs *prefixFileSystem) Chmod(name string, mode uint32, context *fuse.Context) (code fuse.Status) { 71 return fs.FileSystem.Chmod(fs.prefixed(name), mode, context) 72 } 73 74 func (fs *prefixFileSystem) Chown(name string, uid uint32, gid uint32, context *fuse.Context) (code fuse.Status) { 75 return fs.FileSystem.Chown(fs.prefixed(name), uid, gid, context) 76 } 77 78 func (fs *prefixFileSystem) Truncate(name string, offset uint64, context *fuse.Context) (code fuse.Status) { 79 return fs.FileSystem.Truncate(fs.prefixed(name), offset, context) 80 } 81 82 func (fs *prefixFileSystem) Open(name string, flags uint32, context *fuse.Context) (file nodefs.File, code fuse.Status) { 83 return fs.FileSystem.Open(fs.prefixed(name), flags, context) 84 } 85 86 func (fs *prefixFileSystem) OpenDir(name string, context *fuse.Context) (stream []fuse.DirEntry, status fuse.Status) { 87 return fs.FileSystem.OpenDir(fs.prefixed(name), context) 88 } 89 90 func (fs *prefixFileSystem) OnMount(nodeFs *PathNodeFs) { 91 fs.FileSystem.OnMount(nodeFs) 92 } 93 94 func (fs *prefixFileSystem) OnUnmount() { 95 fs.FileSystem.OnUnmount() 96 } 97 98 func (fs *prefixFileSystem) Access(name string, mode uint32, context *fuse.Context) (code fuse.Status) { 99 return fs.FileSystem.Access(fs.prefixed(name), mode, context) 100 } 101 102 func (fs *prefixFileSystem) Create(name string, flags uint32, mode uint32, context *fuse.Context) (file nodefs.File, code fuse.Status) { 103 return fs.FileSystem.Create(fs.prefixed(name), flags, mode, context) 104 } 105 106 func (fs *prefixFileSystem) Utimens(name string, Atime *time.Time, Mtime *time.Time, context *fuse.Context) (code fuse.Status) { 107 return fs.FileSystem.Utimens(fs.prefixed(name), Atime, Mtime, context) 108 } 109 110 func (fs *prefixFileSystem) GetXAttr(name string, attr string, context *fuse.Context) ([]byte, fuse.Status) { 111 return fs.FileSystem.GetXAttr(fs.prefixed(name), attr, context) 112 } 113 114 func (fs *prefixFileSystem) SetXAttr(name string, attr string, data []byte, flags int, context *fuse.Context) fuse.Status { 115 return fs.FileSystem.SetXAttr(fs.prefixed(name), attr, data, flags, context) 116 } 117 118 func (fs *prefixFileSystem) ListXAttr(name string, context *fuse.Context) ([]string, fuse.Status) { 119 return fs.FileSystem.ListXAttr(fs.prefixed(name), context) 120 } 121 122 func (fs *prefixFileSystem) RemoveXAttr(name string, attr string, context *fuse.Context) fuse.Status { 123 return fs.FileSystem.RemoveXAttr(fs.prefixed(name), attr, context) 124 } 125 126 func (fs *prefixFileSystem) String() string { 127 return fmt.Sprintf("prefixFileSystem(%s,%s)", fs.FileSystem.String(), fs.Prefix) 128 } 129 130 func (fs *prefixFileSystem) StatFs(name string) *fuse.StatfsOut { 131 return fs.FileSystem.StatFs(fs.prefixed(name)) 132 }