File: readops.go

package info (click to toggle)
golang-github-bep-overlayfs 0.9.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 164 kB
  • sloc: makefile: 2
file content (60 lines) | stat: -rw-r--r-- 1,407 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package overlayfs

import (
	"os"

	"github.com/spf13/afero"
)

// Stat returns a FileInfo describing the named file, or an error, if any
// happens.
func (ofs *OverlayFs) Stat(name string) (os.FileInfo, error) {
	_, fi, _, err := ofs.stat(name, false)
	return fi, err
}

// LstatIfPossible will call Lstat if the filesystem iself is, or it delegates to, the os filesystem.
// Else it will call Stat.
func (ofs *OverlayFs) LstatIfPossible(name string) (os.FileInfo, bool, error) {
	_, fi, ok, err := ofs.stat(name, false)
	return fi, ok, err
}

// Open opens a file, returning it or an error, if any happens.
// If name is a directory, a *Dir is returned representing all directories matching name.
// Note that a *Dir must not be used after it's closed.
func (ofs *OverlayFs) Open(name string) (afero.File, error) {
	fs, fi, _, err := ofs.stat(name, false)
	if err != nil {
		return nil, err
	}

	if fi.IsDir() {
		dir := getDir()
		dir.name = name
		dir.merge = ofs.mergeDirs
		if err := ofs.collectDirs(name, func(fs afero.Fs) {
			dir.fss = append(dir.fss, fs)
		}); err != nil {
			dir.Close()
			return nil, err
		}

		if len(dir.fss) == 0 {
			// They mave been deleted.
			dir.Close()
			return nil, os.ErrNotExist
		}

		if len(dir.fss) == 1 {
			// Optimize for the common case.
			d, err := dir.fss[0].Open(name)
			dir.Close()
			return d, err
		}

		return dir, nil
	}

	return fs.Open(name)
}