podman-build/vendor/github.com/hugelgupf/p9/fsimpl/templatefs/readonly.go
2025-10-11 12:30:35 +09:00

195 lines
5.3 KiB
Go

package templatefs
import (
"github.com/hugelgupf/p9/linux"
"github.com/hugelgupf/p9/p9"
)
// NotSymlinkFile denies Readlink with EINVAL.
//
// EINVAL is returned by readlink(2) when the file is not a symlink.
type NotSymlinkFile struct{}
// Readlink implements p9.File.Readlink.
func (NotSymlinkFile) Readlink() (string, error) {
return "", linux.EINVAL
}
// NotDirectoryFile denies any directory operations with ENOTDIR.
//
// Those operations are Create, Mkdir, Symlink, Link, Mknod, RenameAt,
// UnlinkAt, and Readdir.
type NotDirectoryFile struct{}
// Create implements p9.File.Create.
func (NotDirectoryFile) Create(name string, mode p9.OpenFlags, permissions p9.FileMode, _ p9.UID, _ p9.GID) (p9.File, p9.QID, uint32, error) {
return nil, p9.QID{}, 0, linux.ENOTDIR
}
// Mkdir implements p9.File.Mkdir.
func (NotDirectoryFile) Mkdir(name string, permissions p9.FileMode, _ p9.UID, _ p9.GID) (p9.QID, error) {
return p9.QID{}, linux.ENOTDIR
}
// Symlink implements p9.File.Symlink.
func (NotDirectoryFile) Symlink(oldname string, newname string, _ p9.UID, _ p9.GID) (p9.QID, error) {
return p9.QID{}, linux.ENOTDIR
}
// Link implements p9.File.Link.
func (NotDirectoryFile) Link(target p9.File, newname string) error {
return linux.ENOTDIR
}
// Mknod implements p9.File.Mknod.
func (NotDirectoryFile) Mknod(name string, mode p9.FileMode, major uint32, minor uint32, _ p9.UID, _ p9.GID) (p9.QID, error) {
return p9.QID{}, linux.ENOTDIR
}
// RenameAt implements p9.File.RenameAt.
func (NotDirectoryFile) RenameAt(oldname string, newdir p9.File, newname string) error {
return linux.ENOTDIR
}
// UnlinkAt implements p9.File.UnlinkAt.
func (NotDirectoryFile) UnlinkAt(name string, flags uint32) error {
return linux.ENOTDIR
}
// Readdir implements p9.File.Readdir.
func (NotDirectoryFile) Readdir(offset uint64, count uint32) (p9.Dirents, error) {
return nil, linux.ENOTDIR
}
// ReadOnlyFile returns default denials for all methods except Open, ReadAt,
// Walk, Close, and GetAttr.
//
// Returns EROFS for most modifying operations, ENOTDIR for file creation ops
// or readdir, EINVAL for readlink, xattr and lock operations return ENOSYS.
//
// Does nothing for Renamed.
type ReadOnlyFile struct {
NotSymlinkFile
NotDirectoryFile
XattrUnimplemented
NoopRenamed
NotLockable
}
// FSync implements p9.File.FSync.
func (ReadOnlyFile) FSync() error {
return linux.EROFS
}
// SetAttr implements p9.File.SetAttr.
func (ReadOnlyFile) SetAttr(valid p9.SetAttrMask, attr p9.SetAttr) error {
return linux.EROFS
}
// Remove implements p9.File.Remove.
func (ReadOnlyFile) Remove() error {
return linux.EROFS
}
// Rename implements p9.File.Rename.
func (ReadOnlyFile) Rename(directory p9.File, name string) error {
return linux.EROFS
}
// WriteAt implements p9.File.WriteAt.
func (ReadOnlyFile) WriteAt(p []byte, offset int64) (int, error) {
return 0, linux.EROFS
}
// Flush implements p9.File.Flush.
func (ReadOnlyFile) Flush() error {
return nil
}
// ReadOnlyDir implements default denials for all methods except Walk, Open,
// GetAttr, Readdir, Close.
//
// Creation operations return EROFS. Read/write operations return EISDIR.
// EINVAL for readlink. Renaming does nothing by default, xattr and locking are
// unimplemented.
type ReadOnlyDir struct {
NotSymlinkFile
IsDir
XattrUnimplemented
NoopRenamed
NotLockable
}
// Create implements p9.File.Create.
func (ReadOnlyDir) Create(name string, mode p9.OpenFlags, permissions p9.FileMode, _ p9.UID, _ p9.GID) (p9.File, p9.QID, uint32, error) {
return nil, p9.QID{}, 0, linux.EROFS
}
// Mkdir implements p9.File.Mkdir.
func (ReadOnlyDir) Mkdir(name string, permissions p9.FileMode, _ p9.UID, _ p9.GID) (p9.QID, error) {
return p9.QID{}, linux.EROFS
}
// Symlink implements p9.File.Symlink.
func (ReadOnlyDir) Symlink(oldname string, newname string, _ p9.UID, _ p9.GID) (p9.QID, error) {
return p9.QID{}, linux.EROFS
}
// Link implements p9.File.Link.
func (ReadOnlyDir) Link(target p9.File, newname string) error {
return linux.EROFS
}
// Mknod implements p9.File.Mknod.
func (ReadOnlyDir) Mknod(name string, mode p9.FileMode, major uint32, minor uint32, _ p9.UID, _ p9.GID) (p9.QID, error) {
return p9.QID{}, linux.EROFS
}
// RenameAt implements p9.File.RenameAt.
func (ReadOnlyDir) RenameAt(oldname string, newdir p9.File, newname string) error {
return linux.EROFS
}
// UnlinkAt implements p9.File.UnlinkAt.
func (ReadOnlyDir) UnlinkAt(name string, flags uint32) error {
return linux.EROFS
}
// Readdir implements p9.File.Readdir.
func (ReadOnlyDir) Readdir(offset uint64, count uint32) (p9.Dirents, error) {
return nil, linux.EROFS
}
// FSync implements p9.File.FSync.
func (ReadOnlyDir) FSync() error {
return linux.EROFS
}
// SetAttr implements p9.File.SetAttr.
func (ReadOnlyDir) SetAttr(valid p9.SetAttrMask, attr p9.SetAttr) error {
return linux.EROFS
}
// Remove implements p9.File.Remove.
func (ReadOnlyDir) Remove() error {
return linux.EROFS
}
// Rename implements p9.File.Rename.
func (ReadOnlyDir) Rename(directory p9.File, name string) error {
return linux.EROFS
}
// IsDir returns EISDIR for ReadAt and WriteAt.
type IsDir struct{}
// WriteAt implements p9.File.WriteAt.
func (IsDir) WriteAt(p []byte, offset int64) (int, error) {
return 0, linux.EISDIR
}
// ReadAt implements p9.File.ReadAt.
func (IsDir) ReadAt(p []byte, offset int64) (int, error) {
return 0, linux.EISDIR
}