| package billy |
| |
| import ( |
| "errors" |
| "io" |
| "os" |
| "time" |
| ) |
| |
| var ( |
| ErrReadOnly = errors.New("read-only filesystem") |
| ErrNotSupported = errors.New("feature not supported") |
| ErrCrossedBoundary = errors.New("chroot boundary crossed") |
| ) |
| |
| // Filesystem abstract the operations in a storage-agnostic interface. |
| // Each method implementation mimics the behavior of the equivalent functions |
| // at the os package from the standard library. |
| type Filesystem interface { |
| Basic |
| TempFile |
| Dir |
| Symlink |
| Chroot |
| } |
| |
| // Basic abstract the basic operations in a storage-agnostic interface as |
| // an extension to the Basic interface. |
| type Basic interface { |
| // Create creates the named file with mode 0666 (before umask), truncating |
| // it if it already exists. If successful, methods on the returned File can |
| // be used for I/O; the associated file descriptor has mode O_RDWR. |
| Create(filename string) (File, error) |
| // Open opens the named file for reading. If successful, methods on the |
| // returned file can be used for reading; the associated file descriptor has |
| // mode O_RDONLY. |
| Open(filename string) (File, error) |
| // OpenFile is the generalized open call; most users will use Open or Create |
| // instead. It opens the named file with specified flag (O_RDONLY etc.) and |
| // perm, (0666 etc.) if applicable. If successful, methods on the returned |
| // File can be used for I/O. |
| OpenFile(filename string, flag int, perm os.FileMode) (File, error) |
| // Stat returns a FileInfo describing the named file. |
| Stat(filename string) (os.FileInfo, error) |
| // Rename renames (moves) oldpath to newpath. If newpath already exists and |
| // is not a directory, Rename replaces it. OS-specific restrictions may |
| // apply when oldpath and newpath are in different directories. |
| Rename(oldpath, newpath string) error |
| // Remove removes the named file or directory. |
| Remove(filename string) error |
| // Join joins any number of path elements into a single path, adding a |
| // Separator if necessary. Join calls filepath.Clean on the result; in |
| // particular, all empty strings are ignored. On Windows, the result is a |
| // UNC path if and only if the first path element is a UNC path. |
| Join(elem ...string) string |
| } |
| |
| type TempFile interface { |
| // TempFile creates a new temporary file in the directory dir with a name |
| // beginning with prefix, opens the file for reading and writing, and |
| // returns the resulting *os.File. If dir is the empty string, TempFile |
| // uses the default directory for temporary files (see os.TempDir). |
| // Multiple programs calling TempFile simultaneously will not choose the |
| // same file. The caller can use f.Name() to find the pathname of the file. |
| // It is the caller's responsibility to remove the file when no longer |
| // needed. |
| TempFile(dir, prefix string) (File, error) |
| } |
| |
| // Dir abstract the dir related operations in a storage-agnostic interface as |
| // an extension to the Basic interface. |
| type Dir interface { |
| // ReadDir reads the directory named by dirname and returns a list of |
| // directory entries sorted by filename. |
| ReadDir(path string) ([]os.FileInfo, error) |
| // MkdirAll creates a directory named path, along with any necessary |
| // parents, and returns nil, or else returns an error. The permission bits |
| // perm are used for all directories that MkdirAll creates. If path is/ |
| // already a directory, MkdirAll does nothing and returns nil. |
| MkdirAll(filename string, perm os.FileMode) error |
| } |
| |
| // Symlink abstract the symlink related operations in a storage-agnostic |
| // interface as an extension to the Basic interface. |
| type Symlink interface { |
| // Lstat returns a FileInfo describing the named file. If the file is a |
| // symbolic link, the returned FileInfo describes the symbolic link. Lstat |
| // makes no attempt to follow the link. |
| Lstat(filename string) (os.FileInfo, error) |
| // Symlink creates a symbolic-link from link to target. target may be an |
| // absolute or relative path, and need not refer to an existing node. |
| // Parent directories of link are created as necessary. |
| Symlink(target, link string) error |
| // Readlink returns the target path of link. |
| Readlink(link string) (string, error) |
| } |
| |
| // Change abstract the FileInfo change related operations in a storage-agnostic |
| // interface as an extension to the Basic interface |
| type Change interface { |
| // Chmod changes the mode of the named file to mode. If the file is a |
| // symbolic link, it changes the mode of the link's target. |
| Chmod(name string, mode os.FileMode) error |
| // Lchown changes the numeric uid and gid of the named file. If the file is |
| // a symbolic link, it changes the uid and gid of the link itself. |
| Lchown(name string, uid, gid int) error |
| // Chown changes the numeric uid and gid of the named file. If the file is a |
| // symbolic link, it changes the uid and gid of the link's target. |
| Chown(name string, uid, gid int) error |
| // Chtimes changes the access and modification times of the named file, |
| // similar to the Unix utime() or utimes() functions. |
| // |
| // The underlying filesystem may truncate or round the values to a less |
| // precise time unit. |
| Chtimes(name string, atime time.Time, mtime time.Time) error |
| } |
| |
| // Chroot abstract the chroot related operations in a storage-agnostic interface |
| // as an extension to the Basic interface. |
| type Chroot interface { |
| // Chroot returns a new filesystem from the same type where the new root is |
| // the given path. Files outside of the designated directory tree cannot be |
| // accessed. |
| Chroot(path string) (Filesystem, error) |
| // Root returns the root path of the filesystem. |
| Root() string |
| } |
| |
| // File represent a file, being a subset of the os.File |
| type File interface { |
| // Name returns the name of the file as presented to Open. |
| Name() string |
| io.Writer |
| io.Reader |
| io.ReaderAt |
| io.Seeker |
| io.Closer |
| } |