198 строки
5 КиБ
Go
198 строки
5 КиБ
Go
// Package os implements a subset of the Go "os" package. See
|
|
// https://godoc.org/os for details.
|
|
//
|
|
// Note that the current implementation is blocking. This limitation should be
|
|
// removed in a future version.
|
|
package os
|
|
|
|
import (
|
|
"io"
|
|
"syscall"
|
|
)
|
|
|
|
// Mkdir creates a directory. If the operation fails, it will return an error of
|
|
// type *PathError.
|
|
func Mkdir(path string, perm FileMode) error {
|
|
fs, suffix := findMount(path)
|
|
if fs == nil {
|
|
return &PathError{"mkdir", path, ErrNotExist}
|
|
}
|
|
err := fs.Mkdir(suffix, perm)
|
|
if err != nil {
|
|
return &PathError{"mkdir", path, err}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Remove removes a file or (empty) directory. If the operation fails, it will
|
|
// return an error of type *PathError.
|
|
func Remove(path string) error {
|
|
fs, suffix := findMount(path)
|
|
if fs == nil {
|
|
return &PathError{"remove", path, ErrNotExist}
|
|
}
|
|
err := fs.Remove(suffix)
|
|
if err != nil {
|
|
return &PathError{"remove", path, err}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// File represents an open file descriptor.
|
|
type File struct {
|
|
handle FileHandle
|
|
name string
|
|
}
|
|
|
|
// Name returns the name of the file with which it was opened.
|
|
func (f *File) Name() string {
|
|
return f.name
|
|
}
|
|
|
|
// OpenFile opens the named file. If the operation fails, the returned error
|
|
// will be of type *PathError.
|
|
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
|
|
fs, suffix := findMount(name)
|
|
if fs == nil {
|
|
return nil, &PathError{"open", name, ErrNotExist}
|
|
}
|
|
handle, err := fs.OpenFile(suffix, flag, perm)
|
|
if err != nil {
|
|
return nil, &PathError{"open", name, err}
|
|
}
|
|
return &File{name: name, handle: handle}, nil
|
|
}
|
|
|
|
// Open opens the file named for reading.
|
|
func Open(name string) (*File, error) {
|
|
return OpenFile(name, O_RDONLY, 0)
|
|
}
|
|
|
|
// Create creates the named file, overwriting it if it already exists.
|
|
func Create(name string) (*File, error) {
|
|
return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)
|
|
}
|
|
|
|
// Read reads up to len(b) bytes from the File. It returns the number of bytes
|
|
// read and any error encountered. At end of file, Read returns 0, io.EOF.
|
|
func (f *File) Read(b []byte) (n int, err error) {
|
|
n, err = f.handle.Read(b)
|
|
if err != nil && err != io.EOF {
|
|
err = &PathError{"read", f.name, err}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (f *File) ReadAt(b []byte, off int64) (n int, err error) {
|
|
return 0, ErrNotImplemented
|
|
}
|
|
|
|
// Write writes len(b) bytes to the File. It returns the number of bytes written
|
|
// and an error, if any. Write returns a non-nil error when n != len(b).
|
|
func (f *File) Write(b []byte) (n int, err error) {
|
|
n, err = f.handle.Write(b)
|
|
if err != nil {
|
|
err = &PathError{"write", f.name, err}
|
|
}
|
|
return
|
|
}
|
|
|
|
// Close closes the File, rendering it unusable for I/O.
|
|
func (f *File) Close() (err error) {
|
|
err = f.handle.Close()
|
|
if err != nil {
|
|
err = &PathError{"close", f.name, err}
|
|
}
|
|
return
|
|
}
|
|
|
|
// Readdir is a stub, not yet implemented
|
|
func (f *File) Readdir(n int) ([]FileInfo, error) {
|
|
return nil, &PathError{"readdir", f.name, ErrNotImplemented}
|
|
}
|
|
|
|
// Readdirnames is a stub, not yet implemented
|
|
func (f *File) Readdirnames(n int) (names []string, err error) {
|
|
return nil, &PathError{"readdirnames", f.name, ErrNotImplemented}
|
|
}
|
|
|
|
// Stat is a stub, not yet implemented
|
|
func (f *File) Stat() (FileInfo, error) {
|
|
return nil, &PathError{"stat", f.name, ErrNotImplemented}
|
|
}
|
|
|
|
// Sync is a stub, not yet implemented
|
|
func (f *File) Sync() error {
|
|
return ErrNotImplemented
|
|
}
|
|
|
|
func (f *File) SyscallConn() (syscall.RawConn, error) {
|
|
return nil, ErrNotImplemented
|
|
}
|
|
|
|
// Fd returns the file handle referencing the open file.
|
|
func (f *File) Fd() uintptr {
|
|
panic("unimplemented: os.file.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()
|
|
}
|
|
|
|
const (
|
|
O_RDONLY int = syscall.O_RDONLY
|
|
O_WRONLY int = syscall.O_WRONLY
|
|
O_RDWR int = syscall.O_RDWR
|
|
O_APPEND int = syscall.O_APPEND
|
|
O_CREATE int = syscall.O_CREAT
|
|
O_EXCL int = syscall.O_EXCL
|
|
O_SYNC int = syscall.O_SYNC
|
|
O_TRUNC int = syscall.O_TRUNC
|
|
)
|
|
|
|
// Stat is a stub, not yet implemented
|
|
func Stat(name string) (FileInfo, error) {
|
|
return nil, &PathError{"stat", name, ErrNotImplemented}
|
|
}
|
|
|
|
// Lstat is a stub, not yet implemented
|
|
func Lstat(name string) (FileInfo, error) {
|
|
return nil, &PathError{"lstat", name, ErrNotImplemented}
|
|
}
|
|
|
|
// 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"
|
|
}
|
|
|
|
// Getpid is a stub (for now), always returning 1
|
|
func Getpid() int {
|
|
return 1
|
|
}
|