diff options
author | Justin Clift <[email protected]> | 2019-06-30 05:28:07 +1000 |
---|---|---|
committer | Ayke van Laethem <[email protected]> | 2019-07-15 01:18:37 +0200 |
commit | 847681457fe1f4f7fa9e637f140cbe11f82ef383 (patch) | |
tree | 973ba6e69679f373c4ac5c2e743c4a5c903becc3 | |
parent | 66d8899aa7e17223276b279f10853ef5fb2a4ea0 (diff) | |
download | tinygo-847681457fe1f4f7fa9e637f140cbe11f82ef383.tar.gz tinygo-847681457fe1f4f7fa9e637f140cbe11f82ef383.zip |
runtime: add several os package stubs
-rw-r--r-- | src/os/file.go | 161 | ||||
-rw-r--r-- | src/os/file_other.go | 6 |
2 files changed, 163 insertions, 4 deletions
diff --git a/src/os/file.go b/src/os/file.go index c275a39ed..9f247dc6e 100644 --- a/src/os/file.go +++ b/src/os/file.go @@ -11,7 +11,8 @@ import ( // Portable analogs of some common system call errors. var ( - ErrUnsupported = errors.New("operation not supported") + errUnsupported = errors.New("operation not supported") + notImplemented = errors.New("os: not implemented") ) // Stdin, Stdout, and Stderr are open Files pointing to the standard input, @@ -28,6 +29,21 @@ type File struct { name string } +// Readdir is a stub, not yet implemented +func (f *File) Readdir(n int) ([]FileInfo, error) { + return nil, notImplemented +} + +// Readdirnames is a stub, not yet implemented +func (f *File) Readdirnames(n int) (names []string, err error) { + return nil, notImplemented +} + +// Stat is a stub, not yet implemented +func (f *File) Stat() (FileInfo, error) { + return nil, notImplemented +} + // NewFile returns a new File with the given file descriptor and name. func NewFile(fd uintptr, name string) *File { return &File{fd, name} @@ -38,3 +54,146 @@ func NewFile(fd uintptr, name string) *File { func (f *File) Fd() uintptr { return f.fd } + +const ( + PathSeparator = '/' // OS-specific path separator + PathListSeparator = ':' // OS-specific path list separator +) + +// IsPathSeparator reports whether c is a directory separator character. +func IsPathSeparator(c uint8) bool { + return PathSeparator == c +} + +// PathError records an error and the operation and file path that caused it. +type PathError struct { + Op string + Path string + Err error +} + +func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() } + +// Open is a super simple stub function (for now), only capable of opening stdin, stdout, and stderr +func Open(name string) (*File, error) { + fd := uintptr(999) + switch name { + case "/dev/stdin": + fd = 0 + case "/dev/stdout": + fd = 1 + case "/dev/stderr": + fd = 2 + default: + return nil, &PathError{"open", name, notImplemented} + } + return &File{fd, name}, nil +} + +// OpenFile is a stub, passing through to the stub Open() call +func OpenFile(name string, flag int, perm FileMode) (*File, error) { + return Open(name) +} + +// Create is a stub, passing through to the stub Open() call +func Create(name string) (*File, error) { + return Open(name) +} + +type FileMode uint32 + +// Mode constants, copied from the mainline Go source +// https://github.com/golang/go/blob/4ce6a8e89668b87dce67e2f55802903d6eb9110a/src/os/types.go#L35-L63 +const ( + // The single letters are the abbreviations used by the String method's formatting. + ModeDir FileMode = 1 << (32 - 1 - iota) // d: is a directory + ModeAppend // a: append-only + ModeExclusive // l: exclusive use + ModeTemporary // T: temporary file; Plan 9 only + ModeSymlink // L: symbolic link + ModeDevice // D: device file + ModeNamedPipe // p: named pipe (FIFO) + ModeSocket // S: Unix domain socket + ModeSetuid // u: setuid + ModeSetgid // g: setgid + ModeCharDevice // c: Unix character device, when ModeDevice is set + ModeSticky // t: sticky + ModeIrregular // ?: non-regular file; nothing else is known about this file + + // Mask for the type bits. For regular files, none will be set. + ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice | ModeCharDevice | ModeIrregular + + ModePerm FileMode = 0777 // Unix permission bits +) + +// IsDir is a stub, always returning false +func (m FileMode) IsDir() bool { + return false +} + +// Stub constants +const ( + O_RDONLY int = 1 + O_WRONLY int = 2 + O_RDWR int = 4 + O_APPEND int = 8 + O_CREATE int = 16 + O_EXCL int = 32 + O_SYNC int = 64 + O_TRUNC int = 128 +) + +// A FileInfo describes a file and is returned by Stat and Lstat. +type FileInfo interface { + Name() string // base name of the file + Size() int64 // length in bytes for regular files; system-dependent for others + Mode() FileMode // file mode bits + // ModTime() time.Time // modification time + IsDir() bool // abbreviation for Mode().IsDir() + Sys() interface{} // underlying data source (can return nil) +} + +// Stat is a stub, not yet implemented +func Stat(name string) (FileInfo, error) { + return nil, notImplemented +} + +// Lstat is a stub, not yet implemented +func Lstat(name string) (FileInfo, error) { + return nil, notImplemented +} + +// Getwd is a stub (for now), always returning an empty string +func Getwd() (string, error) { + return "", nil +} + +// Readlink is a stub (for now), always returning the string it was given +func Readlink(name string) (string, error) { + return name, nil +} + +// TempDir is a stub (for now), always returning the string "/tmp" +func TempDir() string { + return "/tmp" +} + +// Mkdir is a stub, not yet implemented +func Mkdir(name string, perm FileMode) error { + return notImplemented +} + +// IsExist is a stub (for now), always returning false +func IsExist(err error) bool { + return false +} + +// IsNotExist is a stub (for now), always returning false +func IsNotExist(err error) bool { + return false +} + +// Getpid is a stub (for now), always returning 1 +func Getpid() int { + return 1 +} diff --git a/src/os/file_other.go b/src/os/file_other.go index abe90868c..8d168ebc4 100644 --- a/src/os/file_other.go +++ b/src/os/file_other.go @@ -8,7 +8,7 @@ import ( // Read is unsupported on this system. func (f *File) Read(b []byte) (n int, err error) { - return 0, ErrUnsupported + return 0, errUnsupported } // Write writes len(b) bytes to the output. It returns the number of bytes @@ -21,13 +21,13 @@ func (f *File) Write(b []byte) (n int, err error) { } return len(b), nil default: - return 0, ErrUnsupported + return 0, errUnsupported } } // Close is unsupported on this system. func (f *File) Close() error { - return ErrUnsupported + return errUnsupported } //go:linkname putchar runtime.putchar |