package sys

import "github.com/tetratelabs/wazero/internal/sys"

Index

Constants

const (
	FdStdin uint32 = iota
	FdStdout
	FdStderr

	// FdRoot is the file descriptor of the root ("/") filesystem.
	//
	// # Why file descriptor 3?
	//
	// While not specified, the most common WASI implementation, wasi-libc, expects
	// POSIX style file descriptor allocation, where the lowest available number is
	// used to open the next file. Since 1 and 2 are taken by stdout and stderr,
	// `root` is assigned 3.
	//   - https://github.com/WebAssembly/WASI/issues/122
	//   - https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_14
	//   - https://github.com/WebAssembly/wasi-libc/blob/wasi-sdk-16/libc-bottom-half/sources/preopens.c#L215
	FdRoot
)

Variables

var EmptyFS = &emptyFS{}

EmptyFS is exported to special-case an empty file system.

Types

type Context

type Context struct {
	// contains filtered or unexported fields
}

Context holds module-scoped system resources currently only supported by built-in host functions.

func DefaultContext

func DefaultContext(fs fs.FS) *Context

DefaultContext returns Context with no values set except a possibly nil fs.FS

func NewContext

func NewContext(
	max uint32,
	args, environ [][]byte,
	stdin io.Reader,
	stdout, stderr io.Writer,
	randSource io.Reader,
	walltime *sys.Walltime,
	walltimeResolution sys.ClockResolution,
	nanotime *sys.Nanotime,
	nanotimeResolution sys.ClockResolution,
	nanosleep *sys.Nanosleep,
	fs fs.FS,
) (sysCtx *Context, err error)

NewContext is a factory function which helps avoid needing to know defaults or exporting all fields. Note: max is exposed for testing. max is only used for env/args validation.

func (*Context) Args

func (c *Context) Args() [][]byte

Args is like os.Args and defaults to nil.

Note: The count will never be more than math.MaxUint32. See wazero.ModuleConfig WithArgs

func (*Context) ArgsSize

func (c *Context) ArgsSize() uint32

ArgsSize is the size to encode Args as Null-terminated strings.

Note: To get the size without null-terminators, subtract the length of Args from this value. See wazero.ModuleConfig WithArgs See https://en.wikipedia.org/wiki/Null-terminated_string

func (*Context) Environ

func (c *Context) Environ() [][]byte

Environ are "key=value" entries like os.Environ and default to nil.

Note: The count will never be more than math.MaxUint32. See wazero.ModuleConfig WithEnv

func (*Context) EnvironSize

func (c *Context) EnvironSize() uint32

EnvironSize is the size to encode Environ as Null-terminated strings.

Note: To get the size without null-terminators, subtract the length of Environ from this value. See wazero.ModuleConfig WithEnv See https://en.wikipedia.org/wiki/Null-terminated_string

func (*Context) FS

func (c *Context) FS() *FSContext

FS returns the possibly empty (EmptyFS) file system context.

func (*Context) Nanosleep

func (c *Context) Nanosleep(ns int64)

Nanosleep implements sys.Nanosleep.

func (*Context) Nanotime

func (c *Context) Nanotime() int64

Nanotime implements sys.Nanotime.

func (*Context) NanotimeResolution

func (c *Context) NanotimeResolution() sys.ClockResolution

NanotimeResolution returns resolution of Nanotime.

func (*Context) RandSource

func (c *Context) RandSource() io.Reader

RandSource is a source of random bytes and defaults to a deterministic source. see wazero.ModuleConfig WithRandSource

func (*Context) Walltime

func (c *Context) Walltime() (sec int64, nsec int32)

Walltime implements sys.Walltime.

func (*Context) WalltimeResolution

func (c *Context) WalltimeResolution() sys.ClockResolution

WalltimeResolution returns resolution of Walltime.

type FSContext

type FSContext struct {
	// contains filtered or unexported fields
}

func NewFSContext

func NewFSContext(stdin io.Reader, stdout, stderr io.Writer, root fs.FS) (fsc *FSContext, err error)

NewFSContext creates a FSContext, using the `root` parameter for any paths beginning at "/". If the input is EmptyFS, there is no root filesystem. Otherwise, `root` is assigned file descriptor FdRoot and the returned context can open files in that file system. Any error on opening "." is returned.

func (*FSContext) Close

func (c *FSContext) Close(context.Context) (err error)

Close implements api.Closer

func (*FSContext) CloseFile

func (c *FSContext) CloseFile(fd uint32) bool

CloseFile returns true if a file was opened and closed without error, or false if syscall.EBADF.

func (*FSContext) FdReader

func (c *FSContext) FdReader(fd uint32) io.Reader

FdReader returns a valid reader for the given file descriptor or nil if syscall.EBADF.

func (*FSContext) FdWriter

func (c *FSContext) FdWriter(fd uint32) io.Writer

FdWriter returns a valid writer for the given file descriptor or nil if syscall.EBADF.

func (*FSContext) OpenFile

func (c *FSContext) OpenFile(name string) (uint32, error)

OpenFile is like syscall.Open and returns the file descriptor of the new file or an error.

TODO: Consider dirflags and oflags. Also, allow non-read-only open based on config about the mount. e.g. allow os.O_RDONLY, os.O_WRONLY, or os.O_RDWR either by config flag or pattern on filename See #390

func (*FSContext) OpenedFile

func (c *FSContext) OpenedFile(fd uint32) (*FileEntry, bool)

OpenedFile returns a file and true if it was opened or nil and false, if syscall.EBADF.

func (*FSContext) StatFile

func (c *FSContext) StatFile(name string) (fs.FileInfo, error)

type FileEntry

type FileEntry struct {
	// Name is the basename of the file, at the time it was opened. When the
	// file is root "/" (fd = FdRoot), this is "/".
	//
	// Note: This must match fs.FileInfo.
	Name string

	// File is always non-nil, even when root "/" (fd = FdRoot).
	File fs.File

	// ReadDir is present when this File is a fs.ReadDirFile and `ReadDir`
	// was called.
	ReadDir *ReadDir
}

FileEntry maps a path to an open file in a file system.

type ReadDir

type ReadDir struct {
	// CountRead is the total count of files read including Entries.
	CountRead uint64

	// Entries is the contents of the last fs.ReadDirFile call. Notably,
	// directory listing are not rewindable, so we keep entries around in case
	// the caller mis-estimated their buffer and needs a few still cached.
	Entries []fs.DirEntry
}

ReadDir is the status of a prior fs.ReadDirFile call.

Source Files

fs.go sys.go

Version
v1.0.0-pre.5
Published
Dec 15, 2022
Platform
windows/amd64
Imports
12 packages
Last checked
19 minutes ago

Tools for package owners.