mirror of
https://github.com/containers/podman.git
synced 2025-06-26 04:46:57 +08:00
Bump github.com/containers/storage from 1.23.2 to 1.23.4
Bumps [github.com/containers/storage](https://github.com/containers/storage) from 1.23.2 to 1.23.4. - [Release notes](https://github.com/containers/storage/releases) - [Changelog](https://github.com/containers/storage/blob/master/docs/containers-storage-changes.md) - [Commits](https://github.com/containers/storage/compare/v1.23.2...v1.23.4) Signed-off-by: dependabot-preview[bot] <support@dependabot.com> Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
![27856297+dependabot-preview[bot]@users.noreply.github.com](/assets/img/avatar_default.png)
committed by
Daniel J Walsh

parent
fa487a6522
commit
b62fa769f8
2
go.mod
2
go.mod
@ -15,7 +15,7 @@ require (
|
|||||||
github.com/containers/conmon v2.0.20+incompatible
|
github.com/containers/conmon v2.0.20+incompatible
|
||||||
github.com/containers/image/v5 v5.5.2
|
github.com/containers/image/v5 v5.5.2
|
||||||
github.com/containers/psgo v1.5.1
|
github.com/containers/psgo v1.5.1
|
||||||
github.com/containers/storage v1.23.2
|
github.com/containers/storage v1.23.4
|
||||||
github.com/coreos/go-systemd/v22 v22.1.0
|
github.com/coreos/go-systemd/v22 v22.1.0
|
||||||
github.com/cri-o/ocicni v0.2.0
|
github.com/cri-o/ocicni v0.2.0
|
||||||
github.com/cyphar/filepath-securejoin v0.2.2
|
github.com/cyphar/filepath-securejoin v0.2.2
|
||||||
|
5
go.sum
5
go.sum
@ -90,6 +90,8 @@ github.com/containers/storage v1.20.2/go.mod h1:oOB9Ie8OVPojvoaKWEGSEtHbXUAs+tSy
|
|||||||
github.com/containers/storage v1.23.0/go.mod h1:I1EIAA7B4OwWRSA0b4yq2AW1wjvvfcY0zLWQuwTa4zw=
|
github.com/containers/storage v1.23.0/go.mod h1:I1EIAA7B4OwWRSA0b4yq2AW1wjvvfcY0zLWQuwTa4zw=
|
||||||
github.com/containers/storage v1.23.2 h1:GPZ8PXYezML1gmZ/uFaXQpyps7AH645lmdvvOJwJYNc=
|
github.com/containers/storage v1.23.2 h1:GPZ8PXYezML1gmZ/uFaXQpyps7AH645lmdvvOJwJYNc=
|
||||||
github.com/containers/storage v1.23.2/go.mod h1:AyTMMiE5ANvZJiqvatQgSZ85wAl5yHucY3NDN/kemr4=
|
github.com/containers/storage v1.23.2/go.mod h1:AyTMMiE5ANvZJiqvatQgSZ85wAl5yHucY3NDN/kemr4=
|
||||||
|
github.com/containers/storage v1.23.4 h1:1raHKGNs2C52tEq2ydHqZ+wu2u1d79BHMO6O5JO20xQ=
|
||||||
|
github.com/containers/storage v1.23.4/go.mod h1:KzpVgmUucelPYHq2YsseUTiTuucdVh3xfpPNmxmPZRU=
|
||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
github.com/coreos/go-iptables v0.4.5 h1:DpHb9vJrZQEFMcVLFKAAGMUVX0XoRC0ptCthinRYm38=
|
github.com/coreos/go-iptables v0.4.5 h1:DpHb9vJrZQEFMcVLFKAAGMUVX0XoRC0ptCthinRYm38=
|
||||||
@ -267,6 +269,8 @@ github.com/klauspost/compress v1.10.11 h1:K9z59aO18Aywg2b/WSgBaUX99mHy2BES18Cr5l
|
|||||||
github.com/klauspost/compress v1.10.11/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
github.com/klauspost/compress v1.10.11/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||||
github.com/klauspost/pgzip v1.2.4 h1:TQ7CNpYKovDOmqzRHKxJh0BeaBI7UdQZYc6p7pMQh1A=
|
github.com/klauspost/pgzip v1.2.4 h1:TQ7CNpYKovDOmqzRHKxJh0BeaBI7UdQZYc6p7pMQh1A=
|
||||||
github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
|
github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
|
||||||
|
github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE=
|
||||||
|
github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
@ -291,6 +295,7 @@ github.com/mistifyio/go-zfs v2.1.1+incompatible h1:gAMO1HM9xBRONLHHYnu5iFsOJUiJd
|
|||||||
github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
|
github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
|
||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
|
github.com/moby/sys/mountinfo v0.1.3 h1:KIrhRO14+AkwKvG/g2yIpNMOUVZ02xNhOw8KY1WsLOI=
|
||||||
github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o=
|
github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o=
|
||||||
github.com/moby/vpnkit v0.4.0/go.mod h1:KyjUrL9cb6ZSNNAUwZfqRjhwwgJ3BJN+kXh0t43WTUQ=
|
github.com/moby/vpnkit v0.4.0/go.mod h1:KyjUrL9cb6ZSNNAUwZfqRjhwwgJ3BJN+kXh0t43WTUQ=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
|
2
vendor/github.com/containers/storage/VERSION
generated
vendored
2
vendor/github.com/containers/storage/VERSION
generated
vendored
@ -1 +1 @@
|
|||||||
1.23.2
|
1.23.4
|
||||||
|
3
vendor/github.com/containers/storage/go.mod
generated
vendored
3
vendor/github.com/containers/storage/go.mod
generated
vendored
@ -9,9 +9,10 @@ require (
|
|||||||
github.com/docker/go-units v0.4.0
|
github.com/docker/go-units v0.4.0
|
||||||
github.com/hashicorp/go-multierror v1.1.0
|
github.com/hashicorp/go-multierror v1.1.0
|
||||||
github.com/klauspost/compress v1.10.11
|
github.com/klauspost/compress v1.10.11
|
||||||
github.com/klauspost/pgzip v1.2.4
|
github.com/klauspost/pgzip v1.2.5
|
||||||
github.com/mattn/go-shellwords v1.0.10
|
github.com/mattn/go-shellwords v1.0.10
|
||||||
github.com/mistifyio/go-zfs v2.1.1+incompatible
|
github.com/mistifyio/go-zfs v2.1.1+incompatible
|
||||||
|
github.com/moby/sys/mountinfo v0.1.3
|
||||||
github.com/opencontainers/go-digest v1.0.0
|
github.com/opencontainers/go-digest v1.0.0
|
||||||
github.com/opencontainers/runc v1.0.0-rc91
|
github.com/opencontainers/runc v1.0.0-rc91
|
||||||
github.com/opencontainers/runtime-spec v1.0.3-0.20200520003142-237cc4f519e2
|
github.com/opencontainers/runtime-spec v1.0.3-0.20200520003142-237cc4f519e2
|
||||||
|
4
vendor/github.com/containers/storage/go.sum
generated
vendored
4
vendor/github.com/containers/storage/go.sum
generated
vendored
@ -64,8 +64,8 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL
|
|||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/klauspost/compress v1.10.11 h1:K9z59aO18Aywg2b/WSgBaUX99mHy2BES18Cr5lBKZHk=
|
github.com/klauspost/compress v1.10.11 h1:K9z59aO18Aywg2b/WSgBaUX99mHy2BES18Cr5lBKZHk=
|
||||||
github.com/klauspost/compress v1.10.11/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
github.com/klauspost/compress v1.10.11/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||||
github.com/klauspost/pgzip v1.2.4 h1:TQ7CNpYKovDOmqzRHKxJh0BeaBI7UdQZYc6p7pMQh1A=
|
github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE=
|
||||||
github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
|
github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
2
vendor/github.com/containers/storage/layers.go
generated
vendored
2
vendor/github.com/containers/storage/layers.go
generated
vendored
@ -1342,6 +1342,7 @@ func (r *layerStore) ApplyDiff(to string, diff io.Reader) (size int64, err error
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return -1, err
|
return -1, err
|
||||||
}
|
}
|
||||||
|
defer idLogger.Close()
|
||||||
payload, err := asm.NewInputTarStream(io.TeeReader(uncompressed, io.MultiWriter(uncompressedCounter, idLogger)), metadata, storage.NewDiscardFilePutter())
|
payload, err := asm.NewInputTarStream(io.TeeReader(uncompressed, io.MultiWriter(uncompressedCounter, idLogger)), metadata, storage.NewDiscardFilePutter())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return -1, err
|
return -1, err
|
||||||
@ -1356,7 +1357,6 @@ func (r *layerStore) ApplyDiff(to string, diff io.Reader) (size int64, err error
|
|||||||
return -1, err
|
return -1, err
|
||||||
}
|
}
|
||||||
compressor.Close()
|
compressor.Close()
|
||||||
idLogger.Close()
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if err := os.MkdirAll(filepath.Dir(r.tspath(layer.ID)), 0700); err != nil {
|
if err := os.MkdirAll(filepath.Dir(r.tspath(layer.ID)), 0700); err != nil {
|
||||||
return -1, err
|
return -1, err
|
||||||
|
29
vendor/github.com/containers/storage/pkg/mount/mount.go
generated
vendored
29
vendor/github.com/containers/storage/pkg/mount/mount.go
generated
vendored
@ -4,8 +4,6 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/containers/storage/pkg/fileutils"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// mountError holds an error from a mount or unmount operation
|
// mountError holds an error from a mount or unmount operation
|
||||||
@ -43,33 +41,6 @@ func (e *mountError) Cause() error {
|
|||||||
return e.err
|
return e.err
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetMounts retrieves a list of mounts for the current running process.
|
|
||||||
func GetMounts() ([]*Info, error) {
|
|
||||||
return parseMountTable()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mounted determines if a specified mountpoint has been mounted.
|
|
||||||
// On Linux it looks at /proc/self/mountinfo and on Solaris at mnttab.
|
|
||||||
func Mounted(mountpoint string) (bool, error) {
|
|
||||||
entries, err := parseMountTable()
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
mountpoint, err = fileutils.ReadSymlinkedPath(mountpoint)
|
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Search the table for the mountpoint
|
|
||||||
for _, e := range entries {
|
|
||||||
if e.Mountpoint == mountpoint {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mount will mount filesystem according to the specified configuration, on the
|
// Mount will mount filesystem according to the specified configuration, on the
|
||||||
// condition that the target path is *not* already mounted. Options must be
|
// condition that the target path is *not* already mounted. Options must be
|
||||||
// specified like the mount or fstab unix commands: "opt1=val1,opt2=val2". See
|
// specified like the mount or fstab unix commands: "opt1=val1,opt2=val2". See
|
||||||
|
51
vendor/github.com/containers/storage/pkg/mount/mountinfo.go
generated
vendored
51
vendor/github.com/containers/storage/pkg/mount/mountinfo.go
generated
vendored
@ -1,40 +1,21 @@
|
|||||||
package mount
|
package mount
|
||||||
|
|
||||||
// Info reveals information about a particular mounted filesystem. This
|
import (
|
||||||
// struct is populated from the content in the /proc/<pid>/mountinfo file.
|
"github.com/containers/storage/pkg/fileutils"
|
||||||
type Info struct {
|
"github.com/moby/sys/mountinfo"
|
||||||
// ID is a unique identifier of the mount (may be reused after umount).
|
)
|
||||||
ID int
|
|
||||||
|
|
||||||
// Parent indicates the ID of the mount parent (or of self for the top of the
|
type Info = mountinfo.Info
|
||||||
// mount tree).
|
|
||||||
Parent int
|
|
||||||
|
|
||||||
// Major indicates one half of the device ID which identifies the device class.
|
func GetMounts() ([]*Info, error) {
|
||||||
Major int
|
return mountinfo.GetMounts(nil)
|
||||||
|
}
|
||||||
// Minor indicates one half of the device ID which identifies a specific
|
|
||||||
// instance of device.
|
// Mounted determines if a specified mountpoint has been mounted.
|
||||||
Minor int
|
func Mounted(mountpoint string) (bool, error) {
|
||||||
|
mountpoint, err := fileutils.ReadSymlinkedPath(mountpoint)
|
||||||
// Root of the mount within the filesystem.
|
if err != nil {
|
||||||
Root string
|
return false, err
|
||||||
|
}
|
||||||
// Mountpoint indicates the mount point relative to the process's root.
|
return mountinfo.Mounted(mountpoint)
|
||||||
Mountpoint string
|
|
||||||
|
|
||||||
// Opts represents mount-specific options.
|
|
||||||
Opts string
|
|
||||||
|
|
||||||
// Optional represents optional fields.
|
|
||||||
Optional string
|
|
||||||
|
|
||||||
// Fstype indicates the type of filesystem, such as EXT3.
|
|
||||||
Fstype string
|
|
||||||
|
|
||||||
// Source indicates filesystem specific information or "none".
|
|
||||||
Source string
|
|
||||||
|
|
||||||
// VfsOpts represents per super block options.
|
|
||||||
VfsOpts string
|
|
||||||
}
|
}
|
||||||
|
119
vendor/github.com/containers/storage/pkg/mount/mountinfo_linux.go
generated
vendored
119
vendor/github.com/containers/storage/pkg/mount/mountinfo_linux.go
generated
vendored
@ -1,120 +1,5 @@
|
|||||||
package mount
|
package mount
|
||||||
|
|
||||||
import (
|
import "github.com/moby/sys/mountinfo"
|
||||||
"bufio"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
var PidMountInfo = mountinfo.PidMountInfo
|
||||||
)
|
|
||||||
|
|
||||||
// Parse /proc/self/mountinfo because comparing Dev and ino does not work from
|
|
||||||
// bind mounts
|
|
||||||
func parseMountTable() ([]*Info, error) {
|
|
||||||
f, err := os.Open("/proc/self/mountinfo")
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
return parseInfoFile(f)
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseInfoFile(r io.Reader) ([]*Info, error) {
|
|
||||||
s := bufio.NewScanner(r)
|
|
||||||
out := []*Info{}
|
|
||||||
|
|
||||||
for s.Scan() {
|
|
||||||
/*
|
|
||||||
36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue
|
|
||||||
(0)(1)(2) (3) (4) (5) (6) (7) (8) (9) (10)
|
|
||||||
|
|
||||||
(0) mount ID: unique identifier of the mount (may be reused after umount)
|
|
||||||
(1) parent ID: ID of parent (or of self for the top of the mount tree)
|
|
||||||
(2) major:minor: value of st_dev for files on filesystem
|
|
||||||
(3) root: root of the mount within the filesystem
|
|
||||||
(4) mount point: mount point relative to the process's root
|
|
||||||
(5) mount options: per mount options
|
|
||||||
(6) optional fields: zero or more fields of the form "tag[:value]"
|
|
||||||
(7) separator: marks the end of the optional fields
|
|
||||||
(8) filesystem type: name of filesystem of the form "type[.subtype]"
|
|
||||||
(9) mount source: filesystem specific information or "none"
|
|
||||||
(10) super options: per super block options
|
|
||||||
*/
|
|
||||||
text := s.Text()
|
|
||||||
fields := strings.Split(text, " ")
|
|
||||||
numFields := len(fields)
|
|
||||||
if numFields < 10 {
|
|
||||||
// should be at least 10 fields
|
|
||||||
return nil, errors.Errorf("Parsing %q failed: not enough fields (%d)", text, numFields)
|
|
||||||
}
|
|
||||||
|
|
||||||
p := &Info{}
|
|
||||||
// ignore any number parsing errors, there should not be any
|
|
||||||
p.ID, _ = strconv.Atoi(fields[0])
|
|
||||||
p.Parent, _ = strconv.Atoi(fields[1])
|
|
||||||
mm := strings.Split(fields[2], ":")
|
|
||||||
if len(mm) != 2 {
|
|
||||||
return nil, fmt.Errorf("Parsing %q failed: unexpected minor:major pair %s", text, mm)
|
|
||||||
}
|
|
||||||
p.Major, _ = strconv.Atoi(mm[0])
|
|
||||||
p.Minor, _ = strconv.Atoi(mm[1])
|
|
||||||
p.Root = fields[3]
|
|
||||||
p.Mountpoint = fields[4]
|
|
||||||
p.Opts = fields[5]
|
|
||||||
|
|
||||||
// one or more optional fields, when a separator (-)
|
|
||||||
i := 6
|
|
||||||
for ; i < numFields && fields[i] != "-"; i++ {
|
|
||||||
switch i {
|
|
||||||
case 6:
|
|
||||||
p.Optional = string(fields[6])
|
|
||||||
default:
|
|
||||||
/* NOTE there might be more optional fields before the separator,
|
|
||||||
such as fields[7] or fields[8], although as of Linux kernel 5.5
|
|
||||||
the only known ones are mount propagation flags in fields[6].
|
|
||||||
The correct behavior is to ignore any unknown optional fields.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if i == numFields {
|
|
||||||
return nil, fmt.Errorf("Parsing %q failed: missing - separator", text)
|
|
||||||
}
|
|
||||||
|
|
||||||
// There should be 3 fields after the separator...
|
|
||||||
if i+4 > numFields {
|
|
||||||
return nil, fmt.Errorf("Parsing %q failed: not enough fields after a - separator", text)
|
|
||||||
}
|
|
||||||
// ... but in Linux <= 3.9 mounting a cifs with spaces in a share name
|
|
||||||
// (like "//serv/My Documents") _may_ end up having a space in the last field
|
|
||||||
// of mountinfo (like "unc=//serv/My Documents"). Since kernel 3.10-rc1, cifs
|
|
||||||
// option unc= is ignored, so a space should not appear. In here we ignore
|
|
||||||
// those "extra" fields caused by extra spaces.
|
|
||||||
p.Fstype = fields[i+1]
|
|
||||||
p.Source = fields[i+2]
|
|
||||||
p.VfsOpts = fields[i+3]
|
|
||||||
|
|
||||||
out = append(out, p)
|
|
||||||
}
|
|
||||||
if err := s.Err(); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return out, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// PidMountInfo collects the mounts for a specific process ID. If the process
|
|
||||||
// ID is unknown, it is better to use `GetMounts` which will inspect
|
|
||||||
// "/proc/self/mountinfo" instead.
|
|
||||||
func PidMountInfo(pid int) ([]*Info, error) {
|
|
||||||
f, err := os.Open(fmt.Sprintf("/proc/%d/mountinfo", pid))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
return parseInfoFile(f)
|
|
||||||
}
|
|
||||||
|
12
vendor/github.com/containers/storage/pkg/mount/mountinfo_unsupported.go
generated
vendored
12
vendor/github.com/containers/storage/pkg/mount/mountinfo_unsupported.go
generated
vendored
@ -1,12 +0,0 @@
|
|||||||
// +build !linux
|
|
||||||
|
|
||||||
package mount
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"runtime"
|
|
||||||
)
|
|
||||||
|
|
||||||
func parseMountTable() ([]*Info, error) {
|
|
||||||
return nil, fmt.Errorf("mount.parseMountTable is not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
|
|
||||||
}
|
|
11
vendor/github.com/klauspost/pgzip/.travis.yml
generated
vendored
11
vendor/github.com/klauspost/pgzip/.travis.yml
generated
vendored
@ -1,17 +1,20 @@
|
|||||||
language: go
|
language: go
|
||||||
|
|
||||||
sudo: false
|
|
||||||
|
|
||||||
os:
|
os:
|
||||||
- linux
|
- linux
|
||||||
- osx
|
- osx
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- 1.9.x
|
- 1.13.x
|
||||||
- 1.10.x
|
- 1.14.x
|
||||||
|
- 1.15.x
|
||||||
- master
|
- master
|
||||||
|
|
||||||
|
env:
|
||||||
|
- GO111MODULE=off
|
||||||
|
|
||||||
script:
|
script:
|
||||||
|
- diff <(gofmt -d .) <(printf "")
|
||||||
- go test -v -cpu=1,2,4 .
|
- go test -v -cpu=1,2,4 .
|
||||||
- go test -v -cpu=2 -race -short .
|
- go test -v -cpu=2 -race -short .
|
||||||
|
|
||||||
|
11
vendor/github.com/klauspost/pgzip/gunzip.go
generated
vendored
11
vendor/github.com/klauspost/pgzip/gunzip.go
generated
vendored
@ -331,6 +331,16 @@ func (z *Reader) killReadAhead() error {
|
|||||||
// Wait for decompressor to be closed and return error, if any.
|
// Wait for decompressor to be closed and return error, if any.
|
||||||
e, ok := <-z.closeErr
|
e, ok := <-z.closeErr
|
||||||
z.activeRA = false
|
z.activeRA = false
|
||||||
|
|
||||||
|
for blk := range z.readAhead {
|
||||||
|
if blk.b != nil {
|
||||||
|
z.blockPool <- blk.b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if cap(z.current) > 0 {
|
||||||
|
z.blockPool <- z.current
|
||||||
|
z.current = nil
|
||||||
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
// Channel is closed, so if there was any error it has already been returned.
|
// Channel is closed, so if there was any error it has already been returned.
|
||||||
return nil
|
return nil
|
||||||
@ -418,6 +428,7 @@ func (z *Reader) doReadAhead() {
|
|||||||
case z.readAhead <- read{b: buf, err: err}:
|
case z.readAhead <- read{b: buf, err: err}:
|
||||||
case <-closeReader:
|
case <-closeReader:
|
||||||
// Sent on close, we don't care about the next results
|
// Sent on close, we don't care about the next results
|
||||||
|
z.blockPool <- buf
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
202
vendor/github.com/moby/sys/mountinfo/LICENSE
generated
vendored
Normal file
202
vendor/github.com/moby/sys/mountinfo/LICENSE
generated
vendored
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
3
vendor/github.com/moby/sys/mountinfo/go.mod
generated
vendored
Normal file
3
vendor/github.com/moby/sys/mountinfo/go.mod
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module github.com/moby/sys/mountinfo
|
||||||
|
|
||||||
|
go 1.14
|
67
vendor/github.com/moby/sys/mountinfo/mountinfo.go
generated
vendored
Normal file
67
vendor/github.com/moby/sys/mountinfo/mountinfo.go
generated
vendored
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
package mountinfo
|
||||||
|
|
||||||
|
import "io"
|
||||||
|
|
||||||
|
// GetMounts retrieves a list of mounts for the current running process,
|
||||||
|
// with an optional filter applied (use nil for no filter).
|
||||||
|
func GetMounts(f FilterFunc) ([]*Info, error) {
|
||||||
|
return parseMountTable(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMountsFromReader retrieves a list of mounts from the
|
||||||
|
// reader provided, with an optional filter applied (use nil
|
||||||
|
// for no filter). This can be useful in tests or benchmarks
|
||||||
|
// that provide a fake mountinfo data.
|
||||||
|
func GetMountsFromReader(reader io.Reader, f FilterFunc) ([]*Info, error) {
|
||||||
|
return parseInfoFile(reader, f)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mounted determines if a specified mountpoint has been mounted.
|
||||||
|
// On Linux it looks at /proc/self/mountinfo.
|
||||||
|
func Mounted(mountpoint string) (bool, error) {
|
||||||
|
entries, err := GetMounts(SingleEntryFilter(mountpoint))
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return len(entries) > 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Info reveals information about a particular mounted filesystem. This
|
||||||
|
// struct is populated from the content in the /proc/<pid>/mountinfo file.
|
||||||
|
type Info struct {
|
||||||
|
// ID is a unique identifier of the mount (may be reused after umount).
|
||||||
|
ID int
|
||||||
|
|
||||||
|
// Parent indicates the ID of the mount parent (or of self for the top of the
|
||||||
|
// mount tree).
|
||||||
|
Parent int
|
||||||
|
|
||||||
|
// Major indicates one half of the device ID which identifies the device class.
|
||||||
|
Major int
|
||||||
|
|
||||||
|
// Minor indicates one half of the device ID which identifies a specific
|
||||||
|
// instance of device.
|
||||||
|
Minor int
|
||||||
|
|
||||||
|
// Root of the mount within the filesystem.
|
||||||
|
Root string
|
||||||
|
|
||||||
|
// Mountpoint indicates the mount point relative to the process's root.
|
||||||
|
Mountpoint string
|
||||||
|
|
||||||
|
// Opts represents mount-specific options.
|
||||||
|
Opts string
|
||||||
|
|
||||||
|
// Optional represents optional fields.
|
||||||
|
Optional string
|
||||||
|
|
||||||
|
// Fstype indicates the type of filesystem, such as EXT3.
|
||||||
|
Fstype string
|
||||||
|
|
||||||
|
// Source indicates filesystem specific information or "none".
|
||||||
|
Source string
|
||||||
|
|
||||||
|
// VfsOpts represents per super block options.
|
||||||
|
VfsOpts string
|
||||||
|
}
|
58
vendor/github.com/moby/sys/mountinfo/mountinfo_filters.go
generated
vendored
Normal file
58
vendor/github.com/moby/sys/mountinfo/mountinfo_filters.go
generated
vendored
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
package mountinfo
|
||||||
|
|
||||||
|
import "strings"
|
||||||
|
|
||||||
|
// FilterFunc is a type defining a callback function for GetMount(),
|
||||||
|
// used to filter out mountinfo entries we're not interested in,
|
||||||
|
// and/or stop further processing if we found what we wanted.
|
||||||
|
//
|
||||||
|
// It takes a pointer to the Info struct (not fully populated,
|
||||||
|
// currently only Mountpoint, Fstype, Source, and (on Linux)
|
||||||
|
// VfsOpts are filled in), and returns two booleans:
|
||||||
|
//
|
||||||
|
// - skip: true if the entry should be skipped
|
||||||
|
// - stop: true if parsing should be stopped after the entry
|
||||||
|
type FilterFunc func(*Info) (skip, stop bool)
|
||||||
|
|
||||||
|
// PrefixFilter discards all entries whose mount points
|
||||||
|
// do not start with a specific prefix
|
||||||
|
func PrefixFilter(prefix string) FilterFunc {
|
||||||
|
return func(m *Info) (bool, bool) {
|
||||||
|
skip := !strings.HasPrefix(m.Mountpoint, prefix)
|
||||||
|
return skip, false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SingleEntryFilter looks for a specific entry
|
||||||
|
func SingleEntryFilter(mp string) FilterFunc {
|
||||||
|
return func(m *Info) (bool, bool) {
|
||||||
|
if m.Mountpoint == mp {
|
||||||
|
return false, true // don't skip, stop now
|
||||||
|
}
|
||||||
|
return true, false // skip, keep going
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParentsFilter returns all entries whose mount points
|
||||||
|
// can be parents of a path specified, discarding others.
|
||||||
|
//
|
||||||
|
// For example, given `/var/lib/docker/something`, entries
|
||||||
|
// like `/var/lib/docker`, `/var` and `/` are returned.
|
||||||
|
func ParentsFilter(path string) FilterFunc {
|
||||||
|
return func(m *Info) (bool, bool) {
|
||||||
|
skip := !strings.HasPrefix(path, m.Mountpoint)
|
||||||
|
return skip, false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FstypeFilter returns all entries that match provided fstype(s).
|
||||||
|
func FstypeFilter(fstype ...string) FilterFunc {
|
||||||
|
return func(m *Info) (bool, bool) {
|
||||||
|
for _, t := range fstype {
|
||||||
|
if m.Fstype == t {
|
||||||
|
return false, false // don't skeep, keep going
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true, false // skip, keep going
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package mount
|
package mountinfo
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
@ -13,9 +13,8 @@ import (
|
|||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Parse /proc/self/mountinfo because comparing Dev and ino does not work from
|
// parseMountTable returns information about mounted filesystems
|
||||||
// bind mounts.
|
func parseMountTable(filter FilterFunc) ([]*Info, error) {
|
||||||
func parseMountTable() ([]*Info, error) {
|
|
||||||
var rawEntries *C.struct_statfs
|
var rawEntries *C.struct_statfs
|
||||||
|
|
||||||
count := int(C.getmntinfo(&rawEntries, C.MNT_WAIT))
|
count := int(C.getmntinfo(&rawEntries, C.MNT_WAIT))
|
||||||
@ -32,10 +31,23 @@ func parseMountTable() ([]*Info, error) {
|
|||||||
var out []*Info
|
var out []*Info
|
||||||
for _, entry := range entries {
|
for _, entry := range entries {
|
||||||
var mountinfo Info
|
var mountinfo Info
|
||||||
|
var skip, stop bool
|
||||||
mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[0])
|
mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[0])
|
||||||
mountinfo.Source = C.GoString(&entry.f_mntfromname[0])
|
|
||||||
mountinfo.Fstype = C.GoString(&entry.f_fstypename[0])
|
mountinfo.Fstype = C.GoString(&entry.f_fstypename[0])
|
||||||
|
mountinfo.Source = C.GoString(&entry.f_mntfromname[0])
|
||||||
|
|
||||||
|
if filter != nil {
|
||||||
|
// filter out entries we're not interested in
|
||||||
|
skip, stop = filter(&mountinfo)
|
||||||
|
if skip {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
out = append(out, &mountinfo)
|
out = append(out, &mountinfo)
|
||||||
|
if stop {
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
152
vendor/github.com/moby/sys/mountinfo/mountinfo_linux.go
generated
vendored
Normal file
152
vendor/github.com/moby/sys/mountinfo/mountinfo_linux.go
generated
vendored
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
// +build go1.13
|
||||||
|
|
||||||
|
package mountinfo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func parseInfoFile(r io.Reader, filter FilterFunc) ([]*Info, error) {
|
||||||
|
s := bufio.NewScanner(r)
|
||||||
|
out := []*Info{}
|
||||||
|
var err error
|
||||||
|
for s.Scan() {
|
||||||
|
if err = s.Err(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
See http://man7.org/linux/man-pages/man5/proc.5.html
|
||||||
|
|
||||||
|
36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue
|
||||||
|
(1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11)
|
||||||
|
|
||||||
|
(1) mount ID: unique identifier of the mount (may be reused after umount)
|
||||||
|
(2) parent ID: ID of parent (or of self for the top of the mount tree)
|
||||||
|
(3) major:minor: value of st_dev for files on filesystem
|
||||||
|
(4) root: root of the mount within the filesystem
|
||||||
|
(5) mount point: mount point relative to the process's root
|
||||||
|
(6) mount options: per mount options
|
||||||
|
(7) optional fields: zero or more fields of the form "tag[:value]"
|
||||||
|
(8) separator: marks the end of the optional fields
|
||||||
|
(9) filesystem type: name of filesystem of the form "type[.subtype]"
|
||||||
|
(10) mount source: filesystem specific information or "none"
|
||||||
|
(11) super options: per super block options
|
||||||
|
|
||||||
|
In other words, we have:
|
||||||
|
* 6 mandatory fields (1)..(6)
|
||||||
|
* 0 or more optional fields (7)
|
||||||
|
* a separator field (8)
|
||||||
|
* 3 mandatory fields (9)..(11)
|
||||||
|
*/
|
||||||
|
|
||||||
|
text := s.Text()
|
||||||
|
fields := strings.Split(text, " ")
|
||||||
|
numFields := len(fields)
|
||||||
|
if numFields < 10 {
|
||||||
|
// should be at least 10 fields
|
||||||
|
return nil, fmt.Errorf("Parsing '%s' failed: not enough fields (%d)", text, numFields)
|
||||||
|
}
|
||||||
|
|
||||||
|
// separator field
|
||||||
|
sepIdx := numFields - 4
|
||||||
|
// In Linux <= 3.9 mounting a cifs with spaces in a share
|
||||||
|
// name (like "//srv/My Docs") _may_ end up having a space
|
||||||
|
// in the last field of mountinfo (like "unc=//serv/My Docs").
|
||||||
|
// Since kernel 3.10-rc1, cifs option "unc=" is ignored,
|
||||||
|
// so spaces should not appear.
|
||||||
|
//
|
||||||
|
// Check for a separator, and work around the spaces bug
|
||||||
|
for fields[sepIdx] != "-" {
|
||||||
|
sepIdx--
|
||||||
|
if sepIdx == 5 {
|
||||||
|
return nil, fmt.Errorf("Parsing '%s' failed: missing - separator", text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p := &Info{}
|
||||||
|
|
||||||
|
// Fill in the fields that a filter might check
|
||||||
|
p.Mountpoint, err = strconv.Unquote(`"` + fields[4] + `"`)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("Parsing '%s' failed: unable to unquote mount point field: %w", fields[4], err)
|
||||||
|
}
|
||||||
|
p.Fstype = fields[sepIdx+1]
|
||||||
|
p.Source = fields[sepIdx+2]
|
||||||
|
p.VfsOpts = fields[sepIdx+3]
|
||||||
|
|
||||||
|
// Run a filter soon so we can skip parsing/adding entries
|
||||||
|
// the caller is not interested in
|
||||||
|
var skip, stop bool
|
||||||
|
if filter != nil {
|
||||||
|
skip, stop = filter(p)
|
||||||
|
if skip {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fill in the rest of the fields
|
||||||
|
|
||||||
|
// ignore any numbers parsing errors, as there should not be any
|
||||||
|
p.ID, _ = strconv.Atoi(fields[0])
|
||||||
|
p.Parent, _ = strconv.Atoi(fields[1])
|
||||||
|
mm := strings.Split(fields[2], ":")
|
||||||
|
if len(mm) != 2 {
|
||||||
|
return nil, fmt.Errorf("Parsing '%s' failed: unexpected minor:major pair %s", text, mm)
|
||||||
|
}
|
||||||
|
p.Major, _ = strconv.Atoi(mm[0])
|
||||||
|
p.Minor, _ = strconv.Atoi(mm[1])
|
||||||
|
|
||||||
|
p.Root, err = strconv.Unquote(`"` + fields[3] + `"`)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("Parsing '%s' failed: unable to unquote root field: %w", fields[3], err)
|
||||||
|
}
|
||||||
|
|
||||||
|
p.Opts = fields[5]
|
||||||
|
|
||||||
|
// zero or more optional fields
|
||||||
|
switch {
|
||||||
|
case sepIdx == 6:
|
||||||
|
// zero, do nothing
|
||||||
|
case sepIdx == 7:
|
||||||
|
p.Optional = fields[6]
|
||||||
|
default:
|
||||||
|
p.Optional = strings.Join(fields[6:sepIdx-1], " ")
|
||||||
|
}
|
||||||
|
|
||||||
|
out = append(out, p)
|
||||||
|
if stop {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse /proc/self/mountinfo because comparing Dev and ino does not work from
|
||||||
|
// bind mounts
|
||||||
|
func parseMountTable(filter FilterFunc) ([]*Info, error) {
|
||||||
|
f, err := os.Open("/proc/self/mountinfo")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
return parseInfoFile(f, filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
// PidMountInfo collects the mounts for a specific process ID. If the process
|
||||||
|
// ID is unknown, it is better to use `GetMounts` which will inspect
|
||||||
|
// "/proc/self/mountinfo" instead.
|
||||||
|
func PidMountInfo(pid int) ([]*Info, error) {
|
||||||
|
f, err := os.Open(fmt.Sprintf("/proc/%d/mountinfo", pid))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
return parseInfoFile(f, nil)
|
||||||
|
}
|
17
vendor/github.com/moby/sys/mountinfo/mountinfo_unsupported.go
generated
vendored
Normal file
17
vendor/github.com/moby/sys/mountinfo/mountinfo_unsupported.go
generated
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
// +build !windows,!linux,!freebsd freebsd,!cgo
|
||||||
|
|
||||||
|
package mountinfo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func parseMountTable(_ FilterFunc) ([]*Info, error) {
|
||||||
|
return nil, fmt.Errorf("mount.parseMountTable is not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInfoFile(_ io.Reader, f FilterFunc) ([]*Info, error) {
|
||||||
|
return parseMountTable(f)
|
||||||
|
}
|
12
vendor/github.com/moby/sys/mountinfo/mountinfo_windows.go
generated
vendored
Normal file
12
vendor/github.com/moby/sys/mountinfo/mountinfo_windows.go
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package mountinfo
|
||||||
|
|
||||||
|
import "io"
|
||||||
|
|
||||||
|
func parseMountTable(_ FilterFunc) ([]*Info, error) {
|
||||||
|
// Do NOT return an error!
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInfoFile(_ io.Reader, f FilterFunc) ([]*Info, error) {
|
||||||
|
return parseMountTable(f)
|
||||||
|
}
|
6
vendor/modules.txt
vendored
6
vendor/modules.txt
vendored
@ -158,7 +158,7 @@ github.com/containers/psgo/internal/dev
|
|||||||
github.com/containers/psgo/internal/host
|
github.com/containers/psgo/internal/host
|
||||||
github.com/containers/psgo/internal/proc
|
github.com/containers/psgo/internal/proc
|
||||||
github.com/containers/psgo/internal/process
|
github.com/containers/psgo/internal/process
|
||||||
# github.com/containers/storage v1.23.2
|
# github.com/containers/storage v1.23.4
|
||||||
github.com/containers/storage
|
github.com/containers/storage
|
||||||
github.com/containers/storage/drivers
|
github.com/containers/storage/drivers
|
||||||
github.com/containers/storage/drivers/aufs
|
github.com/containers/storage/drivers/aufs
|
||||||
@ -336,7 +336,7 @@ github.com/klauspost/compress/huff0
|
|||||||
github.com/klauspost/compress/snappy
|
github.com/klauspost/compress/snappy
|
||||||
github.com/klauspost/compress/zstd
|
github.com/klauspost/compress/zstd
|
||||||
github.com/klauspost/compress/zstd/internal/xxhash
|
github.com/klauspost/compress/zstd/internal/xxhash
|
||||||
# github.com/klauspost/pgzip v1.2.4
|
# github.com/klauspost/pgzip v1.2.5
|
||||||
github.com/klauspost/pgzip
|
github.com/klauspost/pgzip
|
||||||
# github.com/konsorten/go-windows-terminal-sequences v1.0.3
|
# github.com/konsorten/go-windows-terminal-sequences v1.0.3
|
||||||
github.com/konsorten/go-windows-terminal-sequences
|
github.com/konsorten/go-windows-terminal-sequences
|
||||||
@ -350,6 +350,8 @@ github.com/mattn/go-shellwords
|
|||||||
github.com/matttproud/golang_protobuf_extensions/pbutil
|
github.com/matttproud/golang_protobuf_extensions/pbutil
|
||||||
# github.com/mistifyio/go-zfs v2.1.1+incompatible
|
# github.com/mistifyio/go-zfs v2.1.1+incompatible
|
||||||
github.com/mistifyio/go-zfs
|
github.com/mistifyio/go-zfs
|
||||||
|
# github.com/moby/sys/mountinfo v0.1.3
|
||||||
|
github.com/moby/sys/mountinfo
|
||||||
# github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
|
# github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
|
||||||
github.com/modern-go/concurrent
|
github.com/modern-go/concurrent
|
||||||
# github.com/modern-go/reflect2 v1.0.1
|
# github.com/modern-go/reflect2 v1.0.1
|
||||||
|
Reference in New Issue
Block a user