diff options
| author | Jakob Unterwurzacher | 2015-09-05 14:08:00 +0200 | 
|---|---|---|
| committer | Jakob Unterwurzacher | 2015-09-05 14:08:00 +0200 | 
| commit | 4ab9862ccb5911836acda9834b0b25f892229533 (patch) | |
| tree | 4c55e5b44ecf2b4d94e762b036a7c66ad225c68a /frontend | |
| parent | 1257b4249d1473cd496e0b423c6aaa71b20aa41e (diff) | |
Fix read path
Diffstat (limited to 'frontend')
| -rw-r--r-- | frontend/dir.go | 15 | ||||
| -rw-r--r-- | frontend/file.go | 51 | 
2 files changed, 62 insertions, 4 deletions
| diff --git a/frontend/dir.go b/frontend/dir.go index eca3cf5..ce64a5a 100644 --- a/frontend/dir.go +++ b/frontend/dir.go @@ -45,10 +45,16 @@ func (d *Dir) Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse.Lo  	}  	clueDir, ok := n.(*cluefs.Dir)  	if ok { -		return &Dir { Dir: clueDir }, nil +		return &Dir { +			Dir: clueDir, +			crfs: d.crfs, +		}, nil  	} else {  		clueFile := n.(*cluefs.File) -		return &File { File: clueFile }, nil +		return &File { +			File: clueFile, +			crfs: d.crfs, +		}, nil  	}  } @@ -103,6 +109,9 @@ func (d *Dir) Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.Cr  		return nil, nil, err  	}  	clueFile := n.(*cluefs.File) -	cryptFile := &File {File: clueFile} +	cryptFile := &File { +		File: clueFile, +		crfs: d.crfs, +	}  	return cryptFile, cryptFile, nil  } diff --git a/frontend/file.go b/frontend/file.go index 81590e8..c5a02be 100644 --- a/frontend/file.go +++ b/frontend/file.go @@ -1,11 +1,60 @@  package frontend  import ( +	"fmt"  	"github.com/rfjakob/gocryptfs/cryptfs"  	"github.com/rfjakob/cluefs/lib/cluefs" + +	"bazil.org/fuse" +	fusefs "bazil.org/fuse/fs" +	"golang.org/x/net/context"  )  type File struct { -	*cryptfs.CryptFile  	*cluefs.File +	crfs *cryptfs.CryptFS +} + +func (f *File) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fusefs.Handle, error) { +	fmt.Printf("File.Open: f.crfs=%p\n", f.crfs) +	h, err := f.File.Open(ctx, req, resp) +	if err != nil { +		return nil, err +	} +	clueFile := h.(*cluefs.File) +	return &File { +		File: clueFile, +		crfs: f.crfs, +	}, nil +} + +func (f *File) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error { +	fmt.Printf("File.Read: f.crfs=%p\n", f.crfs) +	iblocks := f.crfs.SplitRange(req.Offset, int64(req.Size)) +	for _, ib := range iblocks { +		var partReq fuse.ReadRequest +		var partResp fuse.ReadResponse +		o, l := ib.CiphertextRange() +		partReq.Size = int(l) +		partResp.Data = make([]byte, int(l)) +		partReq.Offset = o +		err := f.File.Read(ctx, &partReq, &partResp) +		if err != nil { +			return err +		} +		plaintext, err := f.crfs.DecryptBlock(partResp.Data) +		if err != nil { +			fmt.Printf("Read: Block %d: %s\n", ib.BlockNo, err.Error()) +			return err +		} +		plaintext = ib.CropBlock(partResp.Data) +		resp.Data = append(resp.Data, plaintext...) +	} +	return nil +} + +func (f *File) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error { +	iblocks := f.crfs.SplitRange(req.Offset, int64(len(req.Data))) +	iblocks = iblocks +	return nil  } | 
