// HandleRead handles a read request assuming that data is the entire file content. // It adjusts the amount returned in resp according to req.Offset and req.Size. func HandleRead(req *fuse.ReadRequest, resp *fuse.ReadResponse, data []byte) { if req.Offset >= int64(len(data)) { data = nil } else { data = data[req.Offset:] } if len(data) > req.Size { data = data[:req.Size] } n := copy(resp.Data[:req.Size], data) resp.Data = resp.Data[:n] }
func (fh *FileHandle) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error { // We don't actually enforce Offset to match where previous read // ended. Maybe we should, but that would mean'd we need to track // it. The kernel *should* do it for us, based on the // fuse.OpenNonSeekable flag. // // One exception to the above is if we fail to fully populate a // page cache page; a read into page cache is always page aligned. // Make sure we never serve a partial read, to avoid that. _, e := fh.r.Seek(req.Offset, 0) if e != nil { return e } //buf := bytes.NewBuffer(nil) buf := make([]byte, req.Size) n, err := fh.r.Read(buf) //io.ReadFull(fh.r, buf) if err == io.ErrUnexpectedEOF || err == io.EOF { err = nil } resp.Data = buf[:n] return err }
func (benchFile) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error { resp.Data = resp.Data[:cap(resp.Data)] return nil }