作者:hatchlin
项目:fuse_gdriv
func (sc *serveConn) readDir(req *fuse.ReadRequest) {
inode := uint64(req.Header.Node)
resp := &fuse.ReadResponse{make([]byte, 0, req.Size)}
var dirs []fuse.Dirent
file, err := sc.db.FileByInode(inode)
if err != nil {
fuse.Debug(fmt.Sprintf("FileByInode(%d): %v", inode, err))
req.RespondError(fuse.EIO)
return
}
for _, inode := range file.Children {
f, err := sc.db.FileByInode(inode)
if err != nil {
fuse.Debug(fmt.Sprintf("child: FileByInode(%d): %v", inode, err))
req.RespondError(fuse.EIO)
return
}
childType := fuse.DT_File
if f.MimeType == driveFolderMimeType {
childType = fuse.DT_Dir
}
dirs = append(dirs, fuse.Dirent{Inode: f.Inode, Name: f.Title, Type: childType})
}
fuse.Debug(fmt.Sprintf("%+v", dirs))
var data []byte
for _, dir := range dirs {
data = fuse.AppendDirent(data, dir)
}
fuseutil.HandleRead(req, resp, data)
req.Respond(resp)
}
作者:wrees
项目:cfs-binary-releas
func (f *fs) handleRead(r *fuse.ReadRequest) {
log.Println("Inside handleRead")
log.Println(r)
resp := &fuse.ReadResponse{Data: make([]byte, r.Size)}
if r.Dir {
// handle directory listing
data := f.handles.getReadCache(r.Handle)
if data == nil {
d, err := f.rpc.api.ReadDirAll(f.getContext(), &pb.ReadDirAllRequest{Inode: uint64(r.Node)})
log.Println(d)
if err != nil {
log.Fatalf("Read on dir failed: %v", err)
}
data = fuse.AppendDirent(data, fuse.Dirent{
Name: ".",
Inode: uint64(r.Node),
Type: fuse.DT_Dir,
})
data = fuse.AppendDirent(data, fuse.Dirent{
Name: "..",
Type: fuse.DT_Dir,
})
for _, de := range d.DirEntries {
log.Println(de)
data = fuse.AppendDirent(data, fuse.Dirent{
Name: de.Name,
Inode: de.Attr.Inode,
Type: fuse.DT_Dir,
})
}
for _, fe := range d.FileEntries {
log.Println(fe)
data = fuse.AppendDirent(data, fuse.Dirent{
Name: fe.Name,
Inode: fe.Attr.Inode,
Type: fuse.DT_File,
})
}
f.handles.cacheRead(r.Handle, data)
}
fuseutil.HandleRead(r, resp, data)
r.Respond(resp)
return
} else {
// handle file read
data, err := f.rpc.api.Read(f.getContext(), &pb.ReadRequest{
Inode: uint64(r.Node),
Offset: int64(r.Offset),
Size: int64(r.Size),
})
if err != nil {
log.Fatal("Read on file failed: ", err)
}
copy(resp.Data, data.Payload)
r.Respond(resp)
}
}
作者:rsrsp
项目:fus
func (it *interrupt) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr Intr) fuse.Error {
if it.hanging == nil {
fuseutil.HandleRead(req, resp, []byte("don't read this outside of the test"))
return nil
}
close(it.hanging)
<-intr
return fuse.EINTR
}
作者:JoeyBurzynsk
项目:redis-moun
// HandleReader
func (f *File) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fs.Intr) fuse.Error {
f.mu.Lock()
defer f.mu.Unlock()
if f.writers == 0 {
f.load()
}
fuseutil.HandleRead(req, resp, f.data)
return nil
}
作者:bweste
项目:consulf
// Read implements the HandleReader interface. It is called to handle every read request.
// Because the file is opened in DirectIO mode, the kernel will not cache any file data.
func (file *consulFile) Read(
ctx context.Context,
req *fuse.ReadRequest,
resp *fuse.ReadResponse,
) error {
data, err := file.readAll(ctx)
if err != nil {
return err
}
fuseutil.HandleRead(req, resp, data)
return nil
}
作者:conductan
项目:goh
func (f *File) Read(c context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
f.mu.Lock()
defer f.mu.Unlock()
fn := func(b []byte) {
fuseutil.HandleRead(req, resp, b)
}
if f.writers == 0 {
f.load(c, fn)
} else {
fn(f.data)
}
return nil
}
作者:seacoastbo
项目:fus
//.........这里部分代码省略.........
}
err := n.Removexattr(r, intr)
if err != nil {
done(err)
r.RespondError(err)
break
}
done(nil)
r.Respond()
case *fuse.ForgetRequest:
forget := c.dropNode(hdr.Node, r.N)
if forget {
n, ok := node.(NodeForgetter)
if ok {
n.Forget()
}
}
done(nil)
r.Respond()
// Handle operations.
case *fuse.ReadRequest:
shandle := c.getHandle(r.Handle)
if shandle == nil {
done(fuse.ESTALE)
r.RespondError(fuse.ESTALE)
return
}
handle := shandle.handle
s := &fuse.ReadResponse{Data: make([]byte, 0, r.Size)}
if r.Dir {
if h, ok := handle.(HandleReadDirer); ok {
if shandle.readData == nil {
dirs, err := h.ReadDir(intr)
if err != nil {
done(err)
r.RespondError(err)
break
}
var data []byte
for _, dir := range dirs {
if dir.Inode == 0 {
dir.Inode = c.dynamicInode(snode.inode, dir.Name)
}
data = fuse.AppendDirent(data, dir)
}
shandle.readData = data
}
fuseutil.HandleRead(r, s, shandle.readData)
done(s)
r.Respond(s)
break
}
} else {
if h, ok := handle.(HandleReadAller); ok {
if shandle.readData == nil {
data, err := h.ReadAll(intr)
if err != nil {
done(err)
r.RespondError(err)
break
}
if data == nil {
data = []byte{}
作者:rsrsp
项目:fus
//.........这里部分代码省略.........
}
if _, ok := shandle.handle.(writeAll); ok {
shandle.trunc = true
}
done(s)
r.Respond(s)
case *fuse.GetxattrRequest, *fuse.SetxattrRequest, *fuse.ListxattrRequest, *fuse.RemovexattrRequest:
// TODO: Use n.
done(fuse.ENOSYS)
r.RespondError(fuse.ENOSYS)
case *fuse.ForgetRequest:
n, ok := node.(NodeForgetter)
if ok {
n.Forget()
}
c.dropNode(hdr.Node)
done(r)
r.Respond()
// Handle operations.
case *fuse.ReadRequest:
shandle := c.getHandle(r.Handle)
if shandle == nil {
fuse.Debugf("-> %#x %v", hdr.ID, fuse.ESTALE)
r.RespondError(fuse.ESTALE)
return
}
handle := shandle.handle
s := &fuse.ReadResponse{Data: make([]byte, 0, r.Size)}
if r.Dir {
if h, ok := handle.(HandleReadDirer); ok {
if shandle.readData == nil {
dirs, err := h.ReadDir(intr)
if err != nil {
done(err)
r.RespondError(err)
break
}
var data []byte
for _, dir := range dirs {
if dir.Inode == 0 {
dir.Inode = hash(path.Join(snode.name, dir.Name))
}
data = fuse.AppendDirent(data, dir)
}
shandle.readData = data
}
fuseutil.HandleRead(r, s, shandle.readData)
done(s)
r.Respond(s)
break
}
} else {
if h, ok := handle.(HandleReadAller); ok {
if shandle.readData == nil {
data, err := h.ReadAll(intr)
if err != nil {
done(err)
r.RespondError(err)
break
}
if data == nil {
data = []byte{}
作者:chenchu
项目:cgroupf
func (sf StatFile) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
data, _ := sf.readAll()
fuseutil.HandleRead(req, resp, data)
return nil
}
作者:read-late
项目:fus
func (f *File) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
t := f.content.Load().(string)
fuseutil.HandleRead(req, resp, []byte(t))
return nil
}
作者:keybas
项目:kbfs-bet
//.........这里部分代码省略.........
if !ok {
return fuse.ENOTSUP
}
err := n.Removexattr(ctx, r)
if err != nil {
return err
}
done(nil)
r.Respond()
return nil
case *fuse.ForgetRequest:
forget := c.dropNode(r.Hdr().Node, r.N)
if forget {
n, ok := node.(NodeForgetter)
if ok {
n.Forget()
}
}
done(nil)
r.Respond()
return nil
// Handle operations.
case *fuse.ReadRequest:
shandle := c.getHandle(r.Handle)
if shandle == nil {
return fuse.ESTALE
}
handle := shandle.handle
s := &fuse.ReadResponse{Data: make([]byte, 0, r.Size)}
if r.Dir {
if h, ok := handle.(HandleReadDirAller); ok {
// detect rewinddir(3) or similar seek and refresh
// contents
if r.Offset == 0 {
shandle.readData = nil
}
if shandle.readData == nil {
dirs, err := h.ReadDirAll(ctx)
if err != nil {
return err
}
var data []byte
for _, dir := range dirs {
if dir.Inode == 0 {
dir.Inode = c.dynamicInode(snode.inode, dir.Name)
}
data = fuse.AppendDirent(data, dir)
}
shandle.readData = data
}
fuseutil.HandleRead(r, s, shandle.readData)
done(s)
r.Respond(s)
return nil
}
} else {
if h, ok := handle.(HandleReadAller); ok {
if shandle.readData == nil {
data, err := h.ReadAll(ctx)
if err != nil {
return err
}
作者:seacoastbo
项目:fus
func (readWithHandleRead) Read(req *fuse.ReadRequest, resp *fuse.ReadResponse, intr fs.Intr) fuse.Error {
fuseutil.HandleRead(req, resp, []byte(hi))
return nil
}