-
Notifications
You must be signed in to change notification settings - Fork 0
/
writable.go
75 lines (62 loc) · 1.71 KB
/
writable.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package main
import (
"io"
"io/fs"
"os"
"path"
"github.com/binzume/fsmount"
)
type writableDirFS struct {
fs.StatFS
path string
}
func NewWritableDirFS(path string) *writableDirFS {
return &writableDirFS{StatFS: os.DirFS(path).(fs.StatFS), path: path}
}
func (fsys *writableDirFS) OpenWriter(name string, flag int) (io.WriteCloser, error) {
if !fs.ValidPath(name) {
return nil, &fs.PathError{Op: "open", Path: name, Err: fs.ErrInvalid}
}
return os.OpenFile(path.Join(fsys.path, name), flag, fs.ModePerm)
}
func (fsys *writableDirFS) Truncate(name string, size int64) error {
if !fs.ValidPath(name) {
return &fs.PathError{Op: "truncate", Path: name, Err: fs.ErrInvalid}
}
return os.Truncate(path.Join(fsys.path, name), size)
}
func (fsys *writableDirFS) Remove(name string) error {
if !fs.ValidPath(name) {
return &fs.PathError{Op: "remove", Path: name, Err: fs.ErrInvalid}
}
return os.Remove(path.Join(fsys.path, name))
}
func (fsys *writableDirFS) Mkdir(name string, mode fs.FileMode) error {
if !fs.ValidPath(name) {
return &fs.PathError{Op: "mkdir", Path: name, Err: fs.ErrInvalid}
}
return os.Mkdir(path.Join(fsys.path, name), mode)
}
func (fsys *writableDirFS) Rename(name, newName string) error {
if !fs.ValidPath(name) || !fs.ValidPath(newName) {
return &fs.PathError{Op: "rename", Path: name, Err: fs.ErrInvalid}
}
return os.Rename(path.Join(fsys.path, name), path.Join(fsys.path, newName))
}
func main() {
srcDir := "."
mountPoint := "X:"
if len(os.Args) > 1 {
srcDir = os.Args[1]
}
if len(os.Args) > 2 {
mountPoint = os.Args[2]
}
mount, err := fsmount.MountFS(mountPoint, NewWritableDirFS(srcDir), nil)
if err != nil {
panic(err)
}
defer mount.Close()
// Block forever
select {}
}