diff options
| author | Chris Lu <chris.lu@gmail.com> | 2014-05-13 11:25:48 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2014-05-13 11:25:48 -0700 |
| commit | dc24bad791743c6e1c96602b3678dde4954f795a (patch) | |
| tree | e6f42dfd524ee7194fec1d9aeea7c4c375e479c9 /go/weed/mount_std.go | |
| parent | 750e1aaaa5cf2a224f18e28f2974b48a1b31efd0 (diff) | |
| download | seaweedfs-dc24bad791743c6e1c96602b3678dde4954f795a.tar.xz seaweedfs-dc24bad791743c6e1c96602b3678dde4954f795a.zip | |
releasing 0.58 to handle control+c interrupts.
compilable now. but FUSE mount is not working.
Diffstat (limited to 'go/weed/mount_std.go')
| -rw-r--r-- | go/weed/mount_std.go | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/go/weed/mount_std.go b/go/weed/mount_std.go new file mode 100644 index 000000000..5d01a0f87 --- /dev/null +++ b/go/weed/mount_std.go @@ -0,0 +1,112 @@ +// +build linux darwin + +package main + +import ( + "bazil.org/fuse" + "bazil.org/fuse/fs" + "code.google.com/p/weed-fs/go/filer" + "code.google.com/p/weed-fs/go/glog" + "code.google.com/p/weed-fs/go/storage" + "code.google.com/p/weed-fs/go/util" + "fmt" + "os" + "os/signal" + "runtime" +) + +func runMount(cmd *Command, args []string) bool { + fmt.Printf("This is Weed File System version %s %s %s\n", util.VERSION, runtime.GOOS, runtime.GOARCH) + if *mountOptions.dir == "" { + fmt.Printf("Please specify the mount directory via \"-dir\"") + return false + } + + c, err := fuse.Mount(*mountOptions.dir) + if err != nil { + glog.Fatal(err) + return false + } + + signalChan := make(chan os.Signal, 1) + signal.Notify(signalChan, os.Interrupt) + go func() { + for _ = range signalChan { + // sig is a ^C, handle it + fuse.Unmount(*mountOptions.dir) + c.Close() + os.Exit(0) + } + }() + + err = fs.Serve(c, WFS{}) + if err != nil { + fuse.Unmount(*mountOptions.dir) + } + + // check if the mount process has an error to report + <-c.Ready + if err := c.MountError; err != nil { + glog.Fatal(err) + } + + return true +} + +type File struct { + FileId filer.FileId + Name string +} + +func (File) Attr() fuse.Attr { + return fuse.Attr{Mode: 0444} +} +func (File) ReadAll(intr fs.Intr) ([]byte, fuse.Error) { + return []byte("hello, world\n"), nil +} + +type Dir struct { + DirectoryId filer.DirectoryId + Name string +} + +func (dir Dir) Attr() fuse.Attr { + return fuse.Attr{Inode: 1, Mode: os.ModeDir | 0555} +} + +func (dir Dir) Lookup(name string, intr fs.Intr) (fs.Node, fuse.Error) { + files_result, e := filer.ListFiles(*mountOptions.filer, dir.DirectoryId, name) + if e != nil { + return nil, fuse.ENOENT + } + if len(files_result.Files) > 0 { + return File{files_result.Files[0].Id, files_result.Files[0].Name}, nil + } + return nil, fmt.Errorf("File Not Found for %s", name) +} + +type WFS struct{} + +func (WFS) Root() (fs.Node, fuse.Error) { + return Dir{}, nil +} + +func (dir *Dir) ReadDir(intr fs.Intr) ([]fuse.Dirent, fuse.Error) { + ret := make([]fuse.Dirent, 0) + if dirs, e := filer.ListDirectories(*mountOptions.filer, dir.DirectoryId); e == nil { + for _, d := range dirs.Directories { + dirId := uint64(d.Id) + ret = append(ret, fuse.Dirent{Inode: dirId, Name: d.Name, Type: fuse.DT_Dir}) + } + } + if files, e := filer.ListFiles(*mountOptions.filer, dir.DirectoryId, ""); e == nil { + for _, f := range files.Files { + if fileId, e := storage.ParseFileId(string(f.Id)); e == nil { + fileInode := uint64(fileId.VolumeId)<<48 + fileId.Key + ret = append(ret, fuse.Dirent{Inode: fileInode, Name: f.Name, Type: fuse.DT_File}) + } + + } + } + return ret, nil +} |
