containerd/vendor/github.com/hanwen/go-fuse/v2/fs/dirstream.go
Brad Davidson 63272c3b7a
Enable btrfs/fuse-overlayfs/stargz snapshotter plugins
Signed-off-by: Brad Davidson <brad.davidson@rancher.com>
2025-03-20 21:34:00 +00:00

63 lines
1.2 KiB
Go

// Copyright 2019 the Go-FUSE Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package fs
import (
"context"
"syscall"
"github.com/hanwen/go-fuse/v2/fuse"
)
type dirArray struct {
entries []fuse.DirEntry
}
func (a *dirArray) HasNext() bool {
return len(a.entries) > 0
}
func (a *dirArray) Next() (fuse.DirEntry, syscall.Errno) {
e := a.entries[0]
a.entries = a.entries[1:]
return e, 0
}
func (a *dirArray) Close() {
}
// NewListDirStream wraps a slice of DirEntry as a DirStream.
func NewListDirStream(list []fuse.DirEntry) DirStream {
return &dirArray{list}
}
// implement FileReaddirenter/FileReleasedirer
type dirStreamAsFile struct {
creator func(context.Context) (DirStream, syscall.Errno)
ds DirStream
}
func (d *dirStreamAsFile) Releasedir(ctx context.Context, releaseFlags uint32) {
if d.ds != nil {
d.ds.Close()
}
}
func (d *dirStreamAsFile) Readdirent(ctx context.Context) (de *fuse.DirEntry, errno syscall.Errno) {
if d.ds == nil {
d.ds, errno = d.creator(ctx)
if errno != 0 {
return nil, errno
}
}
if !d.ds.HasNext() {
return nil, 0
}
e, errno := d.ds.Next()
return &e, errno
}