mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-10-31 16:13:45 +08:00 
			
		
		
		
	vendor: fix docker/docker vendoring (update to 9f28837c1d93
commitc41b006be1updated the version of docker/docker in go.mod, but possibly overlooked that there was still a replace rule present. As a result the version was not actually updated. This patch removes the replace rule, updating docker/docker to 9f28837c1d93 full diff:4634ce647c...9f28837c1dSigned-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
		
							
								
								
									
										1613
									
								
								vendor/github.com/docker/docker/api/swagger.yaml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1613
									
								
								vendor/github.com/docker/docker/api/swagger.yaml
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2
									
								
								vendor/github.com/docker/docker/api/types/configs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/docker/docker/api/types/configs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -3,6 +3,7 @@ package types // import "github.com/docker/docker/api/types" | ||||
| import ( | ||||
| 	"github.com/docker/docker/api/types/container" | ||||
| 	"github.com/docker/docker/api/types/network" | ||||
| 	specs "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| ) | ||||
|  | ||||
| // configs holds structs used for internal communication between the | ||||
| @@ -15,6 +16,7 @@ type ContainerCreateConfig struct { | ||||
| 	Config           *container.Config | ||||
| 	HostConfig       *container.HostConfig | ||||
| 	NetworkingConfig *network.NetworkingConfig | ||||
| 	Platform         *specs.Platform | ||||
| 	AdjustCPUShares  bool | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										4
									
								
								vendor/github.com/docker/docker/api/types/container/container_top.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/docker/docker/api/types/container/container_top.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -10,7 +10,9 @@ package container // import "github.com/docker/docker/api/types/container" | ||||
| // swagger:model ContainerTopOKBody | ||||
| type ContainerTopOKBody struct { | ||||
|  | ||||
| 	// Each process running in the container, where each is process is an array of values corresponding to the titles | ||||
| 	// Each process running in the container, where each is process | ||||
| 	// is an array of values corresponding to the titles. | ||||
| 	// | ||||
| 	// Required: true | ||||
| 	Processes [][]string `json:"Processes"` | ||||
|  | ||||
|   | ||||
							
								
								
									
										3
									
								
								vendor/github.com/docker/docker/api/types/container/host_config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/docker/docker/api/types/container/host_config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -361,7 +361,7 @@ type Resources struct { | ||||
| 	Devices              []DeviceMapping // List of devices to map inside the container | ||||
| 	DeviceCgroupRules    []string        // List of rule to be added to the device cgroup | ||||
| 	DeviceRequests       []DeviceRequest // List of device requests for device drivers | ||||
| 	KernelMemory         int64           // Kernel memory limit (in bytes) | ||||
| 	KernelMemory         int64           // Kernel memory limit (in bytes), Deprecated: kernel 5.4 deprecated kmem.limit_in_bytes | ||||
| 	KernelMemoryTCP      int64           // Hard limit for kernel TCP buffer memory (in bytes) | ||||
| 	MemoryReservation    int64           // Memory soft limit (in bytes) | ||||
| 	MemorySwap           int64           // Total memory usage (memory + swap); set `-1` to enable unlimited swap | ||||
| @@ -403,7 +403,6 @@ type HostConfig struct { | ||||
| 	// Applicable to UNIX platforms | ||||
| 	CapAdd          strslice.StrSlice // List of kernel capabilities to add to the container | ||||
| 	CapDrop         strslice.StrSlice // List of kernel capabilities to remove from the container | ||||
| 	Capabilities    []string          `json:"Capabilities"` // List of kernel capabilities to be available for container (this overrides the default set) | ||||
| 	CgroupnsMode    CgroupnsMode      // Cgroup namespace mode to use for the container | ||||
| 	DNS             []string          `json:"Dns"`        // List of DNS server to lookup | ||||
| 	DNSOptions      []string          `json:"DnsOptions"` // List of DNSOption to look for | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/github.com/docker/docker/api/types/events/events.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/docker/docker/api/types/events/events.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,6 +1,8 @@ | ||||
| package events // import "github.com/docker/docker/api/types/events" | ||||
|  | ||||
| const ( | ||||
| 	// BuilderEventType is the event type that the builder generates | ||||
| 	BuilderEventType = "builder" | ||||
| 	// ContainerEventType is the event type that containers generate | ||||
| 	ContainerEventType = "container" | ||||
| 	// DaemonEventType is the event type that daemon generate | ||||
|   | ||||
							
								
								
									
										3
									
								
								vendor/github.com/docker/docker/api/types/network/network.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/docker/docker/api/types/network/network.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,7 +1,6 @@ | ||||
| package network // import "github.com/docker/docker/api/types/network" | ||||
| import ( | ||||
| 	"github.com/docker/docker/api/types/filters" | ||||
| 	"github.com/docker/docker/errdefs" | ||||
| ) | ||||
|  | ||||
| // Address represents an IP address | ||||
| @@ -123,5 +122,5 @@ var acceptedFilters = map[string]bool{ | ||||
|  | ||||
| // ValidateFilters validates the list of filter args with the available filters. | ||||
| func ValidateFilters(filter filters.Args) error { | ||||
| 	return errdefs.InvalidParameter(filter.Validate(acceptedFilters)) | ||||
| 	return filter.Validate(acceptedFilters) | ||||
| } | ||||
|   | ||||
							
								
								
									
										15
									
								
								vendor/github.com/docker/docker/api/types/swarm/container.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/docker/docker/api/types/swarm/container.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -67,11 +67,12 @@ type ContainerSpec struct { | ||||
| 	// The format of extra hosts on swarmkit is specified in: | ||||
| 	// http://man7.org/linux/man-pages/man5/hosts.5.html | ||||
| 	//    IP_address canonical_hostname [aliases...] | ||||
| 	Hosts        []string            `json:",omitempty"` | ||||
| 	DNSConfig    *DNSConfig          `json:",omitempty"` | ||||
| 	Secrets      []*SecretReference  `json:",omitempty"` | ||||
| 	Configs      []*ConfigReference  `json:",omitempty"` | ||||
| 	Isolation    container.Isolation `json:",omitempty"` | ||||
| 	Sysctls      map[string]string   `json:",omitempty"` | ||||
| 	Capabilities []string            `json:",omitempty"` | ||||
| 	Hosts          []string            `json:",omitempty"` | ||||
| 	DNSConfig      *DNSConfig          `json:",omitempty"` | ||||
| 	Secrets        []*SecretReference  `json:",omitempty"` | ||||
| 	Configs        []*ConfigReference  `json:",omitempty"` | ||||
| 	Isolation      container.Isolation `json:",omitempty"` | ||||
| 	Sysctls        map[string]string   `json:",omitempty"` | ||||
| 	CapabilityAdd  []string            `json:",omitempty"` | ||||
| 	CapabilityDrop []string            `json:",omitempty"` | ||||
| } | ||||
|   | ||||
							
								
								
									
										12
									
								
								vendor/github.com/docker/docker/api/types/swarm/task.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/docker/docker/api/types/swarm/task.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -91,13 +91,21 @@ type TaskSpec struct { | ||||
| 	Runtime RuntimeType `json:",omitempty"` | ||||
| } | ||||
|  | ||||
| // Resources represents resources (CPU/Memory). | ||||
| // Resources represents resources (CPU/Memory) which can be advertised by a | ||||
| // node and requested to be reserved for a task. | ||||
| type Resources struct { | ||||
| 	NanoCPUs         int64             `json:",omitempty"` | ||||
| 	MemoryBytes      int64             `json:",omitempty"` | ||||
| 	GenericResources []GenericResource `json:",omitempty"` | ||||
| } | ||||
|  | ||||
| // Limit describes limits on resources which can be requested by a task. | ||||
| type Limit struct { | ||||
| 	NanoCPUs    int64 `json:",omitempty"` | ||||
| 	MemoryBytes int64 `json:",omitempty"` | ||||
| 	Pids        int64 `json:",omitempty"` | ||||
| } | ||||
|  | ||||
| // GenericResource represents a "user defined" resource which can | ||||
| // be either an integer (e.g: SSD=3) or a string (e.g: SSD=sda1) | ||||
| type GenericResource struct { | ||||
| @@ -125,7 +133,7 @@ type DiscreteGenericResource struct { | ||||
|  | ||||
| // ResourceRequirements represents resources requirements. | ||||
| type ResourceRequirements struct { | ||||
| 	Limits       *Resources `json:",omitempty"` | ||||
| 	Limits       *Limit     `json:",omitempty"` | ||||
| 	Reservations *Resources `json:",omitempty"` | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										38
									
								
								vendor/github.com/docker/docker/api/types/types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								vendor/github.com/docker/docker/api/types/types.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -158,7 +158,7 @@ type Info struct { | ||||
| 	Plugins            PluginsInfo | ||||
| 	MemoryLimit        bool | ||||
| 	SwapLimit          bool | ||||
| 	KernelMemory       bool | ||||
| 	KernelMemory       bool // Deprecated: kernel 5.4 deprecated kmem.limit_in_bytes | ||||
| 	KernelMemoryTCP    bool | ||||
| 	CPUCfsPeriod       bool `json:"CpuCfsPeriod"` | ||||
| 	CPUCfsQuota        bool `json:"CpuCfsQuota"` | ||||
| @@ -175,6 +175,7 @@ type Info struct { | ||||
| 	SystemTime         string | ||||
| 	LoggingDriver      string | ||||
| 	CgroupDriver       string | ||||
| 	CgroupVersion      string `json:",omitempty"` | ||||
| 	NEventsListener    int | ||||
| 	KernelVersion      string | ||||
| 	OperatingSystem    string | ||||
| @@ -202,15 +203,16 @@ type Info struct { | ||||
| 	// LiveRestoreEnabled determines whether containers should be kept | ||||
| 	// running when the daemon is shutdown or upon daemon start if | ||||
| 	// running containers are detected | ||||
| 	LiveRestoreEnabled bool | ||||
| 	Isolation          container.Isolation | ||||
| 	InitBinary         string | ||||
| 	ContainerdCommit   Commit | ||||
| 	RuncCommit         Commit | ||||
| 	InitCommit         Commit | ||||
| 	SecurityOptions    []string | ||||
| 	ProductLicense     string `json:",omitempty"` | ||||
| 	Warnings           []string | ||||
| 	LiveRestoreEnabled  bool | ||||
| 	Isolation           container.Isolation | ||||
| 	InitBinary          string | ||||
| 	ContainerdCommit    Commit | ||||
| 	RuncCommit          Commit | ||||
| 	InitCommit          Commit | ||||
| 	SecurityOptions     []string | ||||
| 	ProductLicense      string               `json:",omitempty"` | ||||
| 	DefaultAddressPools []NetworkAddressPool `json:",omitempty"` | ||||
| 	Warnings            []string | ||||
| } | ||||
|  | ||||
| // KeyValue holds a key/value pair | ||||
| @@ -218,6 +220,12 @@ type KeyValue struct { | ||||
| 	Key, Value string | ||||
| } | ||||
|  | ||||
| // NetworkAddressPool is a temp struct used by Info struct | ||||
| type NetworkAddressPool struct { | ||||
| 	Base string | ||||
| 	Size int | ||||
| } | ||||
|  | ||||
| // SecurityOpt contains the name and options of a security option | ||||
| type SecurityOpt struct { | ||||
| 	Name    string | ||||
| @@ -510,6 +518,16 @@ type Checkpoint struct { | ||||
| type Runtime struct { | ||||
| 	Path string   `json:"path"` | ||||
| 	Args []string `json:"runtimeArgs,omitempty"` | ||||
|  | ||||
| 	// This is exposed here only for internal use | ||||
| 	// It is not currently supported to specify custom shim configs | ||||
| 	Shim *ShimConfig `json:"-"` | ||||
| } | ||||
|  | ||||
| // ShimConfig is used by runtime to configure containerd shims | ||||
| type ShimConfig struct { | ||||
| 	Binary string | ||||
| 	Opts   interface{} | ||||
| } | ||||
|  | ||||
| // DiskUsage contains response of Engine API: | ||||
|   | ||||
							
								
								
									
										5
									
								
								vendor/github.com/docker/docker/api/types/volume.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/docker/docker/api/types/volume.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -27,10 +27,13 @@ type Volume struct { | ||||
| 	Name string `json:"Name"` | ||||
|  | ||||
| 	// The driver specific options used when creating the volume. | ||||
| 	// | ||||
| 	// Required: true | ||||
| 	Options map[string]string `json:"Options"` | ||||
|  | ||||
| 	// The level at which the volume exists. Either `global` for cluster-wide, or `local` for machine level. | ||||
| 	// The level at which the volume exists. Either `global` for cluster-wide, | ||||
| 	// or `local` for machine level. | ||||
| 	// | ||||
| 	// Required: true | ||||
| 	Scope string `json:"Scope"` | ||||
|  | ||||
|   | ||||
							
								
								
									
										5
									
								
								vendor/github.com/docker/docker/api/types/volume/volume_create.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/docker/docker/api/types/volume/volume_create.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -14,7 +14,9 @@ type VolumeCreateBody struct { | ||||
| 	// Required: true | ||||
| 	Driver string `json:"Driver"` | ||||
|  | ||||
| 	// A mapping of driver options and values. These options are passed directly to the driver and are driver specific. | ||||
| 	// A mapping of driver options and values. These options are | ||||
| 	// passed directly to the driver and are driver specific. | ||||
| 	// | ||||
| 	// Required: true | ||||
| 	DriverOpts map[string]string `json:"DriverOpts"` | ||||
|  | ||||
| @@ -23,6 +25,7 @@ type VolumeCreateBody struct { | ||||
| 	Labels map[string]string `json:"Labels"` | ||||
|  | ||||
| 	// The new volume's name. If not specified, Docker generates a name. | ||||
| 	// | ||||
| 	// Required: true | ||||
| 	Name string `json:"Name"` | ||||
| } | ||||
|   | ||||
							
								
								
									
										3
									
								
								vendor/github.com/docker/docker/api/types/volume/volume_list.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/docker/docker/api/types/volume/volume_list.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -16,7 +16,8 @@ type VolumeListOKBody struct { | ||||
| 	// Required: true | ||||
| 	Volumes []*types.Volume `json:"Volumes"` | ||||
|  | ||||
| 	// Warnings that occurred when fetching the list of volumes | ||||
| 	// Warnings that occurred when fetching the list of volumes. | ||||
| 	// | ||||
| 	// Required: true | ||||
| 	Warnings []string `json:"Warnings"` | ||||
| } | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/github.com/docker/docker/client/client_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/docker/docker/client/client_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| // +build linux freebsd openbsd darwin solaris illumos | ||||
| // +build linux freebsd openbsd netbsd darwin solaris illumos dragonfly | ||||
|  | ||||
| package client // import "github.com/docker/docker/client" | ||||
|  | ||||
|   | ||||
							
								
								
									
										13
									
								
								vendor/github.com/docker/docker/client/container_create.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/docker/docker/client/container_create.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -5,20 +5,23 @@ import ( | ||||
| 	"encoding/json" | ||||
| 	"net/url" | ||||
|  | ||||
| 	"github.com/containerd/containerd/platforms" | ||||
| 	"github.com/docker/docker/api/types/container" | ||||
| 	"github.com/docker/docker/api/types/network" | ||||
| 	"github.com/docker/docker/api/types/versions" | ||||
| 	specs "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| ) | ||||
|  | ||||
| type configWrapper struct { | ||||
| 	*container.Config | ||||
| 	HostConfig       *container.HostConfig | ||||
| 	NetworkingConfig *network.NetworkingConfig | ||||
| 	Platform         *specs.Platform | ||||
| } | ||||
|  | ||||
| // ContainerCreate creates a new container based in the given configuration. | ||||
| // It can be associated with a name, but it's not mandatory. | ||||
| func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, containerName string) (container.ContainerCreateCreatedBody, error) { | ||||
| func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, platform *specs.Platform, containerName string) (container.ContainerCreateCreatedBody, error) { | ||||
| 	var response container.ContainerCreateCreatedBody | ||||
|  | ||||
| 	if err := cli.NewVersionError("1.25", "stop timeout"); config != nil && config.StopTimeout != nil && err != nil { | ||||
| @@ -30,7 +33,15 @@ func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config | ||||
| 		hostConfig.AutoRemove = false | ||||
| 	} | ||||
|  | ||||
| 	if err := cli.NewVersionError("1.41", "specify container image platform"); platform != nil && err != nil { | ||||
| 		return response, err | ||||
| 	} | ||||
|  | ||||
| 	query := url.Values{} | ||||
| 	if platform != nil { | ||||
| 		query.Set("platform", platforms.Format(*platform)) | ||||
| 	} | ||||
|  | ||||
| 	if containerName != "" { | ||||
| 		query.Set("name", containerName) | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										16
									
								
								vendor/github.com/docker/docker/client/container_stats.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/docker/docker/client/container_stats.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -24,3 +24,19 @@ func (cli *Client) ContainerStats(ctx context.Context, containerID string, strea | ||||
| 	osType := getDockerOS(resp.header.Get("Server")) | ||||
| 	return types.ContainerStats{Body: resp.body, OSType: osType}, err | ||||
| } | ||||
|  | ||||
| // ContainerStatsOneShot gets a single stat entry from a container. | ||||
| // It differs from `ContainerStats` in that the API should not wait to prime the stats | ||||
| func (cli *Client) ContainerStatsOneShot(ctx context.Context, containerID string) (types.ContainerStats, error) { | ||||
| 	query := url.Values{} | ||||
| 	query.Set("stream", "0") | ||||
| 	query.Set("one-shot", "1") | ||||
|  | ||||
| 	resp, err := cli.get(ctx, "/containers/"+containerID+"/stats", query, nil) | ||||
| 	if err != nil { | ||||
| 		return types.ContainerStats{}, err | ||||
| 	} | ||||
|  | ||||
| 	osType := getDockerOS(resp.header.Get("Server")) | ||||
| 	return types.ContainerStats{Body: resp.body, OSType: osType}, err | ||||
| } | ||||
|   | ||||
							
								
								
									
										8
									
								
								vendor/github.com/docker/docker/client/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/docker/docker/client/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -24,8 +24,7 @@ func (err errConnectionFailed) Error() string { | ||||
|  | ||||
| // IsErrConnectionFailed returns true if the error is caused by connection failed. | ||||
| func IsErrConnectionFailed(err error) bool { | ||||
| 	_, ok := errors.Cause(err).(errConnectionFailed) | ||||
| 	return ok | ||||
| 	return errors.As(err, &errConnectionFailed{}) | ||||
| } | ||||
|  | ||||
| // ErrorConnectionFailed returns an error with host in the error message when connection to docker daemon failed. | ||||
| @@ -42,8 +41,9 @@ type notFound interface { | ||||
| // IsErrNotFound returns true if the error is a NotFound error, which is returned | ||||
| // by the API when some object is not found. | ||||
| func IsErrNotFound(err error) bool { | ||||
| 	if _, ok := err.(notFound); ok { | ||||
| 		return ok | ||||
| 	var e notFound | ||||
| 	if errors.As(err, &e) { | ||||
| 		return true | ||||
| 	} | ||||
| 	return errdefs.IsNotFound(err) | ||||
| } | ||||
|   | ||||
							
								
								
									
										4
									
								
								vendor/github.com/docker/docker/client/interface.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/docker/docker/client/interface.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -16,6 +16,7 @@ import ( | ||||
| 	"github.com/docker/docker/api/types/registry" | ||||
| 	"github.com/docker/docker/api/types/swarm" | ||||
| 	volumetypes "github.com/docker/docker/api/types/volume" | ||||
| 	specs "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| ) | ||||
|  | ||||
| // CommonAPIClient is the common methods between stable and experimental versions of APIClient. | ||||
| @@ -47,7 +48,7 @@ type CommonAPIClient interface { | ||||
| type ContainerAPIClient interface { | ||||
| 	ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) | ||||
| 	ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error) | ||||
| 	ContainerCreate(ctx context.Context, config *containertypes.Config, hostConfig *containertypes.HostConfig, networkingConfig *networktypes.NetworkingConfig, containerName string) (containertypes.ContainerCreateCreatedBody, error) | ||||
| 	ContainerCreate(ctx context.Context, config *containertypes.Config, hostConfig *containertypes.HostConfig, networkingConfig *networktypes.NetworkingConfig, platform *specs.Platform, containerName string) (containertypes.ContainerCreateCreatedBody, error) | ||||
| 	ContainerDiff(ctx context.Context, container string) ([]containertypes.ContainerChangeResponseItem, error) | ||||
| 	ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) | ||||
| 	ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error) | ||||
| @@ -67,6 +68,7 @@ type ContainerAPIClient interface { | ||||
| 	ContainerRestart(ctx context.Context, container string, timeout *time.Duration) error | ||||
| 	ContainerStatPath(ctx context.Context, container, path string) (types.ContainerPathStat, error) | ||||
| 	ContainerStats(ctx context.Context, container string, stream bool) (types.ContainerStats, error) | ||||
| 	ContainerStatsOneShot(ctx context.Context, container string) (types.ContainerStats, error) | ||||
| 	ContainerStart(ctx context.Context, container string, options types.ContainerStartOptions) error | ||||
| 	ContainerStop(ctx context.Context, container string, timeout *time.Duration) error | ||||
| 	ContainerTop(ctx context.Context, container string, arguments []string) (containertypes.ContainerTopOKBody, error) | ||||
|   | ||||
							
								
								
									
										76
									
								
								vendor/github.com/docker/docker/client/service_create.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										76
									
								
								vendor/github.com/docker/docker/client/service_create.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -15,8 +15,7 @@ import ( | ||||
|  | ||||
| // ServiceCreate creates a new Service. | ||||
| func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options types.ServiceCreateOptions) (types.ServiceCreateResponse, error) { | ||||
| 	var distErr error | ||||
|  | ||||
| 	var response types.ServiceCreateResponse | ||||
| 	headers := map[string][]string{ | ||||
| 		"version": {cli.version}, | ||||
| 	} | ||||
| @@ -31,46 +30,28 @@ func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, | ||||
| 	} | ||||
|  | ||||
| 	if err := validateServiceSpec(service); err != nil { | ||||
| 		return types.ServiceCreateResponse{}, err | ||||
| 		return response, err | ||||
| 	} | ||||
|  | ||||
| 	// ensure that the image is tagged | ||||
| 	var imgPlatforms []swarm.Platform | ||||
| 	if service.TaskTemplate.ContainerSpec != nil { | ||||
| 	var resolveWarning string | ||||
| 	switch { | ||||
| 	case service.TaskTemplate.ContainerSpec != nil: | ||||
| 		if taggedImg := imageWithTagString(service.TaskTemplate.ContainerSpec.Image); taggedImg != "" { | ||||
| 			service.TaskTemplate.ContainerSpec.Image = taggedImg | ||||
| 		} | ||||
| 		if options.QueryRegistry { | ||||
| 			var img string | ||||
| 			img, imgPlatforms, distErr = imageDigestAndPlatforms(ctx, cli, service.TaskTemplate.ContainerSpec.Image, options.EncodedRegistryAuth) | ||||
| 			if img != "" { | ||||
| 				service.TaskTemplate.ContainerSpec.Image = img | ||||
| 			} | ||||
| 			resolveWarning = resolveContainerSpecImage(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// ensure that the image is tagged | ||||
| 	if service.TaskTemplate.PluginSpec != nil { | ||||
| 	case service.TaskTemplate.PluginSpec != nil: | ||||
| 		if taggedImg := imageWithTagString(service.TaskTemplate.PluginSpec.Remote); taggedImg != "" { | ||||
| 			service.TaskTemplate.PluginSpec.Remote = taggedImg | ||||
| 		} | ||||
| 		if options.QueryRegistry { | ||||
| 			var img string | ||||
| 			img, imgPlatforms, distErr = imageDigestAndPlatforms(ctx, cli, service.TaskTemplate.PluginSpec.Remote, options.EncodedRegistryAuth) | ||||
| 			if img != "" { | ||||
| 				service.TaskTemplate.PluginSpec.Remote = img | ||||
| 			} | ||||
| 			resolveWarning = resolvePluginSpecRemote(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if service.TaskTemplate.Placement == nil && len(imgPlatforms) > 0 { | ||||
| 		service.TaskTemplate.Placement = &swarm.Placement{} | ||||
| 	} | ||||
| 	if len(imgPlatforms) > 0 { | ||||
| 		service.TaskTemplate.Placement.Platforms = imgPlatforms | ||||
| 	} | ||||
|  | ||||
| 	var response types.ServiceCreateResponse | ||||
| 	resp, err := cli.post(ctx, "/services/create", nil, service, headers) | ||||
| 	defer ensureReaderClosed(resp) | ||||
| 	if err != nil { | ||||
| @@ -78,14 +59,45 @@ func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, | ||||
| 	} | ||||
|  | ||||
| 	err = json.NewDecoder(resp.body).Decode(&response) | ||||
|  | ||||
| 	if distErr != nil { | ||||
| 		response.Warnings = append(response.Warnings, digestWarning(service.TaskTemplate.ContainerSpec.Image)) | ||||
| 	if resolveWarning != "" { | ||||
| 		response.Warnings = append(response.Warnings, resolveWarning) | ||||
| 	} | ||||
|  | ||||
| 	return response, err | ||||
| } | ||||
|  | ||||
| func resolveContainerSpecImage(ctx context.Context, cli DistributionAPIClient, taskSpec *swarm.TaskSpec, encodedAuth string) string { | ||||
| 	var warning string | ||||
| 	if img, imgPlatforms, err := imageDigestAndPlatforms(ctx, cli, taskSpec.ContainerSpec.Image, encodedAuth); err != nil { | ||||
| 		warning = digestWarning(taskSpec.ContainerSpec.Image) | ||||
| 	} else { | ||||
| 		taskSpec.ContainerSpec.Image = img | ||||
| 		if len(imgPlatforms) > 0 { | ||||
| 			if taskSpec.Placement == nil { | ||||
| 				taskSpec.Placement = &swarm.Placement{} | ||||
| 			} | ||||
| 			taskSpec.Placement.Platforms = imgPlatforms | ||||
| 		} | ||||
| 	} | ||||
| 	return warning | ||||
| } | ||||
|  | ||||
| func resolvePluginSpecRemote(ctx context.Context, cli DistributionAPIClient, taskSpec *swarm.TaskSpec, encodedAuth string) string { | ||||
| 	var warning string | ||||
| 	if img, imgPlatforms, err := imageDigestAndPlatforms(ctx, cli, taskSpec.PluginSpec.Remote, encodedAuth); err != nil { | ||||
| 		warning = digestWarning(taskSpec.PluginSpec.Remote) | ||||
| 	} else { | ||||
| 		taskSpec.PluginSpec.Remote = img | ||||
| 		if len(imgPlatforms) > 0 { | ||||
| 			if taskSpec.Placement == nil { | ||||
| 				taskSpec.Placement = &swarm.Placement{} | ||||
| 			} | ||||
| 			taskSpec.Placement.Platforms = imgPlatforms | ||||
| 		} | ||||
| 	} | ||||
| 	return warning | ||||
| } | ||||
|  | ||||
| func imageDigestAndPlatforms(ctx context.Context, cli DistributionAPIClient, image, encodedAuth string) (string, []swarm.Platform, error) { | ||||
| 	distributionInspect, err := cli.DistributionInspect(ctx, image, encodedAuth) | ||||
| 	var platforms []swarm.Platform | ||||
| @@ -119,7 +131,7 @@ func imageDigestAndPlatforms(ctx context.Context, cli DistributionAPIClient, ima | ||||
|  | ||||
| // imageWithDigestString takes an image string and a digest, and updates | ||||
| // the image string if it didn't originally contain a digest. It returns | ||||
| // an empty string if there are no updates. | ||||
| // image unmodified in other situations. | ||||
| func imageWithDigestString(image string, dgst digest.Digest) string { | ||||
| 	namedRef, err := reference.ParseNormalizedNamed(image) | ||||
| 	if err == nil { | ||||
| @@ -131,7 +143,7 @@ func imageWithDigestString(image string, dgst digest.Digest) string { | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return "" | ||||
| 	return image | ||||
| } | ||||
|  | ||||
| // imageWithTagString takes an image string, and returns a tagged image | ||||
|   | ||||
							
								
								
									
										41
									
								
								vendor/github.com/docker/docker/client/service_update.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								vendor/github.com/docker/docker/client/service_update.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -15,8 +15,8 @@ import ( | ||||
| // of swarm.Service, which can be found using ServiceInspectWithRaw. | ||||
| func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version swarm.Version, service swarm.ServiceSpec, options types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error) { | ||||
| 	var ( | ||||
| 		query   = url.Values{} | ||||
| 		distErr error | ||||
| 		query    = url.Values{} | ||||
| 		response = types.ServiceUpdateResponse{} | ||||
| 	) | ||||
|  | ||||
| 	headers := map[string][]string{ | ||||
| @@ -38,46 +38,28 @@ func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version | ||||
| 	query.Set("version", strconv.FormatUint(version.Index, 10)) | ||||
|  | ||||
| 	if err := validateServiceSpec(service); err != nil { | ||||
| 		return types.ServiceUpdateResponse{}, err | ||||
| 		return response, err | ||||
| 	} | ||||
|  | ||||
| 	var imgPlatforms []swarm.Platform | ||||
| 	// ensure that the image is tagged | ||||
| 	if service.TaskTemplate.ContainerSpec != nil { | ||||
| 	var resolveWarning string | ||||
| 	switch { | ||||
| 	case service.TaskTemplate.ContainerSpec != nil: | ||||
| 		if taggedImg := imageWithTagString(service.TaskTemplate.ContainerSpec.Image); taggedImg != "" { | ||||
| 			service.TaskTemplate.ContainerSpec.Image = taggedImg | ||||
| 		} | ||||
| 		if options.QueryRegistry { | ||||
| 			var img string | ||||
| 			img, imgPlatforms, distErr = imageDigestAndPlatforms(ctx, cli, service.TaskTemplate.ContainerSpec.Image, options.EncodedRegistryAuth) | ||||
| 			if img != "" { | ||||
| 				service.TaskTemplate.ContainerSpec.Image = img | ||||
| 			} | ||||
| 			resolveWarning = resolveContainerSpecImage(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// ensure that the image is tagged | ||||
| 	if service.TaskTemplate.PluginSpec != nil { | ||||
| 	case service.TaskTemplate.PluginSpec != nil: | ||||
| 		if taggedImg := imageWithTagString(service.TaskTemplate.PluginSpec.Remote); taggedImg != "" { | ||||
| 			service.TaskTemplate.PluginSpec.Remote = taggedImg | ||||
| 		} | ||||
| 		if options.QueryRegistry { | ||||
| 			var img string | ||||
| 			img, imgPlatforms, distErr = imageDigestAndPlatforms(ctx, cli, service.TaskTemplate.PluginSpec.Remote, options.EncodedRegistryAuth) | ||||
| 			if img != "" { | ||||
| 				service.TaskTemplate.PluginSpec.Remote = img | ||||
| 			} | ||||
| 			resolveWarning = resolvePluginSpecRemote(ctx, cli, &service.TaskTemplate, options.EncodedRegistryAuth) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if service.TaskTemplate.Placement == nil && len(imgPlatforms) > 0 { | ||||
| 		service.TaskTemplate.Placement = &swarm.Placement{} | ||||
| 	} | ||||
| 	if len(imgPlatforms) > 0 { | ||||
| 		service.TaskTemplate.Placement.Platforms = imgPlatforms | ||||
| 	} | ||||
|  | ||||
| 	var response types.ServiceUpdateResponse | ||||
| 	resp, err := cli.post(ctx, "/services/"+serviceID+"/update", query, service, headers) | ||||
| 	defer ensureReaderClosed(resp) | ||||
| 	if err != nil { | ||||
| @@ -85,9 +67,8 @@ func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version | ||||
| 	} | ||||
|  | ||||
| 	err = json.NewDecoder(resp.body).Decode(&response) | ||||
|  | ||||
| 	if distErr != nil { | ||||
| 		response.Warnings = append(response.Warnings, digestWarning(service.TaskTemplate.ContainerSpec.Image)) | ||||
| 	if resolveWarning != "" { | ||||
| 		response.Warnings = append(response.Warnings, resolveWarning) | ||||
| 	} | ||||
|  | ||||
| 	return response, err | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -7,8 +7,8 @@ import ( | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/docker/docker/pkg/term" | ||||
| 	units "github.com/docker/go-units" | ||||
| 	"github.com/moby/term" | ||||
| 	"github.com/morikuni/aec" | ||||
| ) | ||||
|  | ||||
|   | ||||
							
								
								
									
										159
									
								
								vendor/github.com/docker/docker/pkg/mount/mount.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										159
									
								
								vendor/github.com/docker/docker/pkg/mount/mount.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,159 +0,0 @@ | ||||
| package mount // import "github.com/docker/docker/pkg/mount" | ||||
|  | ||||
| import ( | ||||
| 	"sort" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/sirupsen/logrus" | ||||
| ) | ||||
|  | ||||
| // mountError records an error from mount or unmount operation | ||||
| type mountError struct { | ||||
| 	op             string | ||||
| 	source, target string | ||||
| 	flags          uintptr | ||||
| 	data           string | ||||
| 	err            error | ||||
| } | ||||
|  | ||||
| func (e *mountError) Error() string { | ||||
| 	out := e.op + " " | ||||
|  | ||||
| 	if e.source != "" { | ||||
| 		out += e.source + ":" + e.target | ||||
| 	} else { | ||||
| 		out += e.target | ||||
| 	} | ||||
|  | ||||
| 	if e.flags != uintptr(0) { | ||||
| 		out += ", flags: 0x" + strconv.FormatUint(uint64(e.flags), 16) | ||||
| 	} | ||||
| 	if e.data != "" { | ||||
| 		out += ", data: " + e.data | ||||
| 	} | ||||
|  | ||||
| 	out += ": " + e.err.Error() | ||||
| 	return out | ||||
| } | ||||
|  | ||||
| // Cause returns the underlying cause of the error | ||||
| func (e *mountError) Cause() error { | ||||
| 	return e.err | ||||
| } | ||||
|  | ||||
| // FilterFunc is a type defining a callback function | ||||
| // to filter out unwanted entries. It takes a pointer | ||||
| // to an Info struct (not fully populated, currently | ||||
| // only Mountpoint is 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 prefix specified | ||||
| 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 | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // 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) | ||||
| } | ||||
|  | ||||
| // 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 | ||||
| } | ||||
|  | ||||
| // Mount will mount filesystem according to the specified configuration, on the | ||||
| // 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 | ||||
| // flags.go for supported option flags. | ||||
| func Mount(device, target, mType, options string) error { | ||||
| 	flag, data := parseOptions(options) | ||||
| 	if flag&REMOUNT != REMOUNT { | ||||
| 		if mounted, err := Mounted(target); err != nil || mounted { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return mount(device, target, mType, uintptr(flag), data) | ||||
| } | ||||
|  | ||||
| // ForceMount will mount a filesystem according to the specified configuration, | ||||
| // *regardless* if the target path is not already mounted. Options must be | ||||
| // specified like the mount or fstab unix commands: "opt1=val1,opt2=val2". See | ||||
| // flags.go for supported option flags. | ||||
| func ForceMount(device, target, mType, options string) error { | ||||
| 	flag, data := parseOptions(options) | ||||
| 	return mount(device, target, mType, uintptr(flag), data) | ||||
| } | ||||
|  | ||||
| // Unmount lazily unmounts a filesystem on supported platforms, otherwise | ||||
| // does a normal unmount. | ||||
| func Unmount(target string) error { | ||||
| 	return unmount(target, mntDetach) | ||||
| } | ||||
|  | ||||
| // RecursiveUnmount unmounts the target and all mounts underneath, starting with | ||||
| // the deepsest mount first. | ||||
| func RecursiveUnmount(target string) error { | ||||
| 	mounts, err := parseMountTable(PrefixFilter(target)) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// Make the deepest mount be first | ||||
| 	sort.Slice(mounts, func(i, j int) bool { | ||||
| 		return len(mounts[i].Mountpoint) > len(mounts[j].Mountpoint) | ||||
| 	}) | ||||
|  | ||||
| 	for i, m := range mounts { | ||||
| 		logrus.Debugf("Trying to unmount %s", m.Mountpoint) | ||||
| 		err = unmount(m.Mountpoint, mntDetach) | ||||
| 		if err != nil { | ||||
| 			if i == len(mounts)-1 { // last mount | ||||
| 				if mounted, e := Mounted(m.Mountpoint); e != nil || mounted { | ||||
| 					return err | ||||
| 				} | ||||
| 			} else { | ||||
| 				// This is some submount, we can ignore this error for now, the final unmount will fail if this is a real problem | ||||
| 				logrus.WithError(err).Warnf("Failed to unmount submount %s", m.Mountpoint) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		logrus.Debugf("Unmounted %s", m.Mountpoint) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										6
									
								
								vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,6 +0,0 @@ | ||||
| package mount // import "github.com/docker/docker/pkg/mount" | ||||
|  | ||||
| func parseMountTable(f FilterFunc) ([]*Info, error) { | ||||
| 	// Do NOT return an error! | ||||
| 	return nil, nil | ||||
| } | ||||
							
								
								
									
										4
									
								
								vendor/github.com/docker/docker/pkg/namesgenerator/names-generator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/docker/docker/pkg/namesgenerator/names-generator.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -497,7 +497,7 @@ var ( | ||||
| 		// Har Gobind Khorana - Indian-American biochemist who shared the 1968 Nobel Prize for Physiology - https://en.wikipedia.org/wiki/Har_Gobind_Khorana | ||||
| 		"khorana", | ||||
|  | ||||
| 		// Jack Kilby invented silicone integrated circuits and gave Silicon Valley its name. - https://en.wikipedia.org/wiki/Jack_Kilby | ||||
| 		// Jack Kilby invented silicon integrated circuits and gave Silicon Valley its name. - https://en.wikipedia.org/wiki/Jack_Kilby | ||||
| 		"kilby", | ||||
|  | ||||
| 		// Maria Kirch - German astronomer and first woman to discover a comet - https://en.wikipedia.org/wiki/Maria_Margarethe_Kirch | ||||
| @@ -632,7 +632,7 @@ var ( | ||||
| 		// Poppy Northcutt. Poppy Northcutt was the first woman to work as part of NASA’s Mission Control. http://www.businessinsider.com/poppy-northcutt-helped-apollo-astronauts-2014-12?op=1 | ||||
| 		"northcutt", | ||||
|  | ||||
| 		// Robert Noyce invented silicone integrated circuits and gave Silicon Valley its name. - https://en.wikipedia.org/wiki/Robert_Noyce | ||||
| 		// Robert Noyce invented silicon integrated circuits and gave Silicon Valley its name. - https://en.wikipedia.org/wiki/Robert_Noyce | ||||
| 		"noyce", | ||||
|  | ||||
| 		// Panini - Ancient Indian linguist and grammarian from 4th century CE who worked on the world's first formal system - https://en.wikipedia.org/wiki/P%C4%81%E1%B9%87ini#Comparison_with_modern_formal_systems | ||||
|   | ||||
							
								
								
									
										8
									
								
								vendor/github.com/docker/docker/pkg/system/filesys_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/docker/docker/pkg/system/filesys_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -130,12 +130,10 @@ func mkdirWithACL(name string, sddl string) error { | ||||
| // by the daemon. This SHOULD be treated as absolute from a docker processing | ||||
| // perspective. | ||||
| func IsAbs(path string) bool { | ||||
| 	if !filepath.IsAbs(path) { | ||||
| 		if !strings.HasPrefix(path, string(os.PathSeparator)) { | ||||
| 			return false | ||||
| 		} | ||||
| 	if filepath.IsAbs(path) || strings.HasPrefix(path, string(os.PathSeparator)) { | ||||
| 		return true | ||||
| 	} | ||||
| 	return true | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // The origin of the functions below here are the golang OS and windows packages, | ||||
|   | ||||
							
								
								
									
										12
									
								
								vendor/github.com/docker/docker/pkg/system/init_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/docker/docker/pkg/system/init_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,12 +0,0 @@ | ||||
| // +build !windows | ||||
|  | ||||
| package system // import "github.com/docker/docker/pkg/system" | ||||
|  | ||||
| // InitLCOW does nothing since LCOW is a windows only feature | ||||
| func InitLCOW(experimental bool) { | ||||
| } | ||||
|  | ||||
| // ContainerdRuntimeSupported returns true if the use of ContainerD runtime is supported. | ||||
| func ContainerdRuntimeSupported(_ bool, _ string) bool { | ||||
| 	return true | ||||
| } | ||||
							
								
								
									
										11
									
								
								vendor/github.com/docker/docker/pkg/system/init_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/docker/docker/pkg/system/init_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -3,26 +3,15 @@ package system // import "github.com/docker/docker/pkg/system" | ||||
| import ( | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/Microsoft/hcsshim/osversion" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	// lcowSupported determines if Linux Containers on Windows are supported. | ||||
| 	lcowSupported = false | ||||
|  | ||||
| 	// containerdRuntimeSupported determines if ContainerD should be the runtime. | ||||
| 	// As of March 2019, this is an experimental feature. | ||||
| 	containerdRuntimeSupported = false | ||||
| ) | ||||
|  | ||||
| // InitLCOW sets whether LCOW is supported or not. Requires RS5+ | ||||
| func InitLCOW(experimental bool) { | ||||
| 	if experimental && osversion.Build() >= osversion.RS5 { | ||||
| 		lcowSupported = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // InitContainerdRuntime sets whether to use ContainerD for runtime | ||||
| // on Windows. This is an experimental feature still in development, and | ||||
| // also requires an environment variable to be set (so as not to turn the | ||||
|   | ||||
							
								
								
									
										44
									
								
								vendor/github.com/docker/docker/pkg/system/lcow.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										44
									
								
								vendor/github.com/docker/docker/pkg/system/lcow.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,16 +1,44 @@ | ||||
| // +build windows,!no_lcow | ||||
|  | ||||
| package system // import "github.com/docker/docker/pkg/system" | ||||
|  | ||||
| import ( | ||||
| 	"runtime" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/Microsoft/hcsshim/osversion" | ||||
| 	specs "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| 	"github.com/pkg/errors" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	// lcowSupported determines if Linux Containers on Windows are supported. | ||||
| 	lcowSupported = false | ||||
| ) | ||||
|  | ||||
| // InitLCOW sets whether LCOW is supported or not. Requires RS5+ | ||||
| func InitLCOW(experimental bool) { | ||||
| 	if experimental && osversion.Build() >= osversion.RS5 { | ||||
| 		lcowSupported = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func LCOWSupported() bool { | ||||
| 	return lcowSupported | ||||
| } | ||||
|  | ||||
| // ValidatePlatform determines if a platform structure is valid. | ||||
| // TODO This is a temporary windows-only function, should be replaced by | ||||
| // comparison of worker capabilities | ||||
| func ValidatePlatform(platform specs.Platform) error { | ||||
| 	if !IsOSSupported(platform.OS) { | ||||
| 		return errors.Errorf("unsupported os %s", platform.OS) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // IsOSSupported determines if an operating system is supported by the host | ||||
| func IsOSSupported(os string) bool { | ||||
| 	if strings.EqualFold(runtime.GOOS, os) { | ||||
| 	if strings.EqualFold("windows", os) { | ||||
| 		return true | ||||
| 	} | ||||
| 	if LCOWSupported() && strings.EqualFold(os, "linux") { | ||||
| @@ -18,15 +46,3 @@ func IsOSSupported(os string) bool { | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // ValidatePlatform determines if a platform structure is valid. | ||||
| // TODO This is a temporary windows-only function, should be replaced by | ||||
| // comparison of worker capabilities | ||||
| func ValidatePlatform(platform specs.Platform) error { | ||||
| 	if runtime.GOOS == "windows" { | ||||
| 		if !(platform.OS == runtime.GOOS || (LCOWSupported() && platform.OS == "linux")) { | ||||
| 			return errors.Errorf("unsupported os %s", platform.OS) | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
							
								
								
									
										8
									
								
								vendor/github.com/docker/docker/pkg/system/lcow_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/docker/docker/pkg/system/lcow_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,8 +0,0 @@ | ||||
| // +build !windows | ||||
|  | ||||
| package system // import "github.com/docker/docker/pkg/system" | ||||
|  | ||||
| // LCOWSupported returns true if Linux containers on Windows are supported. | ||||
| func LCOWSupported() bool { | ||||
| 	return false | ||||
| } | ||||
							
								
								
									
										28
									
								
								vendor/github.com/docker/docker/pkg/system/lcow_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/docker/docker/pkg/system/lcow_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| // +build !windows windows,no_lcow | ||||
|  | ||||
| package system // import "github.com/docker/docker/pkg/system" | ||||
| import ( | ||||
| 	"runtime" | ||||
| 	"strings" | ||||
|  | ||||
| 	specs "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| ) | ||||
|  | ||||
| // InitLCOW does nothing since LCOW is a windows only feature | ||||
| func InitLCOW(_ bool) {} | ||||
|  | ||||
| // LCOWSupported returns true if Linux containers on Windows are supported. | ||||
| func LCOWSupported() bool { | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // ValidatePlatform determines if a platform structure is valid. This function | ||||
| // is used for LCOW, and is a no-op on non-windows platforms. | ||||
| func ValidatePlatform(_ specs.Platform) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // IsOSSupported determines if an operating system is supported by the host. | ||||
| func IsOSSupported(os string) bool { | ||||
| 	return strings.EqualFold(runtime.GOOS, os) | ||||
| } | ||||
							
								
								
									
										6
									
								
								vendor/github.com/docker/docker/pkg/system/lcow_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/docker/docker/pkg/system/lcow_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,6 +0,0 @@ | ||||
| package system // import "github.com/docker/docker/pkg/system" | ||||
|  | ||||
| // LCOWSupported returns true if Linux containers on Windows are supported. | ||||
| func LCOWSupported() bool { | ||||
| 	return lcowSupported | ||||
| } | ||||
							
								
								
									
										20
									
								
								vendor/github.com/docker/docker/pkg/system/process_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/docker/docker/pkg/system/process_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -3,6 +3,9 @@ | ||||
| package system // import "github.com/docker/docker/pkg/system" | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"strings" | ||||
| 	"syscall" | ||||
|  | ||||
| 	"golang.org/x/sys/unix" | ||||
| @@ -22,3 +25,20 @@ func IsProcessAlive(pid int) bool { | ||||
| func KillProcess(pid int) { | ||||
| 	unix.Kill(pid, unix.SIGKILL) | ||||
| } | ||||
|  | ||||
| // IsProcessZombie return true if process has a state with "Z" | ||||
| // http://man7.org/linux/man-pages/man5/proc.5.html | ||||
| func IsProcessZombie(pid int) (bool, error) { | ||||
| 	statPath := fmt.Sprintf("/proc/%d/stat", pid) | ||||
| 	dataBytes, err := ioutil.ReadFile(statPath) | ||||
| 	if err != nil { | ||||
| 		return false, err | ||||
| 	} | ||||
| 	data := string(dataBytes) | ||||
| 	sdata := strings.SplitN(data, " ", 4) | ||||
| 	if len(sdata) >= 3 && sdata[2] == "Z" { | ||||
| 		return true, nil | ||||
| 	} | ||||
|  | ||||
| 	return false, nil | ||||
| } | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/github.com/docker/docker/pkg/system/process_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/docker/docker/pkg/system/process_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -13,6 +13,6 @@ func IsProcessAlive(pid int) bool { | ||||
| func KillProcess(pid int) { | ||||
| 	p, err := os.FindProcess(pid) | ||||
| 	if err == nil { | ||||
| 		p.Kill() | ||||
| 		_ = p.Kill() | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										10
									
								
								vendor/github.com/docker/docker/pkg/system/rm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/docker/docker/pkg/system/rm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -5,7 +5,7 @@ import ( | ||||
| 	"syscall" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/docker/docker/pkg/mount" | ||||
| 	"github.com/moby/sys/mount" | ||||
| 	"github.com/pkg/errors" | ||||
| ) | ||||
|  | ||||
| @@ -63,12 +63,8 @@ func EnsureRemoveAll(dir string) error { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		if mounted, _ := mount.Mounted(pe.Path); mounted { | ||||
| 			if e := mount.Unmount(pe.Path); e != nil { | ||||
| 				if mounted, _ := mount.Mounted(pe.Path); mounted { | ||||
| 					return errors.Wrapf(e, "error while removing %s", dir) | ||||
| 				} | ||||
| 			} | ||||
| 		if e := mount.Unmount(pe.Path); e != nil { | ||||
| 			return errors.Wrapf(e, "error while removing %s", dir) | ||||
| 		} | ||||
|  | ||||
| 		if exitOnErr[pe.Path] == maxRetry { | ||||
|   | ||||
							
								
								
									
										6
									
								
								vendor/github.com/docker/docker/pkg/system/syscall_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/docker/docker/pkg/system/syscall_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -9,9 +9,3 @@ import "golang.org/x/sys/unix" | ||||
| func Unmount(dest string) error { | ||||
| 	return unix.Unmount(dest, 0) | ||||
| } | ||||
|  | ||||
| // CommandLineToArgv should not be used on Unix. | ||||
| // It simply returns commandLine in the only element in the returned array. | ||||
| func CommandLineToArgv(commandLine string) ([]string, error) { | ||||
| 	return []string{commandLine}, nil | ||||
| } | ||||
|   | ||||
							
								
								
									
										25
									
								
								vendor/github.com/docker/docker/pkg/system/syscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/docker/docker/pkg/system/syscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -104,29 +104,6 @@ func Unmount(_ string) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // CommandLineToArgv wraps the Windows syscall to turn a commandline into an argument array. | ||||
| func CommandLineToArgv(commandLine string) ([]string, error) { | ||||
| 	var argc int32 | ||||
|  | ||||
| 	argsPtr, err := windows.UTF16PtrFromString(commandLine) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	argv, err := windows.CommandLineToArgv(argsPtr, &argc) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	defer windows.LocalFree(windows.Handle(uintptr(unsafe.Pointer(argv)))) | ||||
|  | ||||
| 	newArgs := make([]string, argc) | ||||
| 	for i, v := range (*argv)[:argc] { | ||||
| 		newArgs[i] = windows.UTF16ToString((*v)[:]) | ||||
| 	} | ||||
|  | ||||
| 	return newArgs, nil | ||||
| } | ||||
|  | ||||
| // HasWin32KSupport determines whether containers that depend on win32k can | ||||
| // run on this machine. Win32k is the driver used to implement windowing. | ||||
| func HasWin32KSupport() bool { | ||||
| @@ -136,6 +113,7 @@ func HasWin32KSupport() bool { | ||||
| 	return ntuserApiset.Load() == nil | ||||
| } | ||||
|  | ||||
| // Deprecated: use golang.org/x/sys/windows.SetNamedSecurityInfo() | ||||
| func SetNamedSecurityInfo(objectName *uint16, objectType uint32, securityInformation uint32, sidOwner *windows.SID, sidGroup *windows.SID, dacl *byte, sacl *byte) (result error) { | ||||
| 	r0, _, _ := syscall.Syscall9(procSetNamedSecurityInfo.Addr(), 7, uintptr(unsafe.Pointer(objectName)), uintptr(objectType), uintptr(securityInformation), uintptr(unsafe.Pointer(sidOwner)), uintptr(unsafe.Pointer(sidGroup)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(sacl)), 0, 0) | ||||
| 	if r0 != 0 { | ||||
| @@ -144,6 +122,7 @@ func SetNamedSecurityInfo(objectName *uint16, objectType uint32, securityInforma | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // Deprecated: uses golang.org/x/sys/windows.SecurityDescriptorFromString() and golang.org/x/sys/windows.SECURITY_DESCRIPTOR.DACL() | ||||
| func GetSecurityDescriptorDacl(securityDescriptor *byte, daclPresent *uint32, dacl **byte, daclDefaulted *uint32) (result error) { | ||||
| 	r1, _, e1 := syscall.Syscall6(procGetSecurityDescriptorDacl.Addr(), 4, uintptr(unsafe.Pointer(securityDescriptor)), uintptr(unsafe.Pointer(daclPresent)), uintptr(unsafe.Pointer(dacl)), uintptr(unsafe.Pointer(daclDefaulted)), 0, 0) | ||||
| 	if r1 == 0 { | ||||
|   | ||||
							
								
								
									
										66
									
								
								vendor/github.com/docker/docker/pkg/term/ascii.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										66
									
								
								vendor/github.com/docker/docker/pkg/term/ascii.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,66 +0,0 @@ | ||||
| package term // import "github.com/docker/docker/pkg/term" | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // ASCII list the possible supported ASCII key sequence | ||||
| var ASCII = []string{ | ||||
| 	"ctrl-@", | ||||
| 	"ctrl-a", | ||||
| 	"ctrl-b", | ||||
| 	"ctrl-c", | ||||
| 	"ctrl-d", | ||||
| 	"ctrl-e", | ||||
| 	"ctrl-f", | ||||
| 	"ctrl-g", | ||||
| 	"ctrl-h", | ||||
| 	"ctrl-i", | ||||
| 	"ctrl-j", | ||||
| 	"ctrl-k", | ||||
| 	"ctrl-l", | ||||
| 	"ctrl-m", | ||||
| 	"ctrl-n", | ||||
| 	"ctrl-o", | ||||
| 	"ctrl-p", | ||||
| 	"ctrl-q", | ||||
| 	"ctrl-r", | ||||
| 	"ctrl-s", | ||||
| 	"ctrl-t", | ||||
| 	"ctrl-u", | ||||
| 	"ctrl-v", | ||||
| 	"ctrl-w", | ||||
| 	"ctrl-x", | ||||
| 	"ctrl-y", | ||||
| 	"ctrl-z", | ||||
| 	"ctrl-[", | ||||
| 	"ctrl-\\", | ||||
| 	"ctrl-]", | ||||
| 	"ctrl-^", | ||||
| 	"ctrl-_", | ||||
| } | ||||
|  | ||||
| // ToBytes converts a string representing a suite of key-sequence to the corresponding ASCII code. | ||||
| func ToBytes(keys string) ([]byte, error) { | ||||
| 	codes := []byte{} | ||||
| next: | ||||
| 	for _, key := range strings.Split(keys, ",") { | ||||
| 		if len(key) != 1 { | ||||
| 			for code, ctrl := range ASCII { | ||||
| 				if ctrl == key { | ||||
| 					codes = append(codes, byte(code)) | ||||
| 					continue next | ||||
| 				} | ||||
| 			} | ||||
| 			if key == "DEL" { | ||||
| 				codes = append(codes, 127) | ||||
| 			} else { | ||||
| 				return nil, fmt.Errorf("Unknown character: '%s'", key) | ||||
| 			} | ||||
| 		} else { | ||||
| 			codes = append(codes, key[0]) | ||||
| 		} | ||||
| 	} | ||||
| 	return codes, nil | ||||
| } | ||||
							
								
								
									
										78
									
								
								vendor/github.com/docker/docker/pkg/term/proxy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										78
									
								
								vendor/github.com/docker/docker/pkg/term/proxy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,78 +0,0 @@ | ||||
| package term // import "github.com/docker/docker/pkg/term" | ||||
|  | ||||
| import ( | ||||
| 	"io" | ||||
| ) | ||||
|  | ||||
| // EscapeError is special error which returned by a TTY proxy reader's Read() | ||||
| // method in case its detach escape sequence is read. | ||||
| type EscapeError struct{} | ||||
|  | ||||
| func (EscapeError) Error() string { | ||||
| 	return "read escape sequence" | ||||
| } | ||||
|  | ||||
| // escapeProxy is used only for attaches with a TTY. It is used to proxy | ||||
| // stdin keypresses from the underlying reader and look for the passed in | ||||
| // escape key sequence to signal a detach. | ||||
| type escapeProxy struct { | ||||
| 	escapeKeys   []byte | ||||
| 	escapeKeyPos int | ||||
| 	r            io.Reader | ||||
| } | ||||
|  | ||||
| // NewEscapeProxy returns a new TTY proxy reader which wraps the given reader | ||||
| // and detects when the specified escape keys are read, in which case the Read | ||||
| // method will return an error of type EscapeError. | ||||
| func NewEscapeProxy(r io.Reader, escapeKeys []byte) io.Reader { | ||||
| 	return &escapeProxy{ | ||||
| 		escapeKeys: escapeKeys, | ||||
| 		r:          r, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (r *escapeProxy) Read(buf []byte) (int, error) { | ||||
| 	nr, err := r.r.Read(buf) | ||||
|  | ||||
| 	if len(r.escapeKeys) == 0 { | ||||
| 		return nr, err | ||||
| 	} | ||||
|  | ||||
| 	preserve := func() { | ||||
| 		// this preserves the original key presses in the passed in buffer | ||||
| 		nr += r.escapeKeyPos | ||||
| 		preserve := make([]byte, 0, r.escapeKeyPos+len(buf)) | ||||
| 		preserve = append(preserve, r.escapeKeys[:r.escapeKeyPos]...) | ||||
| 		preserve = append(preserve, buf...) | ||||
| 		r.escapeKeyPos = 0 | ||||
| 		copy(buf[0:nr], preserve) | ||||
| 	} | ||||
|  | ||||
| 	if nr != 1 || err != nil { | ||||
| 		if r.escapeKeyPos > 0 { | ||||
| 			preserve() | ||||
| 		} | ||||
| 		return nr, err | ||||
| 	} | ||||
|  | ||||
| 	if buf[0] != r.escapeKeys[r.escapeKeyPos] { | ||||
| 		if r.escapeKeyPos > 0 { | ||||
| 			preserve() | ||||
| 		} | ||||
| 		return nr, nil | ||||
| 	} | ||||
|  | ||||
| 	if r.escapeKeyPos == len(r.escapeKeys)-1 { | ||||
| 		return 0, EscapeError{} | ||||
| 	} | ||||
|  | ||||
| 	// Looks like we've got an escape key, but we need to match again on the next | ||||
| 	// read. | ||||
| 	// Store the current escape key we found so we can look for the next one on | ||||
| 	// the next read. | ||||
| 	// Since this is an escape key, make sure we don't let the caller read it | ||||
| 	// If later on we find that this is not the escape sequence, we'll add the | ||||
| 	// keys back | ||||
| 	r.escapeKeyPos++ | ||||
| 	return nr - r.escapeKeyPos, nil | ||||
| } | ||||
							
								
								
									
										20
									
								
								vendor/github.com/docker/docker/pkg/term/tc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/docker/docker/pkg/term/tc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,20 +0,0 @@ | ||||
| // +build !windows | ||||
|  | ||||
| package term // import "github.com/docker/docker/pkg/term" | ||||
|  | ||||
| import ( | ||||
| 	"syscall" | ||||
| 	"unsafe" | ||||
|  | ||||
| 	"golang.org/x/sys/unix" | ||||
| ) | ||||
|  | ||||
| func tcget(fd uintptr, p *Termios) syscall.Errno { | ||||
| 	_, _, err := unix.Syscall(unix.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(p))) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| func tcset(fd uintptr, p *Termios) syscall.Errno { | ||||
| 	_, _, err := unix.Syscall(unix.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(p))) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										124
									
								
								vendor/github.com/docker/docker/pkg/term/term.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										124
									
								
								vendor/github.com/docker/docker/pkg/term/term.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,124 +0,0 @@ | ||||
| // +build !windows | ||||
|  | ||||
| // Package term provides structures and helper functions to work with | ||||
| // terminal (state, sizes). | ||||
| package term // import "github.com/docker/docker/pkg/term" | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"os/signal" | ||||
|  | ||||
| 	"golang.org/x/sys/unix" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	// ErrInvalidState is returned if the state of the terminal is invalid. | ||||
| 	ErrInvalidState = errors.New("Invalid terminal state") | ||||
| ) | ||||
|  | ||||
| // State represents the state of the terminal. | ||||
| type State struct { | ||||
| 	termios Termios | ||||
| } | ||||
|  | ||||
| // Winsize represents the size of the terminal window. | ||||
| type Winsize struct { | ||||
| 	Height uint16 | ||||
| 	Width  uint16 | ||||
| 	x      uint16 | ||||
| 	y      uint16 | ||||
| } | ||||
|  | ||||
| // StdStreams returns the standard streams (stdin, stdout, stderr). | ||||
| func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { | ||||
| 	return os.Stdin, os.Stdout, os.Stderr | ||||
| } | ||||
|  | ||||
| // GetFdInfo returns the file descriptor for an os.File and indicates whether the file represents a terminal. | ||||
| func GetFdInfo(in interface{}) (uintptr, bool) { | ||||
| 	var inFd uintptr | ||||
| 	var isTerminalIn bool | ||||
| 	if file, ok := in.(*os.File); ok { | ||||
| 		inFd = file.Fd() | ||||
| 		isTerminalIn = IsTerminal(inFd) | ||||
| 	} | ||||
| 	return inFd, isTerminalIn | ||||
| } | ||||
|  | ||||
| // IsTerminal returns true if the given file descriptor is a terminal. | ||||
| func IsTerminal(fd uintptr) bool { | ||||
| 	var termios Termios | ||||
| 	return tcget(fd, &termios) == 0 | ||||
| } | ||||
|  | ||||
| // RestoreTerminal restores the terminal connected to the given file descriptor | ||||
| // to a previous state. | ||||
| func RestoreTerminal(fd uintptr, state *State) error { | ||||
| 	if state == nil { | ||||
| 		return ErrInvalidState | ||||
| 	} | ||||
| 	if err := tcset(fd, &state.termios); err != 0 { | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // SaveState saves the state of the terminal connected to the given file descriptor. | ||||
| func SaveState(fd uintptr) (*State, error) { | ||||
| 	var oldState State | ||||
| 	if err := tcget(fd, &oldState.termios); err != 0 { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return &oldState, nil | ||||
| } | ||||
|  | ||||
| // DisableEcho applies the specified state to the terminal connected to the file | ||||
| // descriptor, with echo disabled. | ||||
| func DisableEcho(fd uintptr, state *State) error { | ||||
| 	newState := state.termios | ||||
| 	newState.Lflag &^= unix.ECHO | ||||
|  | ||||
| 	if err := tcset(fd, &newState); err != 0 { | ||||
| 		return err | ||||
| 	} | ||||
| 	handleInterrupt(fd, state) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // SetRawTerminal puts the terminal connected to the given file descriptor into | ||||
| // raw mode and returns the previous state. On UNIX, this puts both the input | ||||
| // and output into raw mode. On Windows, it only puts the input into raw mode. | ||||
| func SetRawTerminal(fd uintptr) (*State, error) { | ||||
| 	oldState, err := MakeRaw(fd) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	handleInterrupt(fd, oldState) | ||||
| 	return oldState, err | ||||
| } | ||||
|  | ||||
| // SetRawTerminalOutput puts the output of terminal connected to the given file | ||||
| // descriptor into raw mode. On UNIX, this does nothing and returns nil for the | ||||
| // state. On Windows, it disables LF -> CRLF translation. | ||||
| func SetRawTerminalOutput(fd uintptr) (*State, error) { | ||||
| 	return nil, nil | ||||
| } | ||||
|  | ||||
| func handleInterrupt(fd uintptr, state *State) { | ||||
| 	sigchan := make(chan os.Signal, 1) | ||||
| 	signal.Notify(sigchan, os.Interrupt) | ||||
| 	go func() { | ||||
| 		for range sigchan { | ||||
| 			// quit cleanly and the new terminal item is on a new line | ||||
| 			fmt.Println() | ||||
| 			signal.Stop(sigchan) | ||||
| 			close(sigchan) | ||||
| 			RestoreTerminal(fd, state) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 	}() | ||||
| } | ||||
							
								
								
									
										221
									
								
								vendor/github.com/docker/docker/pkg/term/term_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										221
									
								
								vendor/github.com/docker/docker/pkg/term/term_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,221 +0,0 @@ | ||||
| package term // import "github.com/docker/docker/pkg/term" | ||||
|  | ||||
| import ( | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"os/signal" | ||||
| 	"syscall" // used for STD_INPUT_HANDLE, STD_OUTPUT_HANDLE and STD_ERROR_HANDLE | ||||
|  | ||||
| 	"github.com/Azure/go-ansiterm/winterm" | ||||
| 	windowsconsole "github.com/docker/docker/pkg/term/windows" | ||||
| ) | ||||
|  | ||||
| // State holds the console mode for the terminal. | ||||
| type State struct { | ||||
| 	mode uint32 | ||||
| } | ||||
|  | ||||
| // Winsize is used for window size. | ||||
| type Winsize struct { | ||||
| 	Height uint16 | ||||
| 	Width  uint16 | ||||
| } | ||||
|  | ||||
| // vtInputSupported is true if winterm.ENABLE_VIRTUAL_TERMINAL_INPUT is supported by the console | ||||
| var vtInputSupported bool | ||||
|  | ||||
| // StdStreams returns the standard streams (stdin, stdout, stderr). | ||||
| func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { | ||||
| 	// Turn on VT handling on all std handles, if possible. This might | ||||
| 	// fail, in which case we will fall back to terminal emulation. | ||||
| 	var emulateStdin, emulateStdout, emulateStderr bool | ||||
| 	fd := os.Stdin.Fd() | ||||
| 	if mode, err := winterm.GetConsoleMode(fd); err == nil { | ||||
| 		// Validate that winterm.ENABLE_VIRTUAL_TERMINAL_INPUT is supported, but do not set it. | ||||
| 		if err = winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_INPUT); err != nil { | ||||
| 			emulateStdin = true | ||||
| 		} else { | ||||
| 			vtInputSupported = true | ||||
| 		} | ||||
| 		// Unconditionally set the console mode back even on failure because SetConsoleMode | ||||
| 		// remembers invalid bits on input handles. | ||||
| 		winterm.SetConsoleMode(fd, mode) | ||||
| 	} | ||||
|  | ||||
| 	fd = os.Stdout.Fd() | ||||
| 	if mode, err := winterm.GetConsoleMode(fd); err == nil { | ||||
| 		// Validate winterm.DISABLE_NEWLINE_AUTO_RETURN is supported, but do not set it. | ||||
| 		if err = winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING|winterm.DISABLE_NEWLINE_AUTO_RETURN); err != nil { | ||||
| 			emulateStdout = true | ||||
| 		} else { | ||||
| 			winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	fd = os.Stderr.Fd() | ||||
| 	if mode, err := winterm.GetConsoleMode(fd); err == nil { | ||||
| 		// Validate winterm.DISABLE_NEWLINE_AUTO_RETURN is supported, but do not set it. | ||||
| 		if err = winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING|winterm.DISABLE_NEWLINE_AUTO_RETURN); err != nil { | ||||
| 			emulateStderr = true | ||||
| 		} else { | ||||
| 			winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Temporarily use STD_INPUT_HANDLE, STD_OUTPUT_HANDLE and | ||||
| 	// STD_ERROR_HANDLE from syscall rather than x/sys/windows as long as | ||||
| 	// go-ansiterm hasn't switch to x/sys/windows. | ||||
| 	// TODO: switch back to x/sys/windows once go-ansiterm has switched | ||||
| 	if emulateStdin { | ||||
| 		stdIn = windowsconsole.NewAnsiReader(syscall.STD_INPUT_HANDLE) | ||||
| 	} else { | ||||
| 		stdIn = os.Stdin | ||||
| 	} | ||||
|  | ||||
| 	if emulateStdout { | ||||
| 		stdOut = windowsconsole.NewAnsiWriter(syscall.STD_OUTPUT_HANDLE) | ||||
| 	} else { | ||||
| 		stdOut = os.Stdout | ||||
| 	} | ||||
|  | ||||
| 	if emulateStderr { | ||||
| 		stdErr = windowsconsole.NewAnsiWriter(syscall.STD_ERROR_HANDLE) | ||||
| 	} else { | ||||
| 		stdErr = os.Stderr | ||||
| 	} | ||||
|  | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // GetFdInfo returns the file descriptor for an os.File and indicates whether the file represents a terminal. | ||||
| func GetFdInfo(in interface{}) (uintptr, bool) { | ||||
| 	return windowsconsole.GetHandleInfo(in) | ||||
| } | ||||
|  | ||||
| // GetWinsize returns the window size based on the specified file descriptor. | ||||
| func GetWinsize(fd uintptr) (*Winsize, error) { | ||||
| 	info, err := winterm.GetConsoleScreenBufferInfo(fd) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	winsize := &Winsize{ | ||||
| 		Width:  uint16(info.Window.Right - info.Window.Left + 1), | ||||
| 		Height: uint16(info.Window.Bottom - info.Window.Top + 1), | ||||
| 	} | ||||
|  | ||||
| 	return winsize, nil | ||||
| } | ||||
|  | ||||
| // IsTerminal returns true if the given file descriptor is a terminal. | ||||
| func IsTerminal(fd uintptr) bool { | ||||
| 	return windowsconsole.IsConsole(fd) | ||||
| } | ||||
|  | ||||
| // RestoreTerminal restores the terminal connected to the given file descriptor | ||||
| // to a previous state. | ||||
| func RestoreTerminal(fd uintptr, state *State) error { | ||||
| 	return winterm.SetConsoleMode(fd, state.mode) | ||||
| } | ||||
|  | ||||
| // SaveState saves the state of the terminal connected to the given file descriptor. | ||||
| func SaveState(fd uintptr) (*State, error) { | ||||
| 	mode, e := winterm.GetConsoleMode(fd) | ||||
| 	if e != nil { | ||||
| 		return nil, e | ||||
| 	} | ||||
|  | ||||
| 	return &State{mode: mode}, nil | ||||
| } | ||||
|  | ||||
| // DisableEcho disables echo for the terminal connected to the given file descriptor. | ||||
| // -- See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx | ||||
| func DisableEcho(fd uintptr, state *State) error { | ||||
| 	mode := state.mode | ||||
| 	mode &^= winterm.ENABLE_ECHO_INPUT | ||||
| 	mode |= winterm.ENABLE_PROCESSED_INPUT | winterm.ENABLE_LINE_INPUT | ||||
| 	err := winterm.SetConsoleMode(fd, mode) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// Register an interrupt handler to catch and restore prior state | ||||
| 	restoreAtInterrupt(fd, state) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // SetRawTerminal puts the terminal connected to the given file descriptor into | ||||
| // raw mode and returns the previous state. On UNIX, this puts both the input | ||||
| // and output into raw mode. On Windows, it only puts the input into raw mode. | ||||
| func SetRawTerminal(fd uintptr) (*State, error) { | ||||
| 	state, err := MakeRaw(fd) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	// Register an interrupt handler to catch and restore prior state | ||||
| 	restoreAtInterrupt(fd, state) | ||||
| 	return state, err | ||||
| } | ||||
|  | ||||
| // SetRawTerminalOutput puts the output of terminal connected to the given file | ||||
| // descriptor into raw mode. On UNIX, this does nothing and returns nil for the | ||||
| // state. On Windows, it disables LF -> CRLF translation. | ||||
| func SetRawTerminalOutput(fd uintptr) (*State, error) { | ||||
| 	state, err := SaveState(fd) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	// Ignore failures, since winterm.DISABLE_NEWLINE_AUTO_RETURN might not be supported on this | ||||
| 	// version of Windows. | ||||
| 	winterm.SetConsoleMode(fd, state.mode|winterm.DISABLE_NEWLINE_AUTO_RETURN) | ||||
| 	return state, err | ||||
| } | ||||
|  | ||||
| // MakeRaw puts the terminal (Windows Console) connected to the given file descriptor into raw | ||||
| // mode and returns the previous state of the terminal so that it can be restored. | ||||
| func MakeRaw(fd uintptr) (*State, error) { | ||||
| 	state, err := SaveState(fd) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	mode := state.mode | ||||
|  | ||||
| 	// See | ||||
| 	// -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx | ||||
| 	// -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx | ||||
|  | ||||
| 	// Disable these modes | ||||
| 	mode &^= winterm.ENABLE_ECHO_INPUT | ||||
| 	mode &^= winterm.ENABLE_LINE_INPUT | ||||
| 	mode &^= winterm.ENABLE_MOUSE_INPUT | ||||
| 	mode &^= winterm.ENABLE_WINDOW_INPUT | ||||
| 	mode &^= winterm.ENABLE_PROCESSED_INPUT | ||||
|  | ||||
| 	// Enable these modes | ||||
| 	mode |= winterm.ENABLE_EXTENDED_FLAGS | ||||
| 	mode |= winterm.ENABLE_INSERT_MODE | ||||
| 	mode |= winterm.ENABLE_QUICK_EDIT_MODE | ||||
| 	if vtInputSupported { | ||||
| 		mode |= winterm.ENABLE_VIRTUAL_TERMINAL_INPUT | ||||
| 	} | ||||
|  | ||||
| 	err = winterm.SetConsoleMode(fd, mode) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return state, nil | ||||
| } | ||||
|  | ||||
| func restoreAtInterrupt(fd uintptr, state *State) { | ||||
| 	sigchan := make(chan os.Signal, 1) | ||||
| 	signal.Notify(sigchan, os.Interrupt) | ||||
|  | ||||
| 	go func() { | ||||
| 		_ = <-sigchan | ||||
| 		RestoreTerminal(fd, state) | ||||
| 		os.Exit(0) | ||||
| 	}() | ||||
| } | ||||
							
								
								
									
										42
									
								
								vendor/github.com/docker/docker/pkg/term/termios_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								vendor/github.com/docker/docker/pkg/term/termios_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,42 +0,0 @@ | ||||
| // +build darwin freebsd openbsd netbsd | ||||
|  | ||||
| package term // import "github.com/docker/docker/pkg/term" | ||||
|  | ||||
| import ( | ||||
| 	"unsafe" | ||||
|  | ||||
| 	"golang.org/x/sys/unix" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	getTermios = unix.TIOCGETA | ||||
| 	setTermios = unix.TIOCSETA | ||||
| ) | ||||
|  | ||||
| // Termios is the Unix API for terminal I/O. | ||||
| type Termios unix.Termios | ||||
|  | ||||
| // MakeRaw put the terminal connected to the given file descriptor into raw | ||||
| // mode and returns the previous state of the terminal so that it can be | ||||
| // restored. | ||||
| func MakeRaw(fd uintptr) (*State, error) { | ||||
| 	var oldState State | ||||
| 	if _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, getTermios, uintptr(unsafe.Pointer(&oldState.termios))); err != 0 { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	newState := oldState.termios | ||||
| 	newState.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON) | ||||
| 	newState.Oflag &^= unix.OPOST | ||||
| 	newState.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN) | ||||
| 	newState.Cflag &^= (unix.CSIZE | unix.PARENB) | ||||
| 	newState.Cflag |= unix.CS8 | ||||
| 	newState.Cc[unix.VMIN] = 1 | ||||
| 	newState.Cc[unix.VTIME] = 0 | ||||
|  | ||||
| 	if _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, setTermios, uintptr(unsafe.Pointer(&newState))); err != 0 { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return &oldState, nil | ||||
| } | ||||
							
								
								
									
										39
									
								
								vendor/github.com/docker/docker/pkg/term/termios_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								vendor/github.com/docker/docker/pkg/term/termios_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,39 +0,0 @@ | ||||
| package term // import "github.com/docker/docker/pkg/term" | ||||
|  | ||||
| import ( | ||||
| 	"golang.org/x/sys/unix" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	getTermios = unix.TCGETS | ||||
| 	setTermios = unix.TCSETS | ||||
| ) | ||||
|  | ||||
| // Termios is the Unix API for terminal I/O. | ||||
| type Termios unix.Termios | ||||
|  | ||||
| // MakeRaw put the terminal connected to the given file descriptor into raw | ||||
| // mode and returns the previous state of the terminal so that it can be | ||||
| // restored. | ||||
| func MakeRaw(fd uintptr) (*State, error) { | ||||
| 	termios, err := unix.IoctlGetTermios(int(fd), getTermios) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	var oldState State | ||||
| 	oldState.termios = Termios(*termios) | ||||
|  | ||||
| 	termios.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON) | ||||
| 	termios.Oflag &^= unix.OPOST | ||||
| 	termios.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN) | ||||
| 	termios.Cflag &^= (unix.CSIZE | unix.PARENB) | ||||
| 	termios.Cflag |= unix.CS8 | ||||
| 	termios.Cc[unix.VMIN] = 1 | ||||
| 	termios.Cc[unix.VTIME] = 0 | ||||
|  | ||||
| 	if err := unix.IoctlSetTermios(int(fd), setTermios, termios); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return &oldState, nil | ||||
| } | ||||
							
								
								
									
										263
									
								
								vendor/github.com/docker/docker/pkg/term/windows/ansi_reader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										263
									
								
								vendor/github.com/docker/docker/pkg/term/windows/ansi_reader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,263 +0,0 @@ | ||||
| // +build windows | ||||
|  | ||||
| package windowsconsole // import "github.com/docker/docker/pkg/term/windows" | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"strings" | ||||
| 	"unsafe" | ||||
|  | ||||
| 	ansiterm "github.com/Azure/go-ansiterm" | ||||
| 	"github.com/Azure/go-ansiterm/winterm" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	escapeSequence = ansiterm.KEY_ESC_CSI | ||||
| ) | ||||
|  | ||||
| // ansiReader wraps a standard input file (e.g., os.Stdin) providing ANSI sequence translation. | ||||
| type ansiReader struct { | ||||
| 	file     *os.File | ||||
| 	fd       uintptr | ||||
| 	buffer   []byte | ||||
| 	cbBuffer int | ||||
| 	command  []byte | ||||
| } | ||||
|  | ||||
| // NewAnsiReader returns an io.ReadCloser that provides VT100 terminal emulation on top of a | ||||
| // Windows console input handle. | ||||
| func NewAnsiReader(nFile int) io.ReadCloser { | ||||
| 	initLogger() | ||||
| 	file, fd := winterm.GetStdFile(nFile) | ||||
| 	return &ansiReader{ | ||||
| 		file:    file, | ||||
| 		fd:      fd, | ||||
| 		command: make([]byte, 0, ansiterm.ANSI_MAX_CMD_LENGTH), | ||||
| 		buffer:  make([]byte, 0), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Close closes the wrapped file. | ||||
| func (ar *ansiReader) Close() (err error) { | ||||
| 	return ar.file.Close() | ||||
| } | ||||
|  | ||||
| // Fd returns the file descriptor of the wrapped file. | ||||
| func (ar *ansiReader) Fd() uintptr { | ||||
| 	return ar.fd | ||||
| } | ||||
|  | ||||
| // Read reads up to len(p) bytes of translated input events into p. | ||||
| func (ar *ansiReader) Read(p []byte) (int, error) { | ||||
| 	if len(p) == 0 { | ||||
| 		return 0, nil | ||||
| 	} | ||||
|  | ||||
| 	// Previously read bytes exist, read as much as we can and return | ||||
| 	if len(ar.buffer) > 0 { | ||||
| 		logger.Debugf("Reading previously cached bytes") | ||||
|  | ||||
| 		originalLength := len(ar.buffer) | ||||
| 		copiedLength := copy(p, ar.buffer) | ||||
|  | ||||
| 		if copiedLength == originalLength { | ||||
| 			ar.buffer = make([]byte, 0, len(p)) | ||||
| 		} else { | ||||
| 			ar.buffer = ar.buffer[copiedLength:] | ||||
| 		} | ||||
|  | ||||
| 		logger.Debugf("Read from cache p[%d]: % x", copiedLength, p) | ||||
| 		return copiedLength, nil | ||||
| 	} | ||||
|  | ||||
| 	// Read and translate key events | ||||
| 	events, err := readInputEvents(ar.fd, len(p)) | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
| 	} else if len(events) == 0 { | ||||
| 		logger.Debug("No input events detected") | ||||
| 		return 0, nil | ||||
| 	} | ||||
|  | ||||
| 	keyBytes := translateKeyEvents(events, []byte(escapeSequence)) | ||||
|  | ||||
| 	// Save excess bytes and right-size keyBytes | ||||
| 	if len(keyBytes) > len(p) { | ||||
| 		logger.Debugf("Received %d keyBytes, only room for %d bytes", len(keyBytes), len(p)) | ||||
| 		ar.buffer = keyBytes[len(p):] | ||||
| 		keyBytes = keyBytes[:len(p)] | ||||
| 	} else if len(keyBytes) == 0 { | ||||
| 		logger.Debug("No key bytes returned from the translator") | ||||
| 		return 0, nil | ||||
| 	} | ||||
|  | ||||
| 	copiedLength := copy(p, keyBytes) | ||||
| 	if copiedLength != len(keyBytes) { | ||||
| 		return 0, errors.New("unexpected copy length encountered") | ||||
| 	} | ||||
|  | ||||
| 	logger.Debugf("Read        p[%d]: % x", copiedLength, p) | ||||
| 	logger.Debugf("Read keyBytes[%d]: % x", copiedLength, keyBytes) | ||||
| 	return copiedLength, nil | ||||
| } | ||||
|  | ||||
| // readInputEvents polls until at least one event is available. | ||||
| func readInputEvents(fd uintptr, maxBytes int) ([]winterm.INPUT_RECORD, error) { | ||||
| 	// Determine the maximum number of records to retrieve | ||||
| 	// -- Cast around the type system to obtain the size of a single INPUT_RECORD. | ||||
| 	//    unsafe.Sizeof requires an expression vs. a type-reference; the casting | ||||
| 	//    tricks the type system into believing it has such an expression. | ||||
| 	recordSize := int(unsafe.Sizeof(*((*winterm.INPUT_RECORD)(unsafe.Pointer(&maxBytes))))) | ||||
| 	countRecords := maxBytes / recordSize | ||||
| 	if countRecords > ansiterm.MAX_INPUT_EVENTS { | ||||
| 		countRecords = ansiterm.MAX_INPUT_EVENTS | ||||
| 	} else if countRecords == 0 { | ||||
| 		countRecords = 1 | ||||
| 	} | ||||
| 	logger.Debugf("[windows] readInputEvents: Reading %v records (buffer size %v, record size %v)", countRecords, maxBytes, recordSize) | ||||
|  | ||||
| 	// Wait for and read input events | ||||
| 	events := make([]winterm.INPUT_RECORD, countRecords) | ||||
| 	nEvents := uint32(0) | ||||
| 	eventsExist, err := winterm.WaitForSingleObject(fd, winterm.WAIT_INFINITE) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	if eventsExist { | ||||
| 		err = winterm.ReadConsoleInput(fd, events, &nEvents) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Return a slice restricted to the number of returned records | ||||
| 	logger.Debugf("[windows] readInputEvents: Read %v events", nEvents) | ||||
| 	return events[:nEvents], nil | ||||
| } | ||||
|  | ||||
| // KeyEvent Translation Helpers | ||||
|  | ||||
| var arrowKeyMapPrefix = map[uint16]string{ | ||||
| 	winterm.VK_UP:    "%s%sA", | ||||
| 	winterm.VK_DOWN:  "%s%sB", | ||||
| 	winterm.VK_RIGHT: "%s%sC", | ||||
| 	winterm.VK_LEFT:  "%s%sD", | ||||
| } | ||||
|  | ||||
| var keyMapPrefix = map[uint16]string{ | ||||
| 	winterm.VK_UP:     "\x1B[%sA", | ||||
| 	winterm.VK_DOWN:   "\x1B[%sB", | ||||
| 	winterm.VK_RIGHT:  "\x1B[%sC", | ||||
| 	winterm.VK_LEFT:   "\x1B[%sD", | ||||
| 	winterm.VK_HOME:   "\x1B[1%s~", // showkey shows ^[[1 | ||||
| 	winterm.VK_END:    "\x1B[4%s~", // showkey shows ^[[4 | ||||
| 	winterm.VK_INSERT: "\x1B[2%s~", | ||||
| 	winterm.VK_DELETE: "\x1B[3%s~", | ||||
| 	winterm.VK_PRIOR:  "\x1B[5%s~", | ||||
| 	winterm.VK_NEXT:   "\x1B[6%s~", | ||||
| 	winterm.VK_F1:     "", | ||||
| 	winterm.VK_F2:     "", | ||||
| 	winterm.VK_F3:     "\x1B[13%s~", | ||||
| 	winterm.VK_F4:     "\x1B[14%s~", | ||||
| 	winterm.VK_F5:     "\x1B[15%s~", | ||||
| 	winterm.VK_F6:     "\x1B[17%s~", | ||||
| 	winterm.VK_F7:     "\x1B[18%s~", | ||||
| 	winterm.VK_F8:     "\x1B[19%s~", | ||||
| 	winterm.VK_F9:     "\x1B[20%s~", | ||||
| 	winterm.VK_F10:    "\x1B[21%s~", | ||||
| 	winterm.VK_F11:    "\x1B[23%s~", | ||||
| 	winterm.VK_F12:    "\x1B[24%s~", | ||||
| } | ||||
|  | ||||
| // translateKeyEvents converts the input events into the appropriate ANSI string. | ||||
| func translateKeyEvents(events []winterm.INPUT_RECORD, escapeSequence []byte) []byte { | ||||
| 	var buffer bytes.Buffer | ||||
| 	for _, event := range events { | ||||
| 		if event.EventType == winterm.KEY_EVENT && event.KeyEvent.KeyDown != 0 { | ||||
| 			buffer.WriteString(keyToString(&event.KeyEvent, escapeSequence)) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return buffer.Bytes() | ||||
| } | ||||
|  | ||||
| // keyToString maps the given input event record to the corresponding string. | ||||
| func keyToString(keyEvent *winterm.KEY_EVENT_RECORD, escapeSequence []byte) string { | ||||
| 	if keyEvent.UnicodeChar == 0 { | ||||
| 		return formatVirtualKey(keyEvent.VirtualKeyCode, keyEvent.ControlKeyState, escapeSequence) | ||||
| 	} | ||||
|  | ||||
| 	_, alt, control := getControlKeys(keyEvent.ControlKeyState) | ||||
| 	if control { | ||||
| 		// TODO(azlinux): Implement following control sequences | ||||
| 		// <Ctrl>-D  Signals the end of input from the keyboard; also exits current shell. | ||||
| 		// <Ctrl>-H  Deletes the first character to the left of the cursor. Also called the ERASE key. | ||||
| 		// <Ctrl>-Q  Restarts printing after it has been stopped with <Ctrl>-s. | ||||
| 		// <Ctrl>-S  Suspends printing on the screen (does not stop the program). | ||||
| 		// <Ctrl>-U  Deletes all characters on the current line. Also called the KILL key. | ||||
| 		// <Ctrl>-E  Quits current command and creates a core | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	// <Alt>+Key generates ESC N Key | ||||
| 	if !control && alt { | ||||
| 		return ansiterm.KEY_ESC_N + strings.ToLower(string(keyEvent.UnicodeChar)) | ||||
| 	} | ||||
|  | ||||
| 	return string(keyEvent.UnicodeChar) | ||||
| } | ||||
|  | ||||
| // formatVirtualKey converts a virtual key (e.g., up arrow) into the appropriate ANSI string. | ||||
| func formatVirtualKey(key uint16, controlState uint32, escapeSequence []byte) string { | ||||
| 	shift, alt, control := getControlKeys(controlState) | ||||
| 	modifier := getControlKeysModifier(shift, alt, control) | ||||
|  | ||||
| 	if format, ok := arrowKeyMapPrefix[key]; ok { | ||||
| 		return fmt.Sprintf(format, escapeSequence, modifier) | ||||
| 	} | ||||
|  | ||||
| 	if format, ok := keyMapPrefix[key]; ok { | ||||
| 		return fmt.Sprintf(format, modifier) | ||||
| 	} | ||||
|  | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| // getControlKeys extracts the shift, alt, and ctrl key states. | ||||
| func getControlKeys(controlState uint32) (shift, alt, control bool) { | ||||
| 	shift = 0 != (controlState & winterm.SHIFT_PRESSED) | ||||
| 	alt = 0 != (controlState & (winterm.LEFT_ALT_PRESSED | winterm.RIGHT_ALT_PRESSED)) | ||||
| 	control = 0 != (controlState & (winterm.LEFT_CTRL_PRESSED | winterm.RIGHT_CTRL_PRESSED)) | ||||
| 	return shift, alt, control | ||||
| } | ||||
|  | ||||
| // getControlKeysModifier returns the ANSI modifier for the given combination of control keys. | ||||
| func getControlKeysModifier(shift, alt, control bool) string { | ||||
| 	if shift && alt && control { | ||||
| 		return ansiterm.KEY_CONTROL_PARAM_8 | ||||
| 	} | ||||
| 	if alt && control { | ||||
| 		return ansiterm.KEY_CONTROL_PARAM_7 | ||||
| 	} | ||||
| 	if shift && control { | ||||
| 		return ansiterm.KEY_CONTROL_PARAM_6 | ||||
| 	} | ||||
| 	if control { | ||||
| 		return ansiterm.KEY_CONTROL_PARAM_5 | ||||
| 	} | ||||
| 	if shift && alt { | ||||
| 		return ansiterm.KEY_CONTROL_PARAM_4 | ||||
| 	} | ||||
| 	if alt { | ||||
| 		return ansiterm.KEY_CONTROL_PARAM_3 | ||||
| 	} | ||||
| 	if shift { | ||||
| 		return ansiterm.KEY_CONTROL_PARAM_2 | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
							
								
								
									
										64
									
								
								vendor/github.com/docker/docker/pkg/term/windows/ansi_writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										64
									
								
								vendor/github.com/docker/docker/pkg/term/windows/ansi_writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,64 +0,0 @@ | ||||
| // +build windows | ||||
|  | ||||
| package windowsconsole // import "github.com/docker/docker/pkg/term/windows" | ||||
|  | ||||
| import ( | ||||
| 	"io" | ||||
| 	"os" | ||||
|  | ||||
| 	ansiterm "github.com/Azure/go-ansiterm" | ||||
| 	"github.com/Azure/go-ansiterm/winterm" | ||||
| ) | ||||
|  | ||||
| // ansiWriter wraps a standard output file (e.g., os.Stdout) providing ANSI sequence translation. | ||||
| type ansiWriter struct { | ||||
| 	file           *os.File | ||||
| 	fd             uintptr | ||||
| 	infoReset      *winterm.CONSOLE_SCREEN_BUFFER_INFO | ||||
| 	command        []byte | ||||
| 	escapeSequence []byte | ||||
| 	inAnsiSequence bool | ||||
| 	parser         *ansiterm.AnsiParser | ||||
| } | ||||
|  | ||||
| // NewAnsiWriter returns an io.Writer that provides VT100 terminal emulation on top of a | ||||
| // Windows console output handle. | ||||
| func NewAnsiWriter(nFile int) io.Writer { | ||||
| 	initLogger() | ||||
| 	file, fd := winterm.GetStdFile(nFile) | ||||
| 	info, err := winterm.GetConsoleScreenBufferInfo(fd) | ||||
| 	if err != nil { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	parser := ansiterm.CreateParser("Ground", winterm.CreateWinEventHandler(fd, file)) | ||||
| 	logger.Infof("newAnsiWriter: parser %p", parser) | ||||
|  | ||||
| 	aw := &ansiWriter{ | ||||
| 		file:           file, | ||||
| 		fd:             fd, | ||||
| 		infoReset:      info, | ||||
| 		command:        make([]byte, 0, ansiterm.ANSI_MAX_CMD_LENGTH), | ||||
| 		escapeSequence: []byte(ansiterm.KEY_ESC_CSI), | ||||
| 		parser:         parser, | ||||
| 	} | ||||
|  | ||||
| 	logger.Infof("newAnsiWriter: aw.parser %p", aw.parser) | ||||
| 	logger.Infof("newAnsiWriter: %v", aw) | ||||
| 	return aw | ||||
| } | ||||
|  | ||||
| func (aw *ansiWriter) Fd() uintptr { | ||||
| 	return aw.fd | ||||
| } | ||||
|  | ||||
| // Write writes len(p) bytes from p to the underlying data stream. | ||||
| func (aw *ansiWriter) Write(p []byte) (total int, err error) { | ||||
| 	if len(p) == 0 { | ||||
| 		return 0, nil | ||||
| 	} | ||||
|  | ||||
| 	logger.Infof("Write: % x", p) | ||||
| 	logger.Infof("Write: %s", string(p)) | ||||
| 	return aw.parser.Parse(p) | ||||
| } | ||||
							
								
								
									
										35
									
								
								vendor/github.com/docker/docker/pkg/term/windows/console.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/docker/docker/pkg/term/windows/console.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,35 +0,0 @@ | ||||
| // +build windows | ||||
|  | ||||
| package windowsconsole // import "github.com/docker/docker/pkg/term/windows" | ||||
|  | ||||
| import ( | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/Azure/go-ansiterm/winterm" | ||||
| ) | ||||
|  | ||||
| // GetHandleInfo returns file descriptor and bool indicating whether the file is a console. | ||||
| func GetHandleInfo(in interface{}) (uintptr, bool) { | ||||
| 	switch t := in.(type) { | ||||
| 	case *ansiReader: | ||||
| 		return t.Fd(), true | ||||
| 	case *ansiWriter: | ||||
| 		return t.Fd(), true | ||||
| 	} | ||||
|  | ||||
| 	var inFd uintptr | ||||
| 	var isTerminal bool | ||||
|  | ||||
| 	if file, ok := in.(*os.File); ok { | ||||
| 		inFd = file.Fd() | ||||
| 		isTerminal = IsConsole(inFd) | ||||
| 	} | ||||
| 	return inFd, isTerminal | ||||
| } | ||||
|  | ||||
| // IsConsole returns true if the given file descriptor is a Windows Console. | ||||
| // The code assumes that GetConsoleMode will return an error for file descriptors that are not a console. | ||||
| func IsConsole(fd uintptr) bool { | ||||
| 	_, e := winterm.GetConsoleMode(fd) | ||||
| 	return e == nil | ||||
| } | ||||
							
								
								
									
										34
									
								
								vendor/github.com/docker/docker/pkg/term/windows/windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/docker/docker/pkg/term/windows/windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,34 +0,0 @@ | ||||
| // +build windows | ||||
| // These files implement ANSI-aware input and output streams for use by the Docker Windows client. | ||||
| // When asked for the set of standard streams (e.g., stdin, stdout, stderr), the code will create | ||||
| // and return pseudo-streams that convert ANSI sequences to / from Windows Console API calls. | ||||
|  | ||||
| package windowsconsole // import "github.com/docker/docker/pkg/term/windows" | ||||
|  | ||||
| import ( | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"sync" | ||||
|  | ||||
| 	ansiterm "github.com/Azure/go-ansiterm" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| ) | ||||
|  | ||||
| var logger *logrus.Logger | ||||
| var initOnce sync.Once | ||||
|  | ||||
| func initLogger() { | ||||
| 	initOnce.Do(func() { | ||||
| 		logFile := ioutil.Discard | ||||
|  | ||||
| 		if isDebugEnv := os.Getenv(ansiterm.LogEnv); isDebugEnv == "1" { | ||||
| 			logFile, _ = os.Create("ansiReaderWriter.log") | ||||
| 		} | ||||
|  | ||||
| 		logger = &logrus.Logger{ | ||||
| 			Out:       logFile, | ||||
| 			Formatter: new(logrus.TextFormatter), | ||||
| 			Level:     logrus.DebugLevel, | ||||
| 		} | ||||
| 	}) | ||||
| } | ||||
							
								
								
									
										20
									
								
								vendor/github.com/docker/docker/pkg/term/winsize.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/docker/docker/pkg/term/winsize.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,20 +0,0 @@ | ||||
| // +build !windows | ||||
|  | ||||
| package term // import "github.com/docker/docker/pkg/term" | ||||
|  | ||||
| import ( | ||||
| 	"golang.org/x/sys/unix" | ||||
| ) | ||||
|  | ||||
| // GetWinsize returns the window size based on the specified file descriptor. | ||||
| func GetWinsize(fd uintptr) (*Winsize, error) { | ||||
| 	uws, err := unix.IoctlGetWinsize(int(fd), unix.TIOCGWINSZ) | ||||
| 	ws := &Winsize{Height: uws.Row, Width: uws.Col, x: uws.Xpixel, y: uws.Ypixel} | ||||
| 	return ws, err | ||||
| } | ||||
|  | ||||
| // SetWinsize tries to set the specified window size for the specified file descriptor. | ||||
| func SetWinsize(fd uintptr, ws *Winsize) error { | ||||
| 	uws := &unix.Winsize{Row: ws.Height, Col: ws.Width, Xpixel: ws.x, Ypixel: ws.y} | ||||
| 	return unix.IoctlSetWinsize(int(fd), unix.TIOCSWINSZ, uws) | ||||
| } | ||||
							
								
								
									
										21
									
								
								vendor/github.com/docker/docker/registry/config_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								vendor/github.com/docker/docker/registry/config_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -2,11 +2,26 @@ | ||||
|  | ||||
| package registry // import "github.com/docker/docker/registry" | ||||
|  | ||||
| var ( | ||||
| 	// CertsDir is the directory where certificates are stored | ||||
| 	CertsDir = "/etc/docker/certs.d" | ||||
| import ( | ||||
| 	"path/filepath" | ||||
|  | ||||
| 	"github.com/docker/docker/pkg/homedir" | ||||
| 	"github.com/docker/docker/rootless" | ||||
| ) | ||||
|  | ||||
| // CertsDir is the directory where certificates are stored | ||||
| func CertsDir() string { | ||||
| 	d := "/etc/docker/certs.d" | ||||
|  | ||||
| 	if rootless.RunningWithRootlessKit() { | ||||
| 		configHome, err := homedir.GetConfigHome() | ||||
| 		if err == nil { | ||||
| 			d = filepath.Join(configHome, "docker/certs.d") | ||||
| 		} | ||||
| 	} | ||||
| 	return d | ||||
| } | ||||
|  | ||||
| // cleanPath is used to ensure that a directory name is valid on the target | ||||
| // platform. It will be passed in something *similar* to a URL such as | ||||
| // https:/index.docker.io/v1. Not all platforms support directory names | ||||
|   | ||||
							
								
								
									
										4
									
								
								vendor/github.com/docker/docker/registry/config_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/docker/docker/registry/config_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -7,7 +7,9 @@ import ( | ||||
| ) | ||||
|  | ||||
| // CertsDir is the directory where certificates are stored | ||||
| var CertsDir = os.Getenv("programdata") + `\docker\certs.d` | ||||
| func CertsDir() string { | ||||
| 	return os.Getenv("programdata") + `\docker\certs.d` | ||||
| } | ||||
|  | ||||
| // cleanPath is used to ensure that a directory name is valid on the target | ||||
| // platform. It will be passed in something *similar* to a URL such as | ||||
|   | ||||
							
								
								
									
										27
									
								
								vendor/github.com/docker/docker/registry/registry.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/docker/docker/registry/registry.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -14,8 +14,6 @@ import ( | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/docker/distribution/registry/client/transport" | ||||
| 	"github.com/docker/docker/pkg/homedir" | ||||
| 	"github.com/docker/docker/rootless" | ||||
| 	"github.com/docker/go-connections/tlsconfig" | ||||
| 	"github.com/sirupsen/logrus" | ||||
| ) | ||||
| @@ -26,26 +24,27 @@ var ( | ||||
| 	ErrAlreadyExists = errors.New("Image already exists") | ||||
| ) | ||||
|  | ||||
| // HostCertsDir returns the config directory for a specific host | ||||
| func HostCertsDir(hostname string) (string, error) { | ||||
| 	certsDir := CertsDir() | ||||
|  | ||||
| 	hostDir := filepath.Join(certsDir, cleanPath(hostname)) | ||||
|  | ||||
| 	return hostDir, nil | ||||
| } | ||||
|  | ||||
| func newTLSConfig(hostname string, isSecure bool) (*tls.Config, error) { | ||||
| 	// PreferredServerCipherSuites should have no effect | ||||
| 	tlsConfig := tlsconfig.ServerDefault() | ||||
|  | ||||
| 	tlsConfig.InsecureSkipVerify = !isSecure | ||||
|  | ||||
| 	if isSecure && CertsDir != "" { | ||||
| 		certsDir := CertsDir | ||||
|  | ||||
| 		if rootless.RunningWithRootlessKit() { | ||||
| 			configHome, err := homedir.GetConfigHome() | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
|  | ||||
| 			certsDir = filepath.Join(configHome, "docker/certs.d") | ||||
| 	if isSecure && CertsDir() != "" { | ||||
| 		hostDir, err := HostCertsDir(hostname) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  | ||||
| 		hostDir := filepath.Join(certsDir, cleanPath(hostname)) | ||||
|  | ||||
| 		logrus.Debugf("hostDir: %s", hostDir) | ||||
| 		if err := ReadCertsDirectory(tlsConfig, hostDir); err != nil { | ||||
| 			return nil, err | ||||
|   | ||||
							
								
								
									
										202
									
								
								vendor/github.com/moby/sys/mount/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										202
									
								
								vendor/github.com/moby/sys/mount/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. | ||||
| @@ -1,4 +1,4 @@ | ||||
| package mount // import "github.com/docker/docker/pkg/mount" | ||||
| package mount | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| @@ -1,6 +1,6 @@ | ||||
| // +build freebsd,cgo | ||||
| 
 | ||||
| package mount // import "github.com/docker/docker/pkg/mount" | ||||
| package mount | ||||
| 
 | ||||
| /* | ||||
| #include <sys/mount.h> | ||||
| @@ -41,7 +41,6 @@ const ( | ||||
| 	SLAVE       = 0 | ||||
| 	RSLAVE      = 0 | ||||
| 	RBIND       = 0 | ||||
| 	RELATIVE    = 0 | ||||
| 	RELATIME    = 0 | ||||
| 	REMOUNT     = 0 | ||||
| 	STRICTATIME = 0 | ||||
| @@ -1,4 +1,4 @@ | ||||
| package mount // import "github.com/docker/docker/pkg/mount" | ||||
| package mount | ||||
| 
 | ||||
| import ( | ||||
| 	"golang.org/x/sys/unix" | ||||
| @@ -1,6 +1,6 @@ | ||||
| // +build !linux,!freebsd freebsd,!cgo | ||||
| 
 | ||||
| package mount // import "github.com/docker/docker/pkg/mount" | ||||
| package mount | ||||
| 
 | ||||
| // These flags are unsupported. | ||||
| const ( | ||||
| @@ -22,7 +22,6 @@ const ( | ||||
| 	RSLAVE      = 0 | ||||
| 	RBIND       = 0 | ||||
| 	RELATIME    = 0 | ||||
| 	RELATIVE    = 0 | ||||
| 	REMOUNT     = 0 | ||||
| 	STRICTATIME = 0 | ||||
| 	SYNCHRONOUS = 0 | ||||
							
								
								
									
										8
									
								
								vendor/github.com/moby/sys/mount/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/moby/sys/mount/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| module github.com/moby/sys/mount | ||||
|  | ||||
| go 1.14 | ||||
|  | ||||
| require ( | ||||
| 	github.com/moby/sys/mountinfo v0.1.0 | ||||
| 	golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae | ||||
| ) | ||||
							
								
								
									
										4
									
								
								vendor/github.com/moby/sys/mount/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/moby/sys/mount/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| github.com/moby/sys/mountinfo v0.1.0 h1:r8vMRbMAFEAfiNptYVokP+nfxPJzvRuia5e2vzXtENo= | ||||
| github.com/moby/sys/mountinfo v0.1.0/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= | ||||
| golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= | ||||
| golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
							
								
								
									
										98
									
								
								vendor/github.com/moby/sys/mount/mount.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								vendor/github.com/moby/sys/mount/mount.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | ||||
| // +build go1.13 | ||||
|  | ||||
| package mount | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"sort" | ||||
| 	"strconv" | ||||
|  | ||||
| 	"github.com/moby/sys/mountinfo" | ||||
| ) | ||||
|  | ||||
| // mountError records an error from mount or unmount operation | ||||
| type mountError struct { | ||||
| 	op             string | ||||
| 	source, target string | ||||
| 	flags          uintptr | ||||
| 	data           string | ||||
| 	err            error | ||||
| } | ||||
|  | ||||
| func (e *mountError) Error() string { | ||||
| 	out := e.op + " " | ||||
|  | ||||
| 	if e.source != "" { | ||||
| 		out += e.source + ":" + e.target | ||||
| 	} else { | ||||
| 		out += e.target | ||||
| 	} | ||||
|  | ||||
| 	if e.flags != uintptr(0) { | ||||
| 		out += ", flags: 0x" + strconv.FormatUint(uint64(e.flags), 16) | ||||
| 	} | ||||
| 	if e.data != "" { | ||||
| 		out += ", data: " + e.data | ||||
| 	} | ||||
|  | ||||
| 	out += ": " + e.err.Error() | ||||
| 	return out | ||||
| } | ||||
|  | ||||
| // Cause returns the underlying cause of the error. | ||||
| // This is a convention used in github.com/pkg/errors | ||||
| func (e *mountError) Cause() error { | ||||
| 	return e.err | ||||
| } | ||||
|  | ||||
| // Unwrap returns the underlying error. | ||||
| // This is a convention used in golang 1.13+ | ||||
| func (e *mountError) Unwrap() error { | ||||
| 	return e.err | ||||
| } | ||||
|  | ||||
| // Mount will mount filesystem according to the specified configuration. | ||||
| // Options must be specified like the mount or fstab unix commands: | ||||
| // "opt1=val1,opt2=val2". See flags.go for supported option flags. | ||||
| func Mount(device, target, mType, options string) error { | ||||
| 	flag, data := parseOptions(options) | ||||
| 	return mount(device, target, mType, uintptr(flag), data) | ||||
| } | ||||
|  | ||||
| // Unmount lazily unmounts a filesystem on supported platforms, otherwise | ||||
| // does a normal unmount. | ||||
| func Unmount(target string) error { | ||||
| 	return unmount(target, mntDetach) | ||||
| } | ||||
|  | ||||
| // RecursiveUnmount unmounts the target and all mounts underneath, starting with | ||||
| // the deepsest mount first. | ||||
| func RecursiveUnmount(target string) error { | ||||
| 	mounts, err := mountinfo.GetMounts(mountinfo.PrefixFilter(target)) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// Make the deepest mount be first | ||||
| 	sort.Slice(mounts, func(i, j int) bool { | ||||
| 		return len(mounts[i].Mountpoint) > len(mounts[j].Mountpoint) | ||||
| 	}) | ||||
|  | ||||
| 	var suberr error | ||||
| 	for i, m := range mounts { | ||||
| 		err = unmount(m.Mountpoint, mntDetach) | ||||
| 		if err != nil { | ||||
| 			if i == len(mounts)-1 { // last mount | ||||
| 				return fmt.Errorf("%w (possible cause: %s)", err, suberr) | ||||
| 			} | ||||
| 			// This is a submount, we can ignore the error for now, | ||||
| 			// the final unmount will fail if this is a real problem. | ||||
| 			// With that in mind, the _first_ failed unmount error | ||||
| 			// might be the real error cause, so let's keep it. | ||||
| 			if suberr == nil { | ||||
| 				suberr = err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| @@ -1,4 +1,4 @@ | ||||
| package mount // import "github.com/docker/docker/pkg/mount" | ||||
| package mount | ||||
| 
 | ||||
| /* | ||||
| #include <errno.h> | ||||
| @@ -1,4 +1,4 @@ | ||||
| package mount // import "github.com/docker/docker/pkg/mount" | ||||
| package mount | ||||
| 
 | ||||
| import ( | ||||
| 	"golang.org/x/sys/unix" | ||||
| @@ -1,6 +1,6 @@ | ||||
| // +build !linux,!freebsd freebsd,!cgo | ||||
| 
 | ||||
| package mount // import "github.com/docker/docker/pkg/mount" | ||||
| package mount | ||||
| 
 | ||||
| func mount(device, target, mType string, flag uintptr, data string) error { | ||||
| 	panic("Not implemented") | ||||
| @@ -1,4 +1,6 @@ | ||||
| package mount // import "github.com/docker/docker/pkg/mount" | ||||
| package mount | ||||
| 
 | ||||
| import "github.com/moby/sys/mountinfo" | ||||
| 
 | ||||
| // MakeShared ensures a mounted filesystem has the SHARED mount option enabled. | ||||
| // See the supported options in flags.go for further reference. | ||||
| @@ -51,7 +53,7 @@ func MakeRUnbindable(mountPoint string) error { | ||||
| // MakeMount ensures that the file or directory given is a mount point, | ||||
| // bind mounting it to itself it case it is not. | ||||
| func MakeMount(mnt string) error { | ||||
| 	mounted, err := Mounted(mnt) | ||||
| 	mounted, err := mountinfo.Mounted(mnt) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @@ -1,6 +1,6 @@ | ||||
| // +build !windows | ||||
| 
 | ||||
| package mount // import "github.com/docker/docker/pkg/mount" | ||||
| package mount | ||||
| 
 | ||||
| import "golang.org/x/sys/unix" | ||||
| 
 | ||||
| @@ -1,6 +1,6 @@ | ||||
| // +build windows | ||||
| 
 | ||||
| package mount // import "github.com/docker/docker/pkg/mount" | ||||
| package mount | ||||
| 
 | ||||
| func unmount(target string, flag int) error { | ||||
| 	panic("Not implemented") | ||||
							
								
								
									
										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 | ||||
| @@ -1,4 +1,31 @@ | ||||
| package mount // import "github.com/docker/docker/pkg/mount" | ||||
| 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. | ||||
							
								
								
									
										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 // import "github.com/docker/docker/pkg/mount" | ||||
| package mountinfo | ||||
| 
 | ||||
| /* | ||||
| #include <sys/param.h> | ||||
| @@ -33,6 +33,8 @@ func parseMountTable(filter FilterFunc) ([]*Info, error) { | ||||
| 		var mountinfo Info | ||||
| 		var skip, stop bool | ||||
| 		mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[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 | ||||
| @@ -42,9 +44,6 @@ func parseMountTable(filter FilterFunc) ([]*Info, error) { | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		mountinfo.Source = C.GoString(&entry.f_mntfromname[0]) | ||||
| 		mountinfo.Fstype = C.GoString(&entry.f_fstypename[0]) | ||||
| 
 | ||||
| 		out = append(out, &mountinfo) | ||||
| 		if stop { | ||||
| 			break | ||||
| @@ -1,4 +1,6 @@ | ||||
| package mount // import "github.com/docker/docker/pkg/mount" | ||||
| // +build go1.13 | ||||
| 
 | ||||
| package mountinfo | ||||
| 
 | ||||
| import ( | ||||
| 	"bufio" | ||||
| @@ -7,8 +9,6 @@ import ( | ||||
| 	"os" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/pkg/errors" | ||||
| ) | ||||
| 
 | ||||
| func parseInfoFile(r io.Reader, filter FilterFunc) ([]*Info, error) { | ||||
| @@ -36,6 +36,12 @@ func parseInfoFile(r io.Reader, filter FilterFunc) ([]*Info, error) { | ||||
| 		   (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() | ||||
| @@ -46,7 +52,45 @@ func parseInfoFile(r io.Reader, filter FilterFunc) ([]*Info, error) { | ||||
| 			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]) | ||||
| @@ -59,56 +103,21 @@ func parseInfoFile(r io.Reader, filter FilterFunc) ([]*Info, error) { | ||||
| 
 | ||||
| 		p.Root, err = strconv.Unquote(`"` + fields[3] + `"`) | ||||
| 		if err != nil { | ||||
| 			return nil, errors.Wrapf(err, "Parsing '%s' failed: unable to unquote root field", fields[3]) | ||||
| 			return nil, fmt.Errorf("Parsing '%s' failed: unable to unquote root field: %w", fields[3], err) | ||||
| 		} | ||||
| 
 | ||||
| 		p.Mountpoint, err = strconv.Unquote(`"` + fields[4] + `"`) | ||||
| 		if err != nil { | ||||
| 			return nil, errors.Wrapf(err, "Parsing '%s' failed: unable to unquote mount point field", fields[4]) | ||||
| 		} | ||||
| 		p.Opts = fields[5] | ||||
| 
 | ||||
| 		var skip, stop bool | ||||
| 		if filter != nil { | ||||
| 			// filter out entries we're not interested in | ||||
| 			skip, stop = filter(p) | ||||
| 			if skip { | ||||
| 				continue | ||||
| 			} | ||||
| 		// 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], " ") | ||||
| 		} | ||||
| 
 | ||||
| 		// one or more optional fields, when a separator (-) | ||||
| 		i := 6 | ||||
| 		for ; i < numFields && fields[i] != "-"; i++ { | ||||
| 			switch i { | ||||
| 			case 6: | ||||
| 				p.Optional = fields[6] | ||||
| 			default: | ||||
| 				/* NOTE there might be more optional fields before the such as | ||||
| 				   fields[7]...fields[N] (where N < sepIndex), although | ||||
| 				   as of Linux kernel 4.15 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 '%s' failed: missing separator ('-')", text) | ||||
| 		} | ||||
| 
 | ||||
| 		// There should be 3 fields after the separator... | ||||
| 		if i+4 > numFields { | ||||
| 			return nil, fmt.Errorf("Parsing '%s' 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 stop { | ||||
| 			break | ||||
| @@ -1,12 +1,17 @@ | ||||
| // +build !windows,!linux,!freebsd freebsd,!cgo | ||||
| 
 | ||||
| package mount // import "github.com/docker/docker/pkg/mount" | ||||
| package mountinfo | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"runtime" | ||||
| ) | ||||
| 
 | ||||
| func parseMountTable(f FilterFunc) ([]*Info, error) { | ||||
| 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) | ||||
| } | ||||
							
								
								
									
										9
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							| @@ -118,7 +118,7 @@ github.com/docker/distribution/registry/client/transport | ||||
| github.com/docker/distribution/registry/storage/cache | ||||
| github.com/docker/distribution/registry/storage/cache/memory | ||||
| github.com/docker/distribution/uuid | ||||
| # github.com/docker/docker v17.12.0-ce-rc1.0.20200730172259-9f28837c1d93+incompatible => github.com/docker/docker v17.12.0-ce-rc1.0.20200310163718-4634ce647cf2+incompatible | ||||
| # github.com/docker/docker v17.12.0-ce-rc1.0.20200730172259-9f28837c1d93+incompatible | ||||
| github.com/docker/docker/api | ||||
| github.com/docker/docker/api/types | ||||
| github.com/docker/docker/api/types/blkiodev | ||||
| @@ -142,14 +142,11 @@ github.com/docker/docker/pkg/homedir | ||||
| github.com/docker/docker/pkg/ioutils | ||||
| github.com/docker/docker/pkg/jsonmessage | ||||
| github.com/docker/docker/pkg/longpath | ||||
| github.com/docker/docker/pkg/mount | ||||
| github.com/docker/docker/pkg/namesgenerator | ||||
| github.com/docker/docker/pkg/stdcopy | ||||
| github.com/docker/docker/pkg/stringid | ||||
| github.com/docker/docker/pkg/system | ||||
| github.com/docker/docker/pkg/tarsum | ||||
| github.com/docker/docker/pkg/term | ||||
| github.com/docker/docker/pkg/term/windows | ||||
| github.com/docker/docker/pkg/urlutil | ||||
| github.com/docker/docker/registry | ||||
| github.com/docker/docker/registry/resumable | ||||
| @@ -276,6 +273,10 @@ github.com/moby/buildkit/util/progress | ||||
| github.com/moby/buildkit/util/progress/progressui | ||||
| github.com/moby/buildkit/util/stack | ||||
| github.com/moby/buildkit/util/system | ||||
| # github.com/moby/sys/mount v0.1.0 | ||||
| github.com/moby/sys/mount | ||||
| # github.com/moby/sys/mountinfo v0.1.3 | ||||
| github.com/moby/sys/mountinfo | ||||
| # github.com/moby/term v0.0.0-20200911173544-4fc2018d01d9 | ||||
| github.com/moby/term | ||||
| github.com/moby/term/windows | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Sebastiaan van Stijn
					Sebastiaan van Stijn