mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Revert "Fix working_set calculation in kubelet"
This commit is contained in:
		
							
								
								
									
										2
									
								
								vendor/github.com/docker/docker/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/docker/docker/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -176,7 +176,7 @@
 | 
			
		||||
 | 
			
		||||
   END OF TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
   Copyright 2013-2016 Docker, Inc.
 | 
			
		||||
   Copyright 2013-2015 Docker, Inc.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/docker/docker/NOTICE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/docker/docker/NOTICE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,5 @@
 | 
			
		||||
Docker
 | 
			
		||||
Copyright 2012-2016 Docker, Inc.
 | 
			
		||||
Copyright 2012-2015 Docker, Inc.
 | 
			
		||||
 | 
			
		||||
This product includes software developed at Docker, Inc. (https://www.docker.com).
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								vendor/github.com/docker/docker/pkg/jsonlog/jsonlog.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										40
									
								
								vendor/github.com/docker/docker/pkg/jsonlog/jsonlog.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,40 +0,0 @@
 | 
			
		||||
package jsonlog
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// JSONLog represents a log message, typically a single entry from a given log stream.
 | 
			
		||||
// JSONLogs can be easily serialized to and from JSON and support custom formatting.
 | 
			
		||||
type JSONLog struct {
 | 
			
		||||
	// Log is the log message
 | 
			
		||||
	Log string `json:"log,omitempty"`
 | 
			
		||||
	// Stream is the log source
 | 
			
		||||
	Stream string `json:"stream,omitempty"`
 | 
			
		||||
	// Created is the created timestamp of log
 | 
			
		||||
	Created time.Time `json:"time"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Format returns the log formatted according to format
 | 
			
		||||
// If format is nil, returns the log message
 | 
			
		||||
// If format is json, returns the log marshaled in json format
 | 
			
		||||
// By default, returns the log with the log time formatted according to format.
 | 
			
		||||
func (jl *JSONLog) Format(format string) (string, error) {
 | 
			
		||||
	if format == "" {
 | 
			
		||||
		return jl.Log, nil
 | 
			
		||||
	}
 | 
			
		||||
	if format == "json" {
 | 
			
		||||
		m, err := json.Marshal(jl)
 | 
			
		||||
		return string(m), err
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("%s %s", jl.Created.Format(format), jl.Log), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Reset resets the log to nil.
 | 
			
		||||
func (jl *JSONLog) Reset() {
 | 
			
		||||
	jl.Log = ""
 | 
			
		||||
	jl.Stream = ""
 | 
			
		||||
	jl.Created = time.Time{}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										178
									
								
								vendor/github.com/docker/docker/pkg/jsonlog/jsonlog_marshalling.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										178
									
								
								vendor/github.com/docker/docker/pkg/jsonlog/jsonlog_marshalling.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,178 +0,0 @@
 | 
			
		||||
// This code was initially generated by ffjson <https://github.com/pquerna/ffjson>
 | 
			
		||||
// This code was generated via the following steps:
 | 
			
		||||
// $ go get -u github.com/pquerna/ffjson
 | 
			
		||||
// $ make BIND_DIR=. shell
 | 
			
		||||
// $ ffjson pkg/jsonlog/jsonlog.go
 | 
			
		||||
// $ mv pkg/jsonglog/jsonlog_ffjson.go pkg/jsonlog/jsonlog_marshalling.go
 | 
			
		||||
//
 | 
			
		||||
// It has been modified to improve the performance of time marshalling to JSON
 | 
			
		||||
// and to clean it up.
 | 
			
		||||
// Should this code need to be regenerated when the JSONLog struct is changed,
 | 
			
		||||
// the relevant changes which have been made are:
 | 
			
		||||
// import (
 | 
			
		||||
//        "bytes"
 | 
			
		||||
//-
 | 
			
		||||
//        "unicode/utf8"
 | 
			
		||||
// )
 | 
			
		||||
//
 | 
			
		||||
// func (mj *JSONLog) MarshalJSON() ([]byte, error) {
 | 
			
		||||
//@@ -20,13 +16,13 @@ func (mj *JSONLog) MarshalJSON() ([]byte, error) {
 | 
			
		||||
//        }
 | 
			
		||||
//        return buf.Bytes(), nil
 | 
			
		||||
// }
 | 
			
		||||
//+
 | 
			
		||||
// func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
 | 
			
		||||
//-       var err error
 | 
			
		||||
//-       var obj []byte
 | 
			
		||||
//-       var first bool = true
 | 
			
		||||
//-       _ = obj
 | 
			
		||||
//-       _ = err
 | 
			
		||||
//-       _ = first
 | 
			
		||||
//+       var (
 | 
			
		||||
//+               err       error
 | 
			
		||||
//+               timestamp string
 | 
			
		||||
//+               first     bool = true
 | 
			
		||||
//+       )
 | 
			
		||||
//        buf.WriteString(`{`)
 | 
			
		||||
//        if len(mj.Log) != 0 {
 | 
			
		||||
//                if first == true {
 | 
			
		||||
//@@ -52,11 +48,11 @@ func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
 | 
			
		||||
//                buf.WriteString(`,`)
 | 
			
		||||
//        }
 | 
			
		||||
//        buf.WriteString(`"time":`)
 | 
			
		||||
//-       obj, err = mj.Created.MarshalJSON()
 | 
			
		||||
//+       timestamp, err = FastTimeMarshalJSON(mj.Created)
 | 
			
		||||
//        if err != nil {
 | 
			
		||||
//                return err
 | 
			
		||||
//        }
 | 
			
		||||
//-       buf.Write(obj)
 | 
			
		||||
//+       buf.WriteString(timestamp)
 | 
			
		||||
//        buf.WriteString(`}`)
 | 
			
		||||
//        return nil
 | 
			
		||||
// }
 | 
			
		||||
// @@ -81,9 +81,10 @@ func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
 | 
			
		||||
//         if len(mj.Log) != 0 {
 | 
			
		||||
// -                if first == true {
 | 
			
		||||
// -                       first = false
 | 
			
		||||
// -               } else {
 | 
			
		||||
// -                       buf.WriteString(`,`)
 | 
			
		||||
// -               }
 | 
			
		||||
// +               first = false
 | 
			
		||||
//                 buf.WriteString(`"log":`)
 | 
			
		||||
//                 ffjsonWriteJSONString(buf, mj.Log)
 | 
			
		||||
//         }
 | 
			
		||||
 | 
			
		||||
package jsonlog
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"unicode/utf8"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// MarshalJSON marshals the JSONLog.
 | 
			
		||||
func (mj *JSONLog) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	var buf bytes.Buffer
 | 
			
		||||
	buf.Grow(1024)
 | 
			
		||||
	if err := mj.MarshalJSONBuf(&buf); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return buf.Bytes(), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalJSONBuf marshals the JSONLog and stores the result to a bytes.Buffer.
 | 
			
		||||
func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
 | 
			
		||||
	var (
 | 
			
		||||
		err       error
 | 
			
		||||
		timestamp string
 | 
			
		||||
		first     = true
 | 
			
		||||
	)
 | 
			
		||||
	buf.WriteString(`{`)
 | 
			
		||||
	if len(mj.Log) != 0 {
 | 
			
		||||
		first = false
 | 
			
		||||
		buf.WriteString(`"log":`)
 | 
			
		||||
		ffjsonWriteJSONString(buf, mj.Log)
 | 
			
		||||
	}
 | 
			
		||||
	if len(mj.Stream) != 0 {
 | 
			
		||||
		if first {
 | 
			
		||||
			first = false
 | 
			
		||||
		} else {
 | 
			
		||||
			buf.WriteString(`,`)
 | 
			
		||||
		}
 | 
			
		||||
		buf.WriteString(`"stream":`)
 | 
			
		||||
		ffjsonWriteJSONString(buf, mj.Stream)
 | 
			
		||||
	}
 | 
			
		||||
	if !first {
 | 
			
		||||
		buf.WriteString(`,`)
 | 
			
		||||
	}
 | 
			
		||||
	buf.WriteString(`"time":`)
 | 
			
		||||
	timestamp, err = FastTimeMarshalJSON(mj.Created)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	buf.WriteString(timestamp)
 | 
			
		||||
	buf.WriteString(`}`)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ffjsonWriteJSONString(buf *bytes.Buffer, s string) {
 | 
			
		||||
	const hex = "0123456789abcdef"
 | 
			
		||||
 | 
			
		||||
	buf.WriteByte('"')
 | 
			
		||||
	start := 0
 | 
			
		||||
	for i := 0; i < len(s); {
 | 
			
		||||
		if b := s[i]; b < utf8.RuneSelf {
 | 
			
		||||
			if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' {
 | 
			
		||||
				i++
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if start < i {
 | 
			
		||||
				buf.WriteString(s[start:i])
 | 
			
		||||
			}
 | 
			
		||||
			switch b {
 | 
			
		||||
			case '\\', '"':
 | 
			
		||||
				buf.WriteByte('\\')
 | 
			
		||||
				buf.WriteByte(b)
 | 
			
		||||
			case '\n':
 | 
			
		||||
				buf.WriteByte('\\')
 | 
			
		||||
				buf.WriteByte('n')
 | 
			
		||||
			case '\r':
 | 
			
		||||
				buf.WriteByte('\\')
 | 
			
		||||
				buf.WriteByte('r')
 | 
			
		||||
			default:
 | 
			
		||||
 | 
			
		||||
				buf.WriteString(`\u00`)
 | 
			
		||||
				buf.WriteByte(hex[b>>4])
 | 
			
		||||
				buf.WriteByte(hex[b&0xF])
 | 
			
		||||
			}
 | 
			
		||||
			i++
 | 
			
		||||
			start = i
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		c, size := utf8.DecodeRuneInString(s[i:])
 | 
			
		||||
		if c == utf8.RuneError && size == 1 {
 | 
			
		||||
			if start < i {
 | 
			
		||||
				buf.WriteString(s[start:i])
 | 
			
		||||
			}
 | 
			
		||||
			buf.WriteString(`\ufffd`)
 | 
			
		||||
			i += size
 | 
			
		||||
			start = i
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if c == '\u2028' || c == '\u2029' {
 | 
			
		||||
			if start < i {
 | 
			
		||||
				buf.WriteString(s[start:i])
 | 
			
		||||
			}
 | 
			
		||||
			buf.WriteString(`\u202`)
 | 
			
		||||
			buf.WriteByte(hex[c&0xF])
 | 
			
		||||
			i += size
 | 
			
		||||
			start = i
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		i += size
 | 
			
		||||
	}
 | 
			
		||||
	if start < len(s) {
 | 
			
		||||
		buf.WriteString(s[start:])
 | 
			
		||||
	}
 | 
			
		||||
	buf.WriteByte('"')
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										122
									
								
								vendor/github.com/docker/docker/pkg/jsonlog/jsonlogbytes.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										122
									
								
								vendor/github.com/docker/docker/pkg/jsonlog/jsonlogbytes.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,122 +0,0 @@
 | 
			
		||||
package jsonlog
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"unicode/utf8"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// JSONLogs is based on JSONLog.
 | 
			
		||||
// It allows marshalling JSONLog from Log as []byte
 | 
			
		||||
// and an already marshalled Created timestamp.
 | 
			
		||||
type JSONLogs struct {
 | 
			
		||||
	Log     []byte `json:"log,omitempty"`
 | 
			
		||||
	Stream  string `json:"stream,omitempty"`
 | 
			
		||||
	Created string `json:"time"`
 | 
			
		||||
 | 
			
		||||
	// json-encoded bytes
 | 
			
		||||
	RawAttrs json.RawMessage `json:"attrs,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarshalJSONBuf is based on the same method from JSONLog
 | 
			
		||||
// It has been modified to take into account the necessary changes.
 | 
			
		||||
func (mj *JSONLogs) MarshalJSONBuf(buf *bytes.Buffer) error {
 | 
			
		||||
	var first = true
 | 
			
		||||
 | 
			
		||||
	buf.WriteString(`{`)
 | 
			
		||||
	if len(mj.Log) != 0 {
 | 
			
		||||
		first = false
 | 
			
		||||
		buf.WriteString(`"log":`)
 | 
			
		||||
		ffjsonWriteJSONBytesAsString(buf, mj.Log)
 | 
			
		||||
	}
 | 
			
		||||
	if len(mj.Stream) != 0 {
 | 
			
		||||
		if first == true {
 | 
			
		||||
			first = false
 | 
			
		||||
		} else {
 | 
			
		||||
			buf.WriteString(`,`)
 | 
			
		||||
		}
 | 
			
		||||
		buf.WriteString(`"stream":`)
 | 
			
		||||
		ffjsonWriteJSONString(buf, mj.Stream)
 | 
			
		||||
	}
 | 
			
		||||
	if len(mj.RawAttrs) > 0 {
 | 
			
		||||
		if first {
 | 
			
		||||
			first = false
 | 
			
		||||
		} else {
 | 
			
		||||
			buf.WriteString(`,`)
 | 
			
		||||
		}
 | 
			
		||||
		buf.WriteString(`"attrs":`)
 | 
			
		||||
		buf.Write(mj.RawAttrs)
 | 
			
		||||
	}
 | 
			
		||||
	if !first {
 | 
			
		||||
		buf.WriteString(`,`)
 | 
			
		||||
	}
 | 
			
		||||
	buf.WriteString(`"time":`)
 | 
			
		||||
	buf.WriteString(mj.Created)
 | 
			
		||||
	buf.WriteString(`}`)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// This is based on ffjsonWriteJSONBytesAsString. It has been changed
 | 
			
		||||
// to accept a string passed as a slice of bytes.
 | 
			
		||||
func ffjsonWriteJSONBytesAsString(buf *bytes.Buffer, s []byte) {
 | 
			
		||||
	const hex = "0123456789abcdef"
 | 
			
		||||
 | 
			
		||||
	buf.WriteByte('"')
 | 
			
		||||
	start := 0
 | 
			
		||||
	for i := 0; i < len(s); {
 | 
			
		||||
		if b := s[i]; b < utf8.RuneSelf {
 | 
			
		||||
			if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' {
 | 
			
		||||
				i++
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if start < i {
 | 
			
		||||
				buf.Write(s[start:i])
 | 
			
		||||
			}
 | 
			
		||||
			switch b {
 | 
			
		||||
			case '\\', '"':
 | 
			
		||||
				buf.WriteByte('\\')
 | 
			
		||||
				buf.WriteByte(b)
 | 
			
		||||
			case '\n':
 | 
			
		||||
				buf.WriteByte('\\')
 | 
			
		||||
				buf.WriteByte('n')
 | 
			
		||||
			case '\r':
 | 
			
		||||
				buf.WriteByte('\\')
 | 
			
		||||
				buf.WriteByte('r')
 | 
			
		||||
			default:
 | 
			
		||||
 | 
			
		||||
				buf.WriteString(`\u00`)
 | 
			
		||||
				buf.WriteByte(hex[b>>4])
 | 
			
		||||
				buf.WriteByte(hex[b&0xF])
 | 
			
		||||
			}
 | 
			
		||||
			i++
 | 
			
		||||
			start = i
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		c, size := utf8.DecodeRune(s[i:])
 | 
			
		||||
		if c == utf8.RuneError && size == 1 {
 | 
			
		||||
			if start < i {
 | 
			
		||||
				buf.Write(s[start:i])
 | 
			
		||||
			}
 | 
			
		||||
			buf.WriteString(`\ufffd`)
 | 
			
		||||
			i += size
 | 
			
		||||
			start = i
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if c == '\u2028' || c == '\u2029' {
 | 
			
		||||
			if start < i {
 | 
			
		||||
				buf.Write(s[start:i])
 | 
			
		||||
			}
 | 
			
		||||
			buf.WriteString(`\u202`)
 | 
			
		||||
			buf.WriteByte(hex[c&0xF])
 | 
			
		||||
			i += size
 | 
			
		||||
			start = i
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		i += size
 | 
			
		||||
	}
 | 
			
		||||
	if start < len(s) {
 | 
			
		||||
		buf.Write(s[start:])
 | 
			
		||||
	}
 | 
			
		||||
	buf.WriteByte('"')
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										77
									
								
								vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										77
									
								
								vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,13 +7,11 @@ import (
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/docker/docker/pkg/jsonlog"
 | 
			
		||||
	"github.com/docker/docker/pkg/term"
 | 
			
		||||
	"github.com/docker/go-units"
 | 
			
		||||
	"github.com/docker/docker/pkg/timeutils"
 | 
			
		||||
	"github.com/docker/docker/pkg/units"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// JSONError wraps a concrete Code and Message, `Code` is
 | 
			
		||||
// is a integer error code, `Message` is the error message.
 | 
			
		||||
type JSONError struct {
 | 
			
		||||
	Code    int    `json:"code,omitempty"`
 | 
			
		||||
	Message string `json:"message,omitempty"`
 | 
			
		||||
@@ -23,14 +21,10 @@ func (e *JSONError) Error() string {
 | 
			
		||||
	return e.Message
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// JSONProgress describes a Progress. terminalFd is the fd of the current terminal,
 | 
			
		||||
// Start is the initial value for the operation. Current is the current status and
 | 
			
		||||
// value of the progress made towards Total. Total is the end value describing when
 | 
			
		||||
// we made 100% progress for an operation.
 | 
			
		||||
type JSONProgress struct {
 | 
			
		||||
	terminalFd uintptr
 | 
			
		||||
	Current    int64 `json:"current,omitempty"`
 | 
			
		||||
	Total      int64 `json:"total,omitempty"`
 | 
			
		||||
	Current    int   `json:"current,omitempty"`
 | 
			
		||||
	Total      int   `json:"total,omitempty"`
 | 
			
		||||
	Start      int64 `json:"start,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -60,23 +54,17 @@ func (p *JSONProgress) String() string {
 | 
			
		||||
		percentage = 50
 | 
			
		||||
	}
 | 
			
		||||
	if width > 110 {
 | 
			
		||||
		// this number can't be negative gh#7136
 | 
			
		||||
		// this number can't be negetive gh#7136
 | 
			
		||||
		numSpaces := 0
 | 
			
		||||
		if 50-percentage > 0 {
 | 
			
		||||
			numSpaces = 50 - percentage
 | 
			
		||||
		}
 | 
			
		||||
		pbBox = fmt.Sprintf("[%s>%s] ", strings.Repeat("=", percentage), strings.Repeat(" ", numSpaces))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	numbersBox = fmt.Sprintf("%8v/%v", current, total)
 | 
			
		||||
 | 
			
		||||
	if p.Current > p.Total {
 | 
			
		||||
		// remove total display if the reported current is wonky.
 | 
			
		||||
		numbersBox = fmt.Sprintf("%8v", current)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if p.Current > 0 && p.Start > 0 && percentage < 50 {
 | 
			
		||||
		fromStart := time.Now().UTC().Sub(time.Unix(p.Start, 0))
 | 
			
		||||
		fromStart := time.Now().UTC().Sub(time.Unix(int64(p.Start), 0))
 | 
			
		||||
		perEntry := fromStart / time.Duration(p.Current)
 | 
			
		||||
		left := time.Duration(p.Total-p.Current) * perEntry
 | 
			
		||||
		left = (left / time.Second) * time.Second
 | 
			
		||||
@@ -88,9 +76,6 @@ func (p *JSONProgress) String() string {
 | 
			
		||||
	return pbBox + numbersBox + timeLeftBox
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// JSONMessage defines a message struct. It describes
 | 
			
		||||
// the created time, where it from, status, ID of the
 | 
			
		||||
// message. It's used for docker events.
 | 
			
		||||
type JSONMessage struct {
 | 
			
		||||
	Stream          string        `json:"stream,omitempty"`
 | 
			
		||||
	Status          string        `json:"status,omitempty"`
 | 
			
		||||
@@ -99,16 +84,10 @@ type JSONMessage struct {
 | 
			
		||||
	ID              string        `json:"id,omitempty"`
 | 
			
		||||
	From            string        `json:"from,omitempty"`
 | 
			
		||||
	Time            int64         `json:"time,omitempty"`
 | 
			
		||||
	TimeNano        int64         `json:"timeNano,omitempty"`
 | 
			
		||||
	Error           *JSONError    `json:"errorDetail,omitempty"`
 | 
			
		||||
	ErrorMessage    string        `json:"error,omitempty"` //deprecated
 | 
			
		||||
	// Aux contains out-of-band data, such as digests for push signing.
 | 
			
		||||
	Aux *json.RawMessage `json:"aux,omitempty"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Display displays the JSONMessage to `out`. `isTerminal` describes if `out`
 | 
			
		||||
// is a terminal. If this is the case, it will erase the entire current line
 | 
			
		||||
// when displaying the progressbar.
 | 
			
		||||
func (jm *JSONMessage) Display(out io.Writer, isTerminal bool) error {
 | 
			
		||||
	if jm.Error != nil {
 | 
			
		||||
		if jm.Error.Code == 401 {
 | 
			
		||||
@@ -124,10 +103,8 @@ func (jm *JSONMessage) Display(out io.Writer, isTerminal bool) error {
 | 
			
		||||
	} else if jm.Progress != nil && jm.Progress.String() != "" { //disable progressbar in non-terminal
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	if jm.TimeNano != 0 {
 | 
			
		||||
		fmt.Fprintf(out, "%s ", time.Unix(0, jm.TimeNano).Format(jsonlog.RFC3339NanoFixed))
 | 
			
		||||
	} else if jm.Time != 0 {
 | 
			
		||||
		fmt.Fprintf(out, "%s ", time.Unix(jm.Time, 0).Format(jsonlog.RFC3339NanoFixed))
 | 
			
		||||
	if jm.Time != 0 {
 | 
			
		||||
		fmt.Fprintf(out, "%s ", time.Unix(jm.Time, 0).Format(timeutils.RFC3339NanoFixed))
 | 
			
		||||
	}
 | 
			
		||||
	if jm.ID != "" {
 | 
			
		||||
		fmt.Fprintf(out, "%s: ", jm.ID)
 | 
			
		||||
@@ -147,16 +124,13 @@ func (jm *JSONMessage) Display(out io.Writer, isTerminal bool) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DisplayJSONMessagesStream displays a json message stream from `in` to `out`, `isTerminal`
 | 
			
		||||
// describes if `out` is a terminal. If this is the case, it will print `\n` at the end of
 | 
			
		||||
// each line and move the cursor while displaying.
 | 
			
		||||
func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr, isTerminal bool, auxCallback func(*json.RawMessage)) error {
 | 
			
		||||
func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr, isTerminal bool) error {
 | 
			
		||||
	var (
 | 
			
		||||
		dec = json.NewDecoder(in)
 | 
			
		||||
		ids = make(map[string]int)
 | 
			
		||||
		dec  = json.NewDecoder(in)
 | 
			
		||||
		ids  = make(map[string]int)
 | 
			
		||||
		diff = 0
 | 
			
		||||
	)
 | 
			
		||||
	for {
 | 
			
		||||
		diff := 0
 | 
			
		||||
		var jm JSONMessage
 | 
			
		||||
		if err := dec.Decode(&jm); err != nil {
 | 
			
		||||
			if err == io.EOF {
 | 
			
		||||
@@ -165,51 +139,28 @@ func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr,
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if jm.Aux != nil {
 | 
			
		||||
			if auxCallback != nil {
 | 
			
		||||
				auxCallback(jm.Aux)
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if jm.Progress != nil {
 | 
			
		||||
			jm.Progress.terminalFd = terminalFd
 | 
			
		||||
		}
 | 
			
		||||
		if jm.ID != "" && (jm.Progress != nil || jm.ProgressMessage != "") {
 | 
			
		||||
			line, ok := ids[jm.ID]
 | 
			
		||||
			if !ok {
 | 
			
		||||
				// NOTE: This approach of using len(id) to
 | 
			
		||||
				// figure out the number of lines of history
 | 
			
		||||
				// only works as long as we clear the history
 | 
			
		||||
				// when we output something that's not
 | 
			
		||||
				// accounted for in the map, such as a line
 | 
			
		||||
				// with no ID.
 | 
			
		||||
				line = len(ids)
 | 
			
		||||
				ids[jm.ID] = line
 | 
			
		||||
				if isTerminal {
 | 
			
		||||
					fmt.Fprintf(out, "\n")
 | 
			
		||||
				}
 | 
			
		||||
				diff = 0
 | 
			
		||||
			} else {
 | 
			
		||||
				diff = len(ids) - line
 | 
			
		||||
			}
 | 
			
		||||
			if isTerminal {
 | 
			
		||||
				// NOTE: this appears to be necessary even if
 | 
			
		||||
				// diff == 0.
 | 
			
		||||
			if jm.ID != "" && isTerminal {
 | 
			
		||||
				// <ESC>[{diff}A = move cursor up diff rows
 | 
			
		||||
				fmt.Fprintf(out, "%c[%dA", 27, diff)
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			// When outputting something that isn't progress
 | 
			
		||||
			// output, clear the history of previous lines. We
 | 
			
		||||
			// don't want progress entries from some previous
 | 
			
		||||
			// operation to be updated (for example, pull -a
 | 
			
		||||
			// with multiple tags).
 | 
			
		||||
			ids = make(map[string]int)
 | 
			
		||||
		}
 | 
			
		||||
		err := jm.Display(out, isTerminal)
 | 
			
		||||
		if jm.ID != "" && isTerminal {
 | 
			
		||||
			// NOTE: this appears to be necessary even if
 | 
			
		||||
			// diff == 0.
 | 
			
		||||
			// <ESC>[{diff}B = move cursor down diff rows
 | 
			
		||||
			fmt.Fprintf(out, "%c[%dB", 27, diff)
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								vendor/github.com/docker/docker/pkg/longpath/longpath.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/docker/docker/pkg/longpath/longpath.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,26 +0,0 @@
 | 
			
		||||
// longpath introduces some constants and helper functions for handling long paths
 | 
			
		||||
// in Windows, which are expected to be prepended with `\\?\` and followed by either
 | 
			
		||||
// a drive letter, a UNC server\share, or a volume identifier.
 | 
			
		||||
 | 
			
		||||
package longpath
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Prefix is the longpath prefix for Windows file paths.
 | 
			
		||||
const Prefix = `\\?\`
 | 
			
		||||
 | 
			
		||||
// AddPrefix will add the Windows long path prefix to the path provided if
 | 
			
		||||
// it does not already have it.
 | 
			
		||||
func AddPrefix(path string) string {
 | 
			
		||||
	if !strings.HasPrefix(path, Prefix) {
 | 
			
		||||
		if strings.HasPrefix(path, `\\`) {
 | 
			
		||||
			// This is a UNC path, so we need to add 'UNC' to the path as well.
 | 
			
		||||
			path = Prefix + `UNC` + path[1:]
 | 
			
		||||
		} else {
 | 
			
		||||
			path = Prefix + path
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return path
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								vendor/github.com/docker/docker/pkg/mount/flags.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/docker/docker/pkg/mount/flags.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,7 +1,6 @@
 | 
			
		||||
package mount
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -68,25 +67,3 @@ func parseOptions(options string) (int, string) {
 | 
			
		||||
	}
 | 
			
		||||
	return flag, strings.Join(data, ",")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseTmpfsOptions parse fstab type mount options into flags and data
 | 
			
		||||
func ParseTmpfsOptions(options string) (int, string, error) {
 | 
			
		||||
	flags, data := parseOptions(options)
 | 
			
		||||
	validFlags := map[string]bool{
 | 
			
		||||
		"":          true,
 | 
			
		||||
		"size":      true,
 | 
			
		||||
		"mode":      true,
 | 
			
		||||
		"uid":       true,
 | 
			
		||||
		"gid":       true,
 | 
			
		||||
		"nr_inodes": true,
 | 
			
		||||
		"nr_blocks": true,
 | 
			
		||||
		"mpol":      true,
 | 
			
		||||
	}
 | 
			
		||||
	for _, o := range strings.Split(data, ",") {
 | 
			
		||||
		opt := strings.SplitN(o, "=", 2)
 | 
			
		||||
		if !validFlags[opt[0]] {
 | 
			
		||||
			return 0, "", fmt.Errorf("Invalid tmpfs option %q", opt)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return flags, data, nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/docker/docker/pkg/mount/flags_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/docker/docker/pkg/mount/flags_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -23,7 +23,7 @@ const (
 | 
			
		||||
	SYNCHRONOUS = syscall.MS_SYNCHRONOUS
 | 
			
		||||
 | 
			
		||||
	// DIRSYNC will force all directory updates within the file system to be done
 | 
			
		||||
	// synchronously. This affects the following system calls: create, link,
 | 
			
		||||
	// synchronously. This affects the following system calls: creat, link,
 | 
			
		||||
	// unlink, symlink, mkdir, rmdir, mknod and rename.
 | 
			
		||||
	DIRSYNC = syscall.MS_DIRSYNC
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
// +build !windows,!linux,!freebsd freebsd,!cgo
 | 
			
		||||
// +build !linux,!freebsd freebsd,!cgo
 | 
			
		||||
 | 
			
		||||
package mount
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
 | 
			
		||||
func parseMountTable() ([]*Info, error) {
 | 
			
		||||
	// Do NOT return an error!
 | 
			
		||||
	return nil, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -61,7 +61,8 @@ func ensureMountedAs(mountPoint, options string) error {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if _, err = Mounted(mountPoint); err != nil {
 | 
			
		||||
	mounted, err = Mounted(mountPoint)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										108
									
								
								vendor/github.com/docker/docker/pkg/stdcopy/stdcopy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										108
									
								
								vendor/github.com/docker/docker/pkg/stdcopy/stdcopy.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -3,57 +3,44 @@ package stdcopy
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/binary"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
 | 
			
		||||
	"github.com/Sirupsen/logrus"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// StdType is the type of standard stream
 | 
			
		||||
// a writer can multiplex to.
 | 
			
		||||
type StdType byte
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// Stdin represents standard input stream type.
 | 
			
		||||
	Stdin StdType = iota
 | 
			
		||||
	// Stdout represents standard output stream type.
 | 
			
		||||
	Stdout
 | 
			
		||||
	// Stderr represents standard error steam type.
 | 
			
		||||
	Stderr
 | 
			
		||||
 | 
			
		||||
	stdWriterPrefixLen = 8
 | 
			
		||||
	stdWriterFdIndex   = 0
 | 
			
		||||
	stdWriterSizeIndex = 4
 | 
			
		||||
 | 
			
		||||
	startingBufLen = 32*1024 + stdWriterPrefixLen + 1
 | 
			
		||||
	StdWriterPrefixLen = 8
 | 
			
		||||
	StdWriterFdIndex   = 0
 | 
			
		||||
	StdWriterSizeIndex = 4
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// stdWriter is wrapper of io.Writer with extra customized info.
 | 
			
		||||
type stdWriter struct {
 | 
			
		||||
type StdType [StdWriterPrefixLen]byte
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	Stdin  StdType = StdType{0: 0}
 | 
			
		||||
	Stdout StdType = StdType{0: 1}
 | 
			
		||||
	Stderr StdType = StdType{0: 2}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type StdWriter struct {
 | 
			
		||||
	io.Writer
 | 
			
		||||
	prefix byte
 | 
			
		||||
	prefix  StdType
 | 
			
		||||
	sizeBuf []byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Write sends the buffer to the underneath writer.
 | 
			
		||||
// It insert the prefix header before the buffer,
 | 
			
		||||
// so stdcopy.StdCopy knows where to multiplex the output.
 | 
			
		||||
// It makes stdWriter to implement io.Writer.
 | 
			
		||||
func (w *stdWriter) Write(buf []byte) (n int, err error) {
 | 
			
		||||
func (w *StdWriter) Write(buf []byte) (n int, err error) {
 | 
			
		||||
	var n1, n2 int
 | 
			
		||||
	if w == nil || w.Writer == nil {
 | 
			
		||||
		return 0, errors.New("Writer not instantiated")
 | 
			
		||||
	}
 | 
			
		||||
	if buf == nil {
 | 
			
		||||
		return 0, nil
 | 
			
		||||
	binary.BigEndian.PutUint32(w.prefix[4:], uint32(len(buf)))
 | 
			
		||||
	n1, err = w.Writer.Write(w.prefix[:])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		n = n1 - StdWriterPrefixLen
 | 
			
		||||
	} else {
 | 
			
		||||
		n2, err = w.Writer.Write(buf)
 | 
			
		||||
		n = n1 + n2 - StdWriterPrefixLen
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	header := [stdWriterPrefixLen]byte{stdWriterFdIndex: w.prefix}
 | 
			
		||||
	binary.BigEndian.PutUint32(header[stdWriterSizeIndex:], uint32(len(buf)))
 | 
			
		||||
 | 
			
		||||
	line := append(header[:], buf...)
 | 
			
		||||
 | 
			
		||||
	n, err = w.Writer.Write(line)
 | 
			
		||||
	n -= stdWriterPrefixLen
 | 
			
		||||
 | 
			
		||||
	if n < 0 {
 | 
			
		||||
		n = 0
 | 
			
		||||
	}
 | 
			
		||||
@@ -66,13 +53,16 @@ func (w *stdWriter) Write(buf []byte) (n int, err error) {
 | 
			
		||||
// This allows multiple write streams (e.g. stdout and stderr) to be muxed into a single connection.
 | 
			
		||||
// `t` indicates the id of the stream to encapsulate.
 | 
			
		||||
// It can be stdcopy.Stdin, stdcopy.Stdout, stdcopy.Stderr.
 | 
			
		||||
func NewStdWriter(w io.Writer, t StdType) io.Writer {
 | 
			
		||||
	return &stdWriter{
 | 
			
		||||
		Writer: w,
 | 
			
		||||
		prefix: byte(t),
 | 
			
		||||
func NewStdWriter(w io.Writer, t StdType) *StdWriter {
 | 
			
		||||
	return &StdWriter{
 | 
			
		||||
		Writer:  w,
 | 
			
		||||
		prefix:  t,
 | 
			
		||||
		sizeBuf: make([]byte, 4),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var ErrInvalidStdHeader = errors.New("Unrecognized input header")
 | 
			
		||||
 | 
			
		||||
// StdCopy is a modified version of io.Copy.
 | 
			
		||||
//
 | 
			
		||||
// StdCopy will demultiplex `src`, assuming that it contains two streams,
 | 
			
		||||
@@ -85,7 +75,7 @@ func NewStdWriter(w io.Writer, t StdType) io.Writer {
 | 
			
		||||
// `written` will hold the total number of bytes written to `dstout` and `dsterr`.
 | 
			
		||||
func StdCopy(dstout, dsterr io.Writer, src io.Reader) (written int64, err error) {
 | 
			
		||||
	var (
 | 
			
		||||
		buf       = make([]byte, startingBufLen)
 | 
			
		||||
		buf       = make([]byte, 32*1024+StdWriterPrefixLen+1)
 | 
			
		||||
		bufLen    = len(buf)
 | 
			
		||||
		nr, nw    int
 | 
			
		||||
		er, ew    error
 | 
			
		||||
@@ -95,12 +85,12 @@ func StdCopy(dstout, dsterr io.Writer, src io.Reader) (written int64, err error)
 | 
			
		||||
 | 
			
		||||
	for {
 | 
			
		||||
		// Make sure we have at least a full header
 | 
			
		||||
		for nr < stdWriterPrefixLen {
 | 
			
		||||
		for nr < StdWriterPrefixLen {
 | 
			
		||||
			var nr2 int
 | 
			
		||||
			nr2, er = src.Read(buf[nr:])
 | 
			
		||||
			nr += nr2
 | 
			
		||||
			if er == io.EOF {
 | 
			
		||||
				if nr < stdWriterPrefixLen {
 | 
			
		||||
				if nr < StdWriterPrefixLen {
 | 
			
		||||
					logrus.Debugf("Corrupted prefix: %v", buf[:nr])
 | 
			
		||||
					return written, nil
 | 
			
		||||
				}
 | 
			
		||||
@@ -113,40 +103,40 @@ func StdCopy(dstout, dsterr io.Writer, src io.Reader) (written int64, err error)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Check the first byte to know where to write
 | 
			
		||||
		switch StdType(buf[stdWriterFdIndex]) {
 | 
			
		||||
		case Stdin:
 | 
			
		||||
		switch buf[StdWriterFdIndex] {
 | 
			
		||||
		case 0:
 | 
			
		||||
			fallthrough
 | 
			
		||||
		case Stdout:
 | 
			
		||||
		case 1:
 | 
			
		||||
			// Write on stdout
 | 
			
		||||
			out = dstout
 | 
			
		||||
		case Stderr:
 | 
			
		||||
		case 2:
 | 
			
		||||
			// Write on stderr
 | 
			
		||||
			out = dsterr
 | 
			
		||||
		default:
 | 
			
		||||
			logrus.Debugf("Error selecting output fd: (%d)", buf[stdWriterFdIndex])
 | 
			
		||||
			return 0, fmt.Errorf("Unrecognized input header: %d", buf[stdWriterFdIndex])
 | 
			
		||||
			logrus.Debugf("Error selecting output fd: (%d)", buf[StdWriterFdIndex])
 | 
			
		||||
			return 0, ErrInvalidStdHeader
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Retrieve the size of the frame
 | 
			
		||||
		frameSize = int(binary.BigEndian.Uint32(buf[stdWriterSizeIndex : stdWriterSizeIndex+4]))
 | 
			
		||||
		frameSize = int(binary.BigEndian.Uint32(buf[StdWriterSizeIndex : StdWriterSizeIndex+4]))
 | 
			
		||||
		logrus.Debugf("framesize: %d", frameSize)
 | 
			
		||||
 | 
			
		||||
		// Check if the buffer is big enough to read the frame.
 | 
			
		||||
		// Extend it if necessary.
 | 
			
		||||
		if frameSize+stdWriterPrefixLen > bufLen {
 | 
			
		||||
			logrus.Debugf("Extending buffer cap by %d (was %d)", frameSize+stdWriterPrefixLen-bufLen+1, len(buf))
 | 
			
		||||
			buf = append(buf, make([]byte, frameSize+stdWriterPrefixLen-bufLen+1)...)
 | 
			
		||||
		if frameSize+StdWriterPrefixLen > bufLen {
 | 
			
		||||
			logrus.Debugf("Extending buffer cap by %d (was %d)", frameSize+StdWriterPrefixLen-bufLen+1, len(buf))
 | 
			
		||||
			buf = append(buf, make([]byte, frameSize+StdWriterPrefixLen-bufLen+1)...)
 | 
			
		||||
			bufLen = len(buf)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// While the amount of bytes read is less than the size of the frame + header, we keep reading
 | 
			
		||||
		for nr < frameSize+stdWriterPrefixLen {
 | 
			
		||||
		for nr < frameSize+StdWriterPrefixLen {
 | 
			
		||||
			var nr2 int
 | 
			
		||||
			nr2, er = src.Read(buf[nr:])
 | 
			
		||||
			nr += nr2
 | 
			
		||||
			if er == io.EOF {
 | 
			
		||||
				if nr < frameSize+stdWriterPrefixLen {
 | 
			
		||||
					logrus.Debugf("Corrupted frame: %v", buf[stdWriterPrefixLen:nr])
 | 
			
		||||
				if nr < frameSize+StdWriterPrefixLen {
 | 
			
		||||
					logrus.Debugf("Corrupted frame: %v", buf[StdWriterPrefixLen:nr])
 | 
			
		||||
					return written, nil
 | 
			
		||||
				}
 | 
			
		||||
				break
 | 
			
		||||
@@ -158,7 +148,7 @@ func StdCopy(dstout, dsterr io.Writer, src io.Reader) (written int64, err error)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Write the retrieved frame (without header)
 | 
			
		||||
		nw, ew = out.Write(buf[stdWriterPrefixLen : frameSize+stdWriterPrefixLen])
 | 
			
		||||
		nw, ew = out.Write(buf[StdWriterPrefixLen : frameSize+StdWriterPrefixLen])
 | 
			
		||||
		if ew != nil {
 | 
			
		||||
			logrus.Debugf("Error writing frame: %s", ew)
 | 
			
		||||
			return 0, ew
 | 
			
		||||
@@ -171,8 +161,8 @@ func StdCopy(dstout, dsterr io.Writer, src io.Reader) (written int64, err error)
 | 
			
		||||
		written += int64(nw)
 | 
			
		||||
 | 
			
		||||
		// Move the rest of the buffer to the beginning
 | 
			
		||||
		copy(buf, buf[frameSize+stdWriterPrefixLen:])
 | 
			
		||||
		copy(buf, buf[frameSize+StdWriterPrefixLen:])
 | 
			
		||||
		// Move the index
 | 
			
		||||
		nr -= frameSize + stdWriterPrefixLen
 | 
			
		||||
		nr -= frameSize + StdWriterPrefixLen
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/docker/docker/pkg/symlink/LICENSE.APACHE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/docker/docker/pkg/symlink/LICENSE.APACHE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -176,7 +176,7 @@
 | 
			
		||||
 | 
			
		||||
   END OF TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
   Copyright 2014-2016 Docker, Inc.
 | 
			
		||||
   Copyright 2014-2015 Docker, Inc.
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/docker/docker/pkg/symlink/LICENSE.BSD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/docker/docker/pkg/symlink/LICENSE.BSD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
Copyright (c) 2014-2016 The Docker & Go Authors. All rights reserved.
 | 
			
		||||
Copyright (c) 2014-2015 The Docker & Go Authors. All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without
 | 
			
		||||
modification, are permitted provided that the following conditions are
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/docker/docker/pkg/symlink/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/docker/docker/pkg/symlink/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,4 @@
 | 
			
		||||
Package symlink implements EvalSymlinksInScope which is an extension of filepath.EvalSymlinks,
 | 
			
		||||
as well as a Windows long-path aware version of filepath.EvalSymlinks
 | 
			
		||||
Package symlink implements EvalSymlinksInScope which is an extension of filepath.EvalSymlinks
 | 
			
		||||
from the [Go standard library](https://golang.org/pkg/path/filepath).
 | 
			
		||||
 | 
			
		||||
The code from filepath.EvalSymlinks has been adapted in fs.go.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/github.com/docker/docker/pkg/symlink/fs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/docker/docker/pkg/symlink/fs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -12,18 +12,15 @@ import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/docker/docker/pkg/system"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// FollowSymlinkInScope is a wrapper around evalSymlinksInScope that returns an
 | 
			
		||||
// absolute path. This function handles paths in a platform-agnostic manner.
 | 
			
		||||
// FollowSymlinkInScope is a wrapper around evalSymlinksInScope that returns an absolute path
 | 
			
		||||
func FollowSymlinkInScope(path, root string) (string, error) {
 | 
			
		||||
	path, err := filepath.Abs(filepath.FromSlash(path))
 | 
			
		||||
	path, err := filepath.Abs(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	root, err = filepath.Abs(filepath.FromSlash(root))
 | 
			
		||||
	root, err = filepath.Abs(root)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
@@ -122,7 +119,7 @@ func evalSymlinksInScope(path, root string) (string, error) {
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
		if system.IsAbs(dest) {
 | 
			
		||||
		if filepath.IsAbs(dest) {
 | 
			
		||||
			b.Reset()
 | 
			
		||||
		}
 | 
			
		||||
		path = dest + string(filepath.Separator) + path
 | 
			
		||||
@@ -132,12 +129,3 @@ func evalSymlinksInScope(path, root string) (string, error) {
 | 
			
		||||
	// what's happening here
 | 
			
		||||
	return filepath.Clean(root + filepath.Clean(string(filepath.Separator)+b.String())), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EvalSymlinks returns the path name after the evaluation of any symbolic
 | 
			
		||||
// links.
 | 
			
		||||
// If path is relative the result will be relative to the current directory,
 | 
			
		||||
// unless one of the components is an absolute symbolic link.
 | 
			
		||||
// This version has been updated to support long paths prepended with `\\?\`.
 | 
			
		||||
func EvalSymlinks(path string) (string, error) {
 | 
			
		||||
	return evalSymlinks(path)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								vendor/github.com/docker/docker/pkg/symlink/fs_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/docker/docker/pkg/symlink/fs_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,11 +0,0 @@
 | 
			
		||||
// +build !windows
 | 
			
		||||
 | 
			
		||||
package symlink
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func evalSymlinks(path string) (string, error) {
 | 
			
		||||
	return filepath.EvalSymlinks(path)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										155
									
								
								vendor/github.com/docker/docker/pkg/symlink/fs_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										155
									
								
								vendor/github.com/docker/docker/pkg/symlink/fs_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,155 +0,0 @@
 | 
			
		||||
package symlink
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"syscall"
 | 
			
		||||
 | 
			
		||||
	"github.com/docker/docker/pkg/longpath"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func toShort(path string) (string, error) {
 | 
			
		||||
	p, err := syscall.UTF16FromString(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	b := p // GetShortPathName says we can reuse buffer
 | 
			
		||||
	n, err := syscall.GetShortPathName(&p[0], &b[0], uint32(len(b)))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	if n > uint32(len(b)) {
 | 
			
		||||
		b = make([]uint16, n)
 | 
			
		||||
		if _, err = syscall.GetShortPathName(&p[0], &b[0], uint32(len(b))); err != nil {
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return syscall.UTF16ToString(b), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func toLong(path string) (string, error) {
 | 
			
		||||
	p, err := syscall.UTF16FromString(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	b := p // GetLongPathName says we can reuse buffer
 | 
			
		||||
	n, err := syscall.GetLongPathName(&p[0], &b[0], uint32(len(b)))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	if n > uint32(len(b)) {
 | 
			
		||||
		b = make([]uint16, n)
 | 
			
		||||
		n, err = syscall.GetLongPathName(&p[0], &b[0], uint32(len(b)))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	b = b[:n]
 | 
			
		||||
	return syscall.UTF16ToString(b), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func evalSymlinks(path string) (string, error) {
 | 
			
		||||
	path, err := walkSymlinks(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p, err := toShort(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	p, err = toLong(p)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	// syscall.GetLongPathName does not change the case of the drive letter,
 | 
			
		||||
	// but the result of EvalSymlinks must be unique, so we have
 | 
			
		||||
	// EvalSymlinks(`c:\a`) == EvalSymlinks(`C:\a`).
 | 
			
		||||
	// Make drive letter upper case.
 | 
			
		||||
	if len(p) >= 2 && p[1] == ':' && 'a' <= p[0] && p[0] <= 'z' {
 | 
			
		||||
		p = string(p[0]+'A'-'a') + p[1:]
 | 
			
		||||
	} else if len(p) >= 6 && p[5] == ':' && 'a' <= p[4] && p[4] <= 'z' {
 | 
			
		||||
		p = p[:3] + string(p[4]+'A'-'a') + p[5:]
 | 
			
		||||
	}
 | 
			
		||||
	return filepath.Clean(p), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const utf8RuneSelf = 0x80
 | 
			
		||||
 | 
			
		||||
func walkSymlinks(path string) (string, error) {
 | 
			
		||||
	const maxIter = 255
 | 
			
		||||
	originalPath := path
 | 
			
		||||
	// consume path by taking each frontmost path element,
 | 
			
		||||
	// expanding it if it's a symlink, and appending it to b
 | 
			
		||||
	var b bytes.Buffer
 | 
			
		||||
	for n := 0; path != ""; n++ {
 | 
			
		||||
		if n > maxIter {
 | 
			
		||||
			return "", errors.New("EvalSymlinks: too many links in " + originalPath)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// A path beginning with `\\?\` represents the root, so automatically
 | 
			
		||||
		// skip that part and begin processing the next segment.
 | 
			
		||||
		if strings.HasPrefix(path, longpath.Prefix) {
 | 
			
		||||
			b.WriteString(longpath.Prefix)
 | 
			
		||||
			path = path[4:]
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// find next path component, p
 | 
			
		||||
		var i = -1
 | 
			
		||||
		for j, c := range path {
 | 
			
		||||
			if c < utf8RuneSelf && os.IsPathSeparator(uint8(c)) {
 | 
			
		||||
				i = j
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		var p string
 | 
			
		||||
		if i == -1 {
 | 
			
		||||
			p, path = path, ""
 | 
			
		||||
		} else {
 | 
			
		||||
			p, path = path[:i], path[i+1:]
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if p == "" {
 | 
			
		||||
			if b.Len() == 0 {
 | 
			
		||||
				// must be absolute path
 | 
			
		||||
				b.WriteRune(filepath.Separator)
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// If this is the first segment after the long path prefix, accept the
 | 
			
		||||
		// current segment as a volume root or UNC share and move on to the next.
 | 
			
		||||
		if b.String() == longpath.Prefix {
 | 
			
		||||
			b.WriteString(p)
 | 
			
		||||
			b.WriteRune(filepath.Separator)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		fi, err := os.Lstat(b.String() + p)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
		if fi.Mode()&os.ModeSymlink == 0 {
 | 
			
		||||
			b.WriteString(p)
 | 
			
		||||
			if path != "" || (b.Len() == 2 && len(p) == 2 && p[1] == ':') {
 | 
			
		||||
				b.WriteRune(filepath.Separator)
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// it's a symlink, put it at the front of path
 | 
			
		||||
		dest, err := os.Readlink(b.String() + p)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
		if filepath.IsAbs(dest) || os.IsPathSeparator(dest[0]) {
 | 
			
		||||
			b.Reset()
 | 
			
		||||
		}
 | 
			
		||||
		path = dest + string(filepath.Separator) + path
 | 
			
		||||
	}
 | 
			
		||||
	return filepath.Clean(b.String()), nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										52
									
								
								vendor/github.com/docker/docker/pkg/system/chtimes.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								vendor/github.com/docker/docker/pkg/system/chtimes.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,52 +0,0 @@
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"time"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	maxTime time.Time
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	if unsafe.Sizeof(syscall.Timespec{}.Nsec) == 8 {
 | 
			
		||||
		// This is a 64 bit timespec
 | 
			
		||||
		// os.Chtimes limits time to the following
 | 
			
		||||
		maxTime = time.Unix(0, 1<<63-1)
 | 
			
		||||
	} else {
 | 
			
		||||
		// This is a 32 bit timespec
 | 
			
		||||
		maxTime = time.Unix(1<<31-1, 0)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Chtimes changes the access time and modified time of a file at the given path
 | 
			
		||||
func Chtimes(name string, atime time.Time, mtime time.Time) error {
 | 
			
		||||
	unixMinTime := time.Unix(0, 0)
 | 
			
		||||
	unixMaxTime := maxTime
 | 
			
		||||
 | 
			
		||||
	// If the modified time is prior to the Unix Epoch, or after the
 | 
			
		||||
	// end of Unix Time, os.Chtimes has undefined behavior
 | 
			
		||||
	// default to Unix Epoch in this case, just in case
 | 
			
		||||
 | 
			
		||||
	if atime.Before(unixMinTime) || atime.After(unixMaxTime) {
 | 
			
		||||
		atime = unixMinTime
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if mtime.Before(unixMinTime) || mtime.After(unixMaxTime) {
 | 
			
		||||
		mtime = unixMinTime
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := os.Chtimes(name, atime, mtime); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Take platform specific action for setting create time.
 | 
			
		||||
	if err := setCTime(name, mtime); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										14
									
								
								vendor/github.com/docker/docker/pkg/system/chtimes_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/docker/docker/pkg/system/chtimes_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,14 +0,0 @@
 | 
			
		||||
// +build !windows
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//setCTime will set the create time on a file. On Unix, the create
 | 
			
		||||
//time is updated as a side effect of setting the modified time, so
 | 
			
		||||
//no action is required.
 | 
			
		||||
func setCTime(path string, ctime time.Time) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/github.com/docker/docker/pkg/system/chtimes_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/docker/docker/pkg/system/chtimes_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,27 +0,0 @@
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//setCTime will set the create time on a file. On Windows, this requires
 | 
			
		||||
//calling SetFileTime and explicitly including the create time.
 | 
			
		||||
func setCTime(path string, ctime time.Time) error {
 | 
			
		||||
	ctimespec := syscall.NsecToTimespec(ctime.UnixNano())
 | 
			
		||||
	pathp, e := syscall.UTF16PtrFromString(path)
 | 
			
		||||
	if e != nil {
 | 
			
		||||
		return e
 | 
			
		||||
	}
 | 
			
		||||
	h, e := syscall.CreateFile(pathp,
 | 
			
		||||
		syscall.FILE_WRITE_ATTRIBUTES, syscall.FILE_SHARE_WRITE, nil,
 | 
			
		||||
		syscall.OPEN_EXISTING, syscall.FILE_FLAG_BACKUP_SEMANTICS, 0)
 | 
			
		||||
	if e != nil {
 | 
			
		||||
		return e
 | 
			
		||||
	}
 | 
			
		||||
	defer syscall.Close(h)
 | 
			
		||||
	c := syscall.NsecToFiletime(syscall.TimespecToNsec(ctimespec))
 | 
			
		||||
	return syscall.SetFileTime(h, &c, nil, nil)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								vendor/github.com/docker/docker/pkg/system/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/docker/docker/pkg/system/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,10 +0,0 @@
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// ErrNotSupportedPlatform means the platform is not supported.
 | 
			
		||||
	ErrNotSupportedPlatform = errors.New("platform and architecture is not supported")
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										83
									
								
								vendor/github.com/docker/docker/pkg/system/events_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										83
									
								
								vendor/github.com/docker/docker/pkg/system/events_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,83 +0,0 @@
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
// This file implements syscalls for Win32 events which are not implemented
 | 
			
		||||
// in golang.
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	procCreateEvent = modkernel32.NewProc("CreateEventW")
 | 
			
		||||
	procOpenEvent   = modkernel32.NewProc("OpenEventW")
 | 
			
		||||
	procSetEvent    = modkernel32.NewProc("SetEvent")
 | 
			
		||||
	procResetEvent  = modkernel32.NewProc("ResetEvent")
 | 
			
		||||
	procPulseEvent  = modkernel32.NewProc("PulseEvent")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// CreateEvent implements win32 CreateEventW func in golang. It will create an event object.
 | 
			
		||||
func CreateEvent(eventAttributes *syscall.SecurityAttributes, manualReset bool, initialState bool, name string) (handle syscall.Handle, err error) {
 | 
			
		||||
	namep, _ := syscall.UTF16PtrFromString(name)
 | 
			
		||||
	var _p1 uint32
 | 
			
		||||
	if manualReset {
 | 
			
		||||
		_p1 = 1
 | 
			
		||||
	}
 | 
			
		||||
	var _p2 uint32
 | 
			
		||||
	if initialState {
 | 
			
		||||
		_p2 = 1
 | 
			
		||||
	}
 | 
			
		||||
	r0, _, e1 := procCreateEvent.Call(uintptr(unsafe.Pointer(eventAttributes)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(namep)))
 | 
			
		||||
	use(unsafe.Pointer(namep))
 | 
			
		||||
	handle = syscall.Handle(r0)
 | 
			
		||||
	if handle == syscall.InvalidHandle {
 | 
			
		||||
		err = e1
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// OpenEvent implements win32 OpenEventW func in golang. It opens an event object.
 | 
			
		||||
func OpenEvent(desiredAccess uint32, inheritHandle bool, name string) (handle syscall.Handle, err error) {
 | 
			
		||||
	namep, _ := syscall.UTF16PtrFromString(name)
 | 
			
		||||
	var _p1 uint32
 | 
			
		||||
	if inheritHandle {
 | 
			
		||||
		_p1 = 1
 | 
			
		||||
	}
 | 
			
		||||
	r0, _, e1 := procOpenEvent.Call(uintptr(desiredAccess), uintptr(_p1), uintptr(unsafe.Pointer(namep)))
 | 
			
		||||
	use(unsafe.Pointer(namep))
 | 
			
		||||
	handle = syscall.Handle(r0)
 | 
			
		||||
	if handle == syscall.InvalidHandle {
 | 
			
		||||
		err = e1
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetEvent implements win32 SetEvent func in golang.
 | 
			
		||||
func SetEvent(handle syscall.Handle) (err error) {
 | 
			
		||||
	return setResetPulse(handle, procSetEvent)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ResetEvent implements win32 ResetEvent func in golang.
 | 
			
		||||
func ResetEvent(handle syscall.Handle) (err error) {
 | 
			
		||||
	return setResetPulse(handle, procResetEvent)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PulseEvent implements win32 PulseEvent func in golang.
 | 
			
		||||
func PulseEvent(handle syscall.Handle) (err error) {
 | 
			
		||||
	return setResetPulse(handle, procPulseEvent)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func setResetPulse(handle syscall.Handle, proc *syscall.LazyProc) (err error) {
 | 
			
		||||
	r0, _, _ := proc.Call(uintptr(handle))
 | 
			
		||||
	if r0 != 0 {
 | 
			
		||||
		err = syscall.Errno(r0)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var temp unsafe.Pointer
 | 
			
		||||
 | 
			
		||||
// use ensures a variable is kept alive without the GC freeing while still needed
 | 
			
		||||
func use(p unsafe.Pointer) {
 | 
			
		||||
	temp = p
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								vendor/github.com/docker/docker/pkg/system/filesys.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/docker/docker/pkg/system/filesys.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,19 +0,0 @@
 | 
			
		||||
// +build !windows
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// MkdirAll creates a directory named path along with any necessary parents,
 | 
			
		||||
// with permission specified by attribute perm for all dir created.
 | 
			
		||||
func MkdirAll(path string, perm os.FileMode) error {
 | 
			
		||||
	return os.MkdirAll(path, perm)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsAbs is a platform-specific wrapper for filepath.IsAbs.
 | 
			
		||||
func IsAbs(path string) bool {
 | 
			
		||||
	return filepath.IsAbs(path)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										82
									
								
								vendor/github.com/docker/docker/pkg/system/filesys_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										82
									
								
								vendor/github.com/docker/docker/pkg/system/filesys_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,82 +0,0 @@
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// MkdirAll implementation that is volume path aware for Windows.
 | 
			
		||||
func MkdirAll(path string, perm os.FileMode) error {
 | 
			
		||||
	if re := regexp.MustCompile(`^\\\\\?\\Volume{[a-z0-9-]+}$`); re.MatchString(path) {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// The rest of this method is copied from os.MkdirAll and should be kept
 | 
			
		||||
	// as-is to ensure compatibility.
 | 
			
		||||
 | 
			
		||||
	// Fast path: if we can tell whether path is a directory or file, stop with success or error.
 | 
			
		||||
	dir, err := os.Stat(path)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		if dir.IsDir() {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		return &os.PathError{
 | 
			
		||||
			Op:   "mkdir",
 | 
			
		||||
			Path: path,
 | 
			
		||||
			Err:  syscall.ENOTDIR,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Slow path: make sure parent exists and then call Mkdir for path.
 | 
			
		||||
	i := len(path)
 | 
			
		||||
	for i > 0 && os.IsPathSeparator(path[i-1]) { // Skip trailing path separator.
 | 
			
		||||
		i--
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	j := i
 | 
			
		||||
	for j > 0 && !os.IsPathSeparator(path[j-1]) { // Scan backward over element.
 | 
			
		||||
		j--
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if j > 1 {
 | 
			
		||||
		// Create parent
 | 
			
		||||
		err = MkdirAll(path[0:j-1], perm)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Parent now exists; invoke Mkdir and use its result.
 | 
			
		||||
	err = os.Mkdir(path, perm)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		// Handle arguments like "foo/." by
 | 
			
		||||
		// double-checking that directory doesn't exist.
 | 
			
		||||
		dir, err1 := os.Lstat(path)
 | 
			
		||||
		if err1 == nil && dir.IsDir() {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsAbs is a platform-specific wrapper for filepath.IsAbs. On Windows,
 | 
			
		||||
// golang filepath.IsAbs does not consider a path \windows\system32 as absolute
 | 
			
		||||
// as it doesn't start with a drive-letter/colon combination. However, in
 | 
			
		||||
// docker we need to verify things such as WORKDIR /windows/system32 in
 | 
			
		||||
// a Dockerfile (which gets translated to \windows\system32 when being processed
 | 
			
		||||
// 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
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								vendor/github.com/docker/docker/pkg/system/lstat.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/docker/docker/pkg/system/lstat.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,19 +0,0 @@
 | 
			
		||||
// +build !windows
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Lstat takes a path to a file and returns
 | 
			
		||||
// a system.StatT type pertaining to that file.
 | 
			
		||||
//
 | 
			
		||||
// Throws an error if the file does not exist
 | 
			
		||||
func Lstat(path string) (*StatT, error) {
 | 
			
		||||
	s := &syscall.Stat_t{}
 | 
			
		||||
	if err := syscall.Lstat(path, s); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return fromStatT(s)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										25
									
								
								vendor/github.com/docker/docker/pkg/system/lstat_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/docker/docker/pkg/system/lstat_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,25 +0,0 @@
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"os"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Lstat calls os.Lstat to get a fileinfo interface back.
 | 
			
		||||
// This is then copied into our own locally defined structure.
 | 
			
		||||
// Note the Linux version uses fromStatT to do the copy back,
 | 
			
		||||
// but that not strictly necessary when already in an OS specific module.
 | 
			
		||||
func Lstat(path string) (*StatT, error) {
 | 
			
		||||
	fi, err := os.Lstat(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &StatT{
 | 
			
		||||
		name:    fi.Name(),
 | 
			
		||||
		size:    fi.Size(),
 | 
			
		||||
		mode:    fi.Mode(),
 | 
			
		||||
		modTime: fi.ModTime(),
 | 
			
		||||
		isDir:   fi.IsDir()}, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								vendor/github.com/docker/docker/pkg/system/meminfo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/docker/docker/pkg/system/meminfo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,17 +0,0 @@
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
// MemInfo contains memory statistics of the host system.
 | 
			
		||||
type MemInfo struct {
 | 
			
		||||
	// Total usable RAM (i.e. physical RAM minus a few reserved bits and the
 | 
			
		||||
	// kernel binary code).
 | 
			
		||||
	MemTotal int64
 | 
			
		||||
 | 
			
		||||
	// Amount of free memory.
 | 
			
		||||
	MemFree int64
 | 
			
		||||
 | 
			
		||||
	// Total amount of swap space available.
 | 
			
		||||
	SwapTotal int64
 | 
			
		||||
 | 
			
		||||
	// Amount of swap space that is currently unused.
 | 
			
		||||
	SwapFree int64
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										65
									
								
								vendor/github.com/docker/docker/pkg/system/meminfo_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										65
									
								
								vendor/github.com/docker/docker/pkg/system/meminfo_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,65 +0,0 @@
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/docker/go-units"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ReadMemInfo retrieves memory statistics of the host system and returns a
 | 
			
		||||
// MemInfo type.
 | 
			
		||||
func ReadMemInfo() (*MemInfo, error) {
 | 
			
		||||
	file, err := os.Open("/proc/meminfo")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	defer file.Close()
 | 
			
		||||
	return parseMemInfo(file)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// parseMemInfo parses the /proc/meminfo file into
 | 
			
		||||
// a MemInfo object given an io.Reader to the file.
 | 
			
		||||
// Throws error if there are problems reading from the file
 | 
			
		||||
func parseMemInfo(reader io.Reader) (*MemInfo, error) {
 | 
			
		||||
	meminfo := &MemInfo{}
 | 
			
		||||
	scanner := bufio.NewScanner(reader)
 | 
			
		||||
	for scanner.Scan() {
 | 
			
		||||
		// Expected format: ["MemTotal:", "1234", "kB"]
 | 
			
		||||
		parts := strings.Fields(scanner.Text())
 | 
			
		||||
 | 
			
		||||
		// Sanity checks: Skip malformed entries.
 | 
			
		||||
		if len(parts) < 3 || parts[2] != "kB" {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Convert to bytes.
 | 
			
		||||
		size, err := strconv.Atoi(parts[1])
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		bytes := int64(size) * units.KiB
 | 
			
		||||
 | 
			
		||||
		switch parts[0] {
 | 
			
		||||
		case "MemTotal:":
 | 
			
		||||
			meminfo.MemTotal = bytes
 | 
			
		||||
		case "MemFree:":
 | 
			
		||||
			meminfo.MemFree = bytes
 | 
			
		||||
		case "SwapTotal:":
 | 
			
		||||
			meminfo.SwapTotal = bytes
 | 
			
		||||
		case "SwapFree:":
 | 
			
		||||
			meminfo.SwapFree = bytes
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Handle errors that may have occurred during the reading of the file.
 | 
			
		||||
	if err := scanner.Err(); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return meminfo, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,8 +0,0 @@
 | 
			
		||||
// +build !linux,!windows
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
// ReadMemInfo is not supported on platforms other than linux and windows.
 | 
			
		||||
func ReadMemInfo() (*MemInfo, error) {
 | 
			
		||||
	return nil, ErrNotSupportedPlatform
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										44
									
								
								vendor/github.com/docker/docker/pkg/system/meminfo_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										44
									
								
								vendor/github.com/docker/docker/pkg/system/meminfo_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,44 +0,0 @@
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	modkernel32 = syscall.NewLazyDLL("kernel32.dll")
 | 
			
		||||
 | 
			
		||||
	procGlobalMemoryStatusEx = modkernel32.NewProc("GlobalMemoryStatusEx")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx
 | 
			
		||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366770(v=vs.85).aspx
 | 
			
		||||
type memorystatusex struct {
 | 
			
		||||
	dwLength                uint32
 | 
			
		||||
	dwMemoryLoad            uint32
 | 
			
		||||
	ullTotalPhys            uint64
 | 
			
		||||
	ullAvailPhys            uint64
 | 
			
		||||
	ullTotalPageFile        uint64
 | 
			
		||||
	ullAvailPageFile        uint64
 | 
			
		||||
	ullTotalVirtual         uint64
 | 
			
		||||
	ullAvailVirtual         uint64
 | 
			
		||||
	ullAvailExtendedVirtual uint64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReadMemInfo retrieves memory statistics of the host system and returns a
 | 
			
		||||
//  MemInfo type.
 | 
			
		||||
func ReadMemInfo() (*MemInfo, error) {
 | 
			
		||||
	msi := &memorystatusex{
 | 
			
		||||
		dwLength: 64,
 | 
			
		||||
	}
 | 
			
		||||
	r1, _, _ := procGlobalMemoryStatusEx.Call(uintptr(unsafe.Pointer(msi)))
 | 
			
		||||
	if r1 == 0 {
 | 
			
		||||
		return &MemInfo{}, nil
 | 
			
		||||
	}
 | 
			
		||||
	return &MemInfo{
 | 
			
		||||
		MemTotal:  int64(msi.ullTotalPhys),
 | 
			
		||||
		MemFree:   int64(msi.ullAvailPhys),
 | 
			
		||||
		SwapTotal: int64(msi.ullTotalPageFile),
 | 
			
		||||
		SwapFree:  int64(msi.ullAvailPageFile),
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								vendor/github.com/docker/docker/pkg/system/mknod.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/docker/docker/pkg/system/mknod.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,22 +0,0 @@
 | 
			
		||||
// +build !windows
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Mknod creates a filesystem node (file, device special file or named pipe) named path
 | 
			
		||||
// with attributes specified by mode and dev.
 | 
			
		||||
func Mknod(path string, mode uint32, dev int) error {
 | 
			
		||||
	return syscall.Mknod(path, mode, dev)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Mkdev is used to build the value of linux devices (in /dev/) which specifies major
 | 
			
		||||
// and minor number of the newly created device special file.
 | 
			
		||||
// Linux device nodes are a bit weird due to backwards compat with 16 bit device nodes.
 | 
			
		||||
// They are, from low to high: the lower 8 bits of the minor, then 12 bits of the major,
 | 
			
		||||
// then the top 12 bits of the minor.
 | 
			
		||||
func Mkdev(major int64, minor int64) uint32 {
 | 
			
		||||
	return uint32(((minor & 0xfff00) << 12) | ((major & 0xfff) << 8) | (minor & 0xff))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								vendor/github.com/docker/docker/pkg/system/mknod_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/docker/docker/pkg/system/mknod_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,13 +0,0 @@
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
// Mknod is not implemented on Windows.
 | 
			
		||||
func Mknod(path string, mode uint32, dev int) error {
 | 
			
		||||
	return ErrNotSupportedPlatform
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Mkdev is not implemented on Windows.
 | 
			
		||||
func Mkdev(major int64, minor int64) uint32 {
 | 
			
		||||
	panic("Mkdev not implemented on Windows.")
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								vendor/github.com/docker/docker/pkg/system/path_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/docker/docker/pkg/system/path_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,8 +0,0 @@
 | 
			
		||||
// +build !windows
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
// DefaultPathEnv is unix style list of directories to search for
 | 
			
		||||
// executables. Each directory is separated from the next by a colon
 | 
			
		||||
// ':' character .
 | 
			
		||||
const DefaultPathEnv = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
 | 
			
		||||
							
								
								
									
										7
									
								
								vendor/github.com/docker/docker/pkg/system/path_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/docker/docker/pkg/system/path_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,7 +0,0 @@
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
// DefaultPathEnv is deliberately empty on Windows as the default path will be set by
 | 
			
		||||
// the container. Docker has no context of what the default path should be.
 | 
			
		||||
const DefaultPathEnv = ""
 | 
			
		||||
							
								
								
									
										53
									
								
								vendor/github.com/docker/docker/pkg/system/stat.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										53
									
								
								vendor/github.com/docker/docker/pkg/system/stat.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,53 +0,0 @@
 | 
			
		||||
// +build !windows
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// StatT type contains status of a file. It contains metadata
 | 
			
		||||
// like permission, owner, group, size, etc about a file.
 | 
			
		||||
type StatT struct {
 | 
			
		||||
	mode uint32
 | 
			
		||||
	uid  uint32
 | 
			
		||||
	gid  uint32
 | 
			
		||||
	rdev uint64
 | 
			
		||||
	size int64
 | 
			
		||||
	mtim syscall.Timespec
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Mode returns file's permission mode.
 | 
			
		||||
func (s StatT) Mode() uint32 {
 | 
			
		||||
	return s.mode
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UID returns file's user id of owner.
 | 
			
		||||
func (s StatT) UID() uint32 {
 | 
			
		||||
	return s.uid
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GID returns file's group id of owner.
 | 
			
		||||
func (s StatT) GID() uint32 {
 | 
			
		||||
	return s.gid
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Rdev returns file's device ID (if it's special file).
 | 
			
		||||
func (s StatT) Rdev() uint64 {
 | 
			
		||||
	return s.rdev
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Size returns file's size.
 | 
			
		||||
func (s StatT) Size() int64 {
 | 
			
		||||
	return s.size
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Mtim returns file's last modification time.
 | 
			
		||||
func (s StatT) Mtim() syscall.Timespec {
 | 
			
		||||
	return s.mtim
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetLastModification returns file's last modification time.
 | 
			
		||||
func (s StatT) GetLastModification() syscall.Timespec {
 | 
			
		||||
	return s.Mtim()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/github.com/docker/docker/pkg/system/stat_freebsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/docker/docker/pkg/system/stat_freebsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,27 +0,0 @@
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// fromStatT converts a syscall.Stat_t type to a system.Stat_t type
 | 
			
		||||
func fromStatT(s *syscall.Stat_t) (*StatT, error) {
 | 
			
		||||
	return &StatT{size: s.Size,
 | 
			
		||||
		mode: uint32(s.Mode),
 | 
			
		||||
		uid:  s.Uid,
 | 
			
		||||
		gid:  s.Gid,
 | 
			
		||||
		rdev: uint64(s.Rdev),
 | 
			
		||||
		mtim: s.Mtimespec}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Stat takes a path to a file and returns
 | 
			
		||||
// a system.Stat_t type pertaining to that file.
 | 
			
		||||
//
 | 
			
		||||
// Throws an error if the file does not exist
 | 
			
		||||
func Stat(path string) (*StatT, error) {
 | 
			
		||||
	s := &syscall.Stat_t{}
 | 
			
		||||
	if err := syscall.Stat(path, s); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return fromStatT(s)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										33
									
								
								vendor/github.com/docker/docker/pkg/system/stat_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								vendor/github.com/docker/docker/pkg/system/stat_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,33 +0,0 @@
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// fromStatT converts a syscall.Stat_t type to a system.Stat_t type
 | 
			
		||||
func fromStatT(s *syscall.Stat_t) (*StatT, error) {
 | 
			
		||||
	return &StatT{size: s.Size,
 | 
			
		||||
		mode: s.Mode,
 | 
			
		||||
		uid:  s.Uid,
 | 
			
		||||
		gid:  s.Gid,
 | 
			
		||||
		rdev: s.Rdev,
 | 
			
		||||
		mtim: s.Mtim}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FromStatT exists only on linux, and loads a system.StatT from a
 | 
			
		||||
// syscal.Stat_t.
 | 
			
		||||
func FromStatT(s *syscall.Stat_t) (*StatT, error) {
 | 
			
		||||
	return fromStatT(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Stat takes a path to a file and returns
 | 
			
		||||
// a system.StatT type pertaining to that file.
 | 
			
		||||
//
 | 
			
		||||
// Throws an error if the file does not exist
 | 
			
		||||
func Stat(path string) (*StatT, error) {
 | 
			
		||||
	s := &syscall.Stat_t{}
 | 
			
		||||
	if err := syscall.Stat(path, s); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return fromStatT(s)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										15
									
								
								vendor/github.com/docker/docker/pkg/system/stat_openbsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/github.com/docker/docker/pkg/system/stat_openbsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,15 +0,0 @@
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// fromStatT creates a system.StatT type from a syscall.Stat_t type
 | 
			
		||||
func fromStatT(s *syscall.Stat_t) (*StatT, error) {
 | 
			
		||||
	return &StatT{size: s.Size,
 | 
			
		||||
		mode: uint32(s.Mode),
 | 
			
		||||
		uid:  s.Uid,
 | 
			
		||||
		gid:  s.Gid,
 | 
			
		||||
		rdev: uint64(s.Rdev),
 | 
			
		||||
		mtim: s.Mtim}, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								vendor/github.com/docker/docker/pkg/system/stat_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/docker/docker/pkg/system/stat_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,17 +0,0 @@
 | 
			
		||||
// +build solaris
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// fromStatT creates a system.StatT type from a syscall.Stat_t type
 | 
			
		||||
func fromStatT(s *syscall.Stat_t) (*StatT, error) {
 | 
			
		||||
	return &StatT{size: s.Size,
 | 
			
		||||
		mode: uint32(s.Mode),
 | 
			
		||||
		uid:  s.Uid,
 | 
			
		||||
		gid:  s.Gid,
 | 
			
		||||
		rdev: uint64(s.Rdev),
 | 
			
		||||
		mtim: s.Mtim}, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								vendor/github.com/docker/docker/pkg/system/stat_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/docker/docker/pkg/system/stat_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,17 +0,0 @@
 | 
			
		||||
// +build !linux,!windows,!freebsd,!solaris,!openbsd
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// fromStatT creates a system.StatT type from a syscall.Stat_t type
 | 
			
		||||
func fromStatT(s *syscall.Stat_t) (*StatT, error) {
 | 
			
		||||
	return &StatT{size: s.Size,
 | 
			
		||||
		mode: uint32(s.Mode),
 | 
			
		||||
		uid:  s.Uid,
 | 
			
		||||
		gid:  s.Gid,
 | 
			
		||||
		rdev: uint64(s.Rdev),
 | 
			
		||||
		mtim: s.Mtimespec}, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										43
									
								
								vendor/github.com/docker/docker/pkg/system/stat_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										43
									
								
								vendor/github.com/docker/docker/pkg/system/stat_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,43 +0,0 @@
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// StatT type contains status of a file. It contains metadata
 | 
			
		||||
// like name, permission, size, etc about a file.
 | 
			
		||||
type StatT struct {
 | 
			
		||||
	name    string
 | 
			
		||||
	size    int64
 | 
			
		||||
	mode    os.FileMode
 | 
			
		||||
	modTime time.Time
 | 
			
		||||
	isDir   bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Name returns file's name.
 | 
			
		||||
func (s StatT) Name() string {
 | 
			
		||||
	return s.name
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Size returns file's size.
 | 
			
		||||
func (s StatT) Size() int64 {
 | 
			
		||||
	return s.size
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Mode returns file's permission mode.
 | 
			
		||||
func (s StatT) Mode() os.FileMode {
 | 
			
		||||
	return s.mode
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ModTime returns file's last modification time.
 | 
			
		||||
func (s StatT) ModTime() time.Time {
 | 
			
		||||
	return s.modTime
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsDir returns whether file is actually a directory.
 | 
			
		||||
func (s StatT) IsDir() bool {
 | 
			
		||||
	return s.isDir
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								vendor/github.com/docker/docker/pkg/system/syscall_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/docker/docker/pkg/system/syscall_unix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,17 +0,0 @@
 | 
			
		||||
// +build linux freebsd
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import "syscall"
 | 
			
		||||
 | 
			
		||||
// Unmount is a platform-specific helper function to call
 | 
			
		||||
// the unmount syscall.
 | 
			
		||||
func Unmount(dest string) error {
 | 
			
		||||
	return syscall.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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										60
									
								
								vendor/github.com/docker/docker/pkg/system/syscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										60
									
								
								vendor/github.com/docker/docker/pkg/system/syscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,60 +0,0 @@
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// OSVersion is a wrapper for Windows version information
 | 
			
		||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx
 | 
			
		||||
type OSVersion struct {
 | 
			
		||||
	Version      uint32
 | 
			
		||||
	MajorVersion uint8
 | 
			
		||||
	MinorVersion uint8
 | 
			
		||||
	Build        uint16
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetOSVersion gets the operating system version on Windows. Note that
 | 
			
		||||
// docker.exe must be manifested to get the correct version information.
 | 
			
		||||
func GetOSVersion() (OSVersion, error) {
 | 
			
		||||
	var err error
 | 
			
		||||
	osv := OSVersion{}
 | 
			
		||||
	osv.Version, err = syscall.GetVersion()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return osv, fmt.Errorf("Failed to call GetVersion()")
 | 
			
		||||
	}
 | 
			
		||||
	osv.MajorVersion = uint8(osv.Version & 0xFF)
 | 
			
		||||
	osv.MinorVersion = uint8(osv.Version >> 8 & 0xFF)
 | 
			
		||||
	osv.Build = uint16(osv.Version >> 16)
 | 
			
		||||
	return osv, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Unmount is a platform-specific helper function to call
 | 
			
		||||
// the unmount syscall. Not supported on Windows
 | 
			
		||||
func Unmount(dest 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 := syscall.UTF16PtrFromString(commandLine)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	argv, err := syscall.CommandLineToArgv(argsPtr, &argc)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	defer syscall.LocalFree(syscall.Handle(uintptr(unsafe.Pointer(argv))))
 | 
			
		||||
 | 
			
		||||
	newArgs := make([]string, argc)
 | 
			
		||||
	for i, v := range (*argv)[:argc] {
 | 
			
		||||
		newArgs[i] = string(syscall.UTF16ToString((*v)[:]))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return newArgs, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								vendor/github.com/docker/docker/pkg/system/umask.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/docker/docker/pkg/system/umask.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,13 +0,0 @@
 | 
			
		||||
// +build !windows
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Umask sets current process's file mode creation mask to newmask
 | 
			
		||||
// and return oldmask.
 | 
			
		||||
func Umask(newmask int) (oldmask int, err error) {
 | 
			
		||||
	return syscall.Umask(newmask), nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								vendor/github.com/docker/docker/pkg/system/umask_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/docker/docker/pkg/system/umask_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,9 +0,0 @@
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
// Umask is not supported on the windows platform.
 | 
			
		||||
func Umask(newmask int) (oldmask int, err error) {
 | 
			
		||||
	// should not be called on cli code path
 | 
			
		||||
	return 0, ErrNotSupportedPlatform
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								vendor/github.com/docker/docker/pkg/system/utimes_darwin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/docker/docker/pkg/system/utimes_darwin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,8 +0,0 @@
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import "syscall"
 | 
			
		||||
 | 
			
		||||
// LUtimesNano is not supported by darwin platform.
 | 
			
		||||
func LUtimesNano(path string, ts []syscall.Timespec) error {
 | 
			
		||||
	return ErrNotSupportedPlatform
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,22 +0,0 @@
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// LUtimesNano is used to change access and modification time of the specified path.
 | 
			
		||||
// It's used for symbol link file because syscall.UtimesNano doesn't support a NOFOLLOW flag atm.
 | 
			
		||||
func LUtimesNano(path string, ts []syscall.Timespec) error {
 | 
			
		||||
	var _path *byte
 | 
			
		||||
	_path, err := syscall.BytePtrFromString(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if _, _, err := syscall.Syscall(syscall.SYS_LUTIMES, uintptr(unsafe.Pointer(_path)), uintptr(unsafe.Pointer(&ts[0])), 0); err != 0 && err != syscall.ENOSYS {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										26
									
								
								vendor/github.com/docker/docker/pkg/system/utimes_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/docker/docker/pkg/system/utimes_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,26 +0,0 @@
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// LUtimesNano is used to change access and modification time of the specified path.
 | 
			
		||||
// It's used for symbol link file because syscall.UtimesNano doesn't support a NOFOLLOW flag atm.
 | 
			
		||||
func LUtimesNano(path string, ts []syscall.Timespec) error {
 | 
			
		||||
	// These are not currently available in syscall
 | 
			
		||||
	atFdCwd := -100
 | 
			
		||||
	atSymLinkNoFollow := 0x100
 | 
			
		||||
 | 
			
		||||
	var _path *byte
 | 
			
		||||
	_path, err := syscall.BytePtrFromString(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if _, _, err := syscall.Syscall6(syscall.SYS_UTIMENSAT, uintptr(atFdCwd), uintptr(unsafe.Pointer(_path)), uintptr(unsafe.Pointer(&ts[0])), uintptr(atSymLinkNoFollow), 0, 0); err != 0 && err != syscall.ENOSYS {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,10 +0,0 @@
 | 
			
		||||
// +build !linux,!freebsd,!darwin
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import "syscall"
 | 
			
		||||
 | 
			
		||||
// LUtimesNano is not supported on platforms other than linux, freebsd and darwin.
 | 
			
		||||
func LUtimesNano(path string, ts []syscall.Timespec) error {
 | 
			
		||||
	return ErrNotSupportedPlatform
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										63
									
								
								vendor/github.com/docker/docker/pkg/system/xattrs_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										63
									
								
								vendor/github.com/docker/docker/pkg/system/xattrs_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,63 +0,0 @@
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Lgetxattr retrieves the value of the extended attribute identified by attr
 | 
			
		||||
// and associated with the given path in the file system.
 | 
			
		||||
// It will returns a nil slice and nil error if the xattr is not set.
 | 
			
		||||
func Lgetxattr(path string, attr string) ([]byte, error) {
 | 
			
		||||
	pathBytes, err := syscall.BytePtrFromString(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	attrBytes, err := syscall.BytePtrFromString(attr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dest := make([]byte, 128)
 | 
			
		||||
	destBytes := unsafe.Pointer(&dest[0])
 | 
			
		||||
	sz, _, errno := syscall.Syscall6(syscall.SYS_LGETXATTR, uintptr(unsafe.Pointer(pathBytes)), uintptr(unsafe.Pointer(attrBytes)), uintptr(destBytes), uintptr(len(dest)), 0, 0)
 | 
			
		||||
	if errno == syscall.ENODATA {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
	if errno == syscall.ERANGE {
 | 
			
		||||
		dest = make([]byte, sz)
 | 
			
		||||
		destBytes := unsafe.Pointer(&dest[0])
 | 
			
		||||
		sz, _, errno = syscall.Syscall6(syscall.SYS_LGETXATTR, uintptr(unsafe.Pointer(pathBytes)), uintptr(unsafe.Pointer(attrBytes)), uintptr(destBytes), uintptr(len(dest)), 0, 0)
 | 
			
		||||
	}
 | 
			
		||||
	if errno != 0 {
 | 
			
		||||
		return nil, errno
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return dest[:sz], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _zero uintptr
 | 
			
		||||
 | 
			
		||||
// Lsetxattr sets the value of the extended attribute identified by attr
 | 
			
		||||
// and associated with the given path in the file system.
 | 
			
		||||
func Lsetxattr(path string, attr string, data []byte, flags int) error {
 | 
			
		||||
	pathBytes, err := syscall.BytePtrFromString(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	attrBytes, err := syscall.BytePtrFromString(attr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	var dataBytes unsafe.Pointer
 | 
			
		||||
	if len(data) > 0 {
 | 
			
		||||
		dataBytes = unsafe.Pointer(&data[0])
 | 
			
		||||
	} else {
 | 
			
		||||
		dataBytes = unsafe.Pointer(&_zero)
 | 
			
		||||
	}
 | 
			
		||||
	_, _, errno := syscall.Syscall6(syscall.SYS_LSETXATTR, uintptr(unsafe.Pointer(pathBytes)), uintptr(unsafe.Pointer(attrBytes)), uintptr(dataBytes), uintptr(len(data)), uintptr(flags), 0)
 | 
			
		||||
	if errno != 0 {
 | 
			
		||||
		return errno
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,13 +0,0 @@
 | 
			
		||||
// +build !linux
 | 
			
		||||
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
// Lgetxattr is not supported on platforms other than linux.
 | 
			
		||||
func Lgetxattr(path string, attr string) ([]byte, error) {
 | 
			
		||||
	return nil, ErrNotSupportedPlatform
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Lsetxattr is not supported on platforms other than linux.
 | 
			
		||||
func Lsetxattr(path string, attr string, data []byte, flags int) error {
 | 
			
		||||
	return ErrNotSupportedPlatform
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										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 (
 | 
			
		||||
	"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, byte(key[0]))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return codes, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/github.com/docker/docker/pkg/term/tc_linux_cgo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/docker/docker/pkg/term/tc_linux_cgo.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -10,9 +10,6 @@ import (
 | 
			
		||||
// #include <termios.h>
 | 
			
		||||
import "C"
 | 
			
		||||
 | 
			
		||||
// Termios is the Unix API for terminal I/O.
 | 
			
		||||
// It is passthgrouh for syscall.Termios in order to make it portable with
 | 
			
		||||
// other platforms where it is not available or handled differently.
 | 
			
		||||
type Termios syscall.Termios
 | 
			
		||||
 | 
			
		||||
// MakeRaw put the terminal connected to the given file descriptor into raw
 | 
			
		||||
@@ -27,6 +24,7 @@ func MakeRaw(fd uintptr) (*State, error) {
 | 
			
		||||
	newState := oldState.termios
 | 
			
		||||
 | 
			
		||||
	C.cfmakeraw((*C.struct_termios)(unsafe.Pointer(&newState)))
 | 
			
		||||
	newState.Oflag = newState.Oflag | C.OPOST
 | 
			
		||||
	if err := tcset(fd, &newState); err != 0 {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								vendor/github.com/docker/docker/pkg/term/term.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/docker/docker/pkg/term/term.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,7 +1,5 @@
 | 
			
		||||
// +build !windows
 | 
			
		||||
 | 
			
		||||
// Package term provides provides structures and helper functions to work with
 | 
			
		||||
// terminal (state, sizes).
 | 
			
		||||
package term
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -14,16 +12,13 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
@@ -31,12 +26,10 @@ type Winsize struct {
 | 
			
		||||
	y      uint16
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StdStreams returns the standard streams (stdin, stdout, stedrr).
 | 
			
		||||
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
 | 
			
		||||
@@ -47,21 +40,19 @@ func GetFdInfo(in interface{}) (uintptr, bool) {
 | 
			
		||||
	return inFd, isTerminalIn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetWinsize returns the window size based on the specified file descriptor.
 | 
			
		||||
func GetWinsize(fd uintptr) (*Winsize, error) {
 | 
			
		||||
	ws := &Winsize{}
 | 
			
		||||
	_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(ws)))
 | 
			
		||||
	// Skip errno = 0
 | 
			
		||||
	// Skipp errno = 0
 | 
			
		||||
	if err == 0 {
 | 
			
		||||
		return ws, nil
 | 
			
		||||
	}
 | 
			
		||||
	return ws, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetWinsize tries to set the specified window size for the specified file descriptor.
 | 
			
		||||
func SetWinsize(fd uintptr, ws *Winsize) error {
 | 
			
		||||
	_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCSWINSZ), uintptr(unsafe.Pointer(ws)))
 | 
			
		||||
	// Skip errno = 0
 | 
			
		||||
	// Skipp errno = 0
 | 
			
		||||
	if err == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
@@ -74,8 +65,8 @@ func IsTerminal(fd uintptr) bool {
 | 
			
		||||
	return tcget(fd, &termios) == 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RestoreTerminal restores the terminal connected to the given file descriptor
 | 
			
		||||
// to a previous state.
 | 
			
		||||
// Restore 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
 | 
			
		||||
@@ -86,7 +77,6 @@ func RestoreTerminal(fd uintptr, state *State) error {
 | 
			
		||||
	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 {
 | 
			
		||||
@@ -96,8 +86,6 @@ func SaveState(fd uintptr) (*State, error) {
 | 
			
		||||
	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 &^= syscall.ECHO
 | 
			
		||||
@@ -109,8 +97,6 @@ func DisableEcho(fd uintptr, state *State) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetRawTerminal puts the terminal connected to the given file descriptor into
 | 
			
		||||
// raw mode and returns the previous state.
 | 
			
		||||
func SetRawTerminal(fd uintptr) (*State, error) {
 | 
			
		||||
	oldState, err := MakeRaw(fd)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -127,5 +113,6 @@ func handleInterrupt(fd uintptr, state *State) {
 | 
			
		||||
	go func() {
 | 
			
		||||
		_ = <-sigchan
 | 
			
		||||
		RestoreTerminal(fd, state)
 | 
			
		||||
		os.Exit(0)
 | 
			
		||||
	}()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										262
									
								
								vendor/github.com/docker/docker/pkg/term/term_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										262
									
								
								vendor/github.com/docker/docker/pkg/term/term_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -5,18 +5,14 @@ package term
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"os/signal"
 | 
			
		||||
	"syscall"
 | 
			
		||||
 | 
			
		||||
	"github.com/Azure/go-ansiterm/winterm"
 | 
			
		||||
	"github.com/docker/docker/pkg/system"
 | 
			
		||||
	"github.com/docker/docker/pkg/term/windows"
 | 
			
		||||
	"github.com/Sirupsen/logrus"
 | 
			
		||||
	"github.com/docker/docker/pkg/term/winconsole"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// State holds the console mode for the terminal.
 | 
			
		||||
type State struct {
 | 
			
		||||
	inMode, outMode     uint32
 | 
			
		||||
	inHandle, outHandle syscall.Handle
 | 
			
		||||
	mode uint32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Winsize is used for window size.
 | 
			
		||||
@@ -27,279 +23,117 @@ type Winsize struct {
 | 
			
		||||
	y      uint16
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// https://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx
 | 
			
		||||
	enableVirtualTerminalInput      = 0x0200
 | 
			
		||||
	enableVirtualTerminalProcessing = 0x0004
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// usingNativeConsole is true if we are using the Windows native console
 | 
			
		||||
var usingNativeConsole bool
 | 
			
		||||
 | 
			
		||||
// StdStreams returns the standard streams (stdin, stdout, stedrr).
 | 
			
		||||
func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) {
 | 
			
		||||
	switch {
 | 
			
		||||
	case os.Getenv("ConEmuANSI") == "ON":
 | 
			
		||||
		// The ConEmu terminal emulates ANSI on output streams well.
 | 
			
		||||
		return windows.ConEmuStreams()
 | 
			
		||||
		// The ConEmu shell emulates ANSI well by default.
 | 
			
		||||
		return os.Stdin, os.Stdout, os.Stderr
 | 
			
		||||
	case os.Getenv("MSYSTEM") != "":
 | 
			
		||||
		// MSYS (mingw) does not emulate ANSI well.
 | 
			
		||||
		return windows.ConsoleStreams()
 | 
			
		||||
		return winconsole.WinConsoleStreams()
 | 
			
		||||
	default:
 | 
			
		||||
		if useNativeConsole() {
 | 
			
		||||
			usingNativeConsole = true
 | 
			
		||||
			return os.Stdin, os.Stdout, os.Stderr
 | 
			
		||||
		}
 | 
			
		||||
		return windows.ConsoleStreams()
 | 
			
		||||
		return winconsole.WinConsoleStreams()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// useNativeConsole determines if the docker client should use the built-in
 | 
			
		||||
// console which supports ANSI emulation, or fall-back to the golang emulator
 | 
			
		||||
// (github.com/azure/go-ansiterm).
 | 
			
		||||
func useNativeConsole() bool {
 | 
			
		||||
	osv, err := system.GetOSVersion()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Native console is not available before major version 10
 | 
			
		||||
	if osv.MajorVersion < 10 {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Must have a late pre-release TP4 build of Windows Server 2016/Windows 10 TH2 or later
 | 
			
		||||
	if osv.Build < 10578 {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Get the console modes. If this fails, we can't use the native console
 | 
			
		||||
	state, err := getNativeConsole()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Probe the console to see if it can be enabled.
 | 
			
		||||
	if nil != probeNativeConsole(state) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Environment variable override
 | 
			
		||||
	if e := os.Getenv("USE_NATIVE_CONSOLE"); e != "" {
 | 
			
		||||
		if e == "1" {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO Windows. The native emulator still has issues which
 | 
			
		||||
	// mean it shouldn't be enabled for everyone. Change this next line to true
 | 
			
		||||
	// to change the default to "enable if available". In the meantime, users
 | 
			
		||||
	// can still try it out by using USE_NATIVE_CONSOLE env variable.
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getNativeConsole returns the console modes ('state') for the native Windows console
 | 
			
		||||
func getNativeConsole() (State, error) {
 | 
			
		||||
	var (
 | 
			
		||||
		err   error
 | 
			
		||||
		state State
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	// Get the handle to stdout
 | 
			
		||||
	if state.outHandle, err = syscall.GetStdHandle(syscall.STD_OUTPUT_HANDLE); err != nil {
 | 
			
		||||
		return state, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Get the console mode from the consoles stdout handle
 | 
			
		||||
	if err = syscall.GetConsoleMode(state.outHandle, &state.outMode); err != nil {
 | 
			
		||||
		return state, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Get the handle to stdin
 | 
			
		||||
	if state.inHandle, err = syscall.GetStdHandle(syscall.STD_INPUT_HANDLE); err != nil {
 | 
			
		||||
		return state, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Get the console mode from the consoles stdin handle
 | 
			
		||||
	if err = syscall.GetConsoleMode(state.inHandle, &state.inMode); err != nil {
 | 
			
		||||
		return state, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return state, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// probeNativeConsole probes the console to determine if native can be supported,
 | 
			
		||||
func probeNativeConsole(state State) error {
 | 
			
		||||
	if err := winterm.SetConsoleMode(uintptr(state.outHandle), state.outMode|enableVirtualTerminalProcessing); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer winterm.SetConsoleMode(uintptr(state.outHandle), state.outMode)
 | 
			
		||||
 | 
			
		||||
	if err := winterm.SetConsoleMode(uintptr(state.inHandle), state.inMode|enableVirtualTerminalInput); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer winterm.SetConsoleMode(uintptr(state.inHandle), state.inMode)
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// enableNativeConsole turns on native console mode
 | 
			
		||||
func enableNativeConsole(state State) error {
 | 
			
		||||
	if err := winterm.SetConsoleMode(uintptr(state.outHandle), state.outMode|enableVirtualTerminalProcessing); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := winterm.SetConsoleMode(uintptr(state.inHandle), state.inMode|enableVirtualTerminalInput); err != nil {
 | 
			
		||||
		winterm.SetConsoleMode(uintptr(state.outHandle), state.outMode) // restore out if we can
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// disableNativeConsole turns off native console mode
 | 
			
		||||
func disableNativeConsole(state *State) error {
 | 
			
		||||
	// Try and restore both in an out before error checking.
 | 
			
		||||
	errout := winterm.SetConsoleMode(uintptr(state.outHandle), state.outMode)
 | 
			
		||||
	errin := winterm.SetConsoleMode(uintptr(state.inHandle), state.inMode)
 | 
			
		||||
	if errout != nil {
 | 
			
		||||
		return errout
 | 
			
		||||
	}
 | 
			
		||||
	if errin != nil {
 | 
			
		||||
		return errin
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetFdInfo returns the file descriptor for an os.File and indicates whether the file represents a terminal.
 | 
			
		||||
// GetFdInfo returns file descriptor and bool indicating whether the file is a terminal.
 | 
			
		||||
func GetFdInfo(in interface{}) (uintptr, bool) {
 | 
			
		||||
	return windows.GetHandleInfo(in)
 | 
			
		||||
	return winconsole.GetHandleInfo(in)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetWinsize returns the window size based on the specified file descriptor.
 | 
			
		||||
// GetWinsize retrieves the window size of the terminal connected to the passed file descriptor.
 | 
			
		||||
func GetWinsize(fd uintptr) (*Winsize, error) {
 | 
			
		||||
	info, err := winterm.GetConsoleScreenBufferInfo(fd)
 | 
			
		||||
	info, err := winconsole.GetConsoleScreenBufferInfo(fd)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	winsize := &Winsize{
 | 
			
		||||
	// TODO(azlinux): Set the pixel width / height of the console (currently unused by any caller)
 | 
			
		||||
	return &Winsize{
 | 
			
		||||
		Width:  uint16(info.Window.Right - info.Window.Left + 1),
 | 
			
		||||
		Height: uint16(info.Window.Bottom - info.Window.Top + 1),
 | 
			
		||||
		x:      0,
 | 
			
		||||
		y:      0}
 | 
			
		||||
		y:      0}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	return winsize, nil
 | 
			
		||||
// SetWinsize sets the size of the given terminal connected to the passed file descriptor.
 | 
			
		||||
func SetWinsize(fd uintptr, ws *Winsize) error {
 | 
			
		||||
	// TODO(azlinux): Implement SetWinsize
 | 
			
		||||
	logrus.Debugf("[windows] SetWinsize: WARNING -- Unsupported method invoked")
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsTerminal returns true if the given file descriptor is a terminal.
 | 
			
		||||
func IsTerminal(fd uintptr) bool {
 | 
			
		||||
	return windows.IsConsole(fd)
 | 
			
		||||
	return winconsole.IsConsole(fd)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RestoreTerminal restores the terminal connected to the given file descriptor
 | 
			
		||||
// to a previous state.
 | 
			
		||||
// RestoreTerminal restores the terminal connected to the given file descriptor to a
 | 
			
		||||
// previous state.
 | 
			
		||||
func RestoreTerminal(fd uintptr, state *State) error {
 | 
			
		||||
	if usingNativeConsole {
 | 
			
		||||
		return disableNativeConsole(state)
 | 
			
		||||
	}
 | 
			
		||||
	return winterm.SetConsoleMode(fd, state.outMode)
 | 
			
		||||
	return winconsole.SetConsoleMode(fd, state.mode)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SaveState saves the state of the terminal connected to the given file descriptor.
 | 
			
		||||
func SaveState(fd uintptr) (*State, error) {
 | 
			
		||||
	if usingNativeConsole {
 | 
			
		||||
		state, err := getNativeConsole()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		return &state, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mode, e := winterm.GetConsoleMode(fd)
 | 
			
		||||
	mode, e := winconsole.GetConsoleMode(fd)
 | 
			
		||||
	if e != nil {
 | 
			
		||||
		return nil, e
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &State{outMode: mode}, nil
 | 
			
		||||
	return &State{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
 | 
			
		||||
// -- See http://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx
 | 
			
		||||
func DisableEcho(fd uintptr, state *State) error {
 | 
			
		||||
	mode := state.inMode
 | 
			
		||||
	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
 | 
			
		||||
	mode := state.mode
 | 
			
		||||
	mode &^= winconsole.ENABLE_ECHO_INPUT
 | 
			
		||||
	mode |= winconsole.ENABLE_PROCESSED_INPUT | winconsole.ENABLE_LINE_INPUT
 | 
			
		||||
	// TODO(azlinux): Core code registers a goroutine to catch os.Interrupt and reset the terminal state.
 | 
			
		||||
	return winconsole.SetConsoleMode(fd, mode)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetRawTerminal puts the terminal connected to the given file descriptor into raw
 | 
			
		||||
// mode and returns the previous state.
 | 
			
		||||
// mode and returns the previous state of the terminal so that it can be
 | 
			
		||||
// restored.
 | 
			
		||||
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)
 | 
			
		||||
	// TODO(azlinux): Core code registers a goroutine to catch os.Interrupt and reset the terminal state.
 | 
			
		||||
	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.
 | 
			
		||||
// MakeRaw puts 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) {
 | 
			
		||||
	state, err := SaveState(fd)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mode := state.inMode
 | 
			
		||||
	if usingNativeConsole {
 | 
			
		||||
		if err := enableNativeConsole(*state); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		mode |= enableVirtualTerminalInput
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 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
 | 
			
		||||
	mode := state.mode
 | 
			
		||||
 | 
			
		||||
	// 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
 | 
			
		||||
	mode &^= winconsole.ENABLE_ECHO_INPUT
 | 
			
		||||
	mode &^= winconsole.ENABLE_LINE_INPUT
 | 
			
		||||
	mode &^= winconsole.ENABLE_MOUSE_INPUT
 | 
			
		||||
	mode &^= winconsole.ENABLE_WINDOW_INPUT
 | 
			
		||||
	mode &^= winconsole.ENABLE_PROCESSED_INPUT
 | 
			
		||||
 | 
			
		||||
	// Enable these modes
 | 
			
		||||
	mode |= winterm.ENABLE_EXTENDED_FLAGS
 | 
			
		||||
	mode |= winterm.ENABLE_INSERT_MODE
 | 
			
		||||
	mode |= winterm.ENABLE_QUICK_EDIT_MODE
 | 
			
		||||
	mode |= winconsole.ENABLE_EXTENDED_FLAGS
 | 
			
		||||
	mode |= winconsole.ENABLE_INSERT_MODE
 | 
			
		||||
	mode |= winconsole.ENABLE_QUICK_EDIT_MODE
 | 
			
		||||
 | 
			
		||||
	err = winterm.SetConsoleMode(fd, mode)
 | 
			
		||||
	err = winconsole.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)
 | 
			
		||||
	}()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/github.com/docker/docker/pkg/term/termios_darwin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/docker/docker/pkg/term/termios_darwin.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -8,10 +8,7 @@ import (
 | 
			
		||||
const (
 | 
			
		||||
	getTermios = syscall.TIOCGETA
 | 
			
		||||
	setTermios = syscall.TIOCSETA
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Termios magic numbers, passthrough to the ones defined in syscall.
 | 
			
		||||
const (
 | 
			
		||||
	IGNBRK = syscall.IGNBRK
 | 
			
		||||
	PARMRK = syscall.PARMRK
 | 
			
		||||
	INLCR  = syscall.INLCR
 | 
			
		||||
@@ -32,7 +29,6 @@ const (
 | 
			
		||||
	IEXTEN = syscall.IEXTEN
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Termios is the Unix API for terminal I/O.
 | 
			
		||||
type Termios struct {
 | 
			
		||||
	Iflag  uint64
 | 
			
		||||
	Oflag  uint64
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								vendor/github.com/docker/docker/pkg/term/termios_freebsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/docker/docker/pkg/term/termios_freebsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -8,10 +8,7 @@ import (
 | 
			
		||||
const (
 | 
			
		||||
	getTermios = syscall.TIOCGETA
 | 
			
		||||
	setTermios = syscall.TIOCSETA
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Termios magic numbers, passthrough to the ones defined in syscall.
 | 
			
		||||
const (
 | 
			
		||||
	IGNBRK = syscall.IGNBRK
 | 
			
		||||
	PARMRK = syscall.PARMRK
 | 
			
		||||
	INLCR  = syscall.INLCR
 | 
			
		||||
@@ -32,7 +29,6 @@ const (
 | 
			
		||||
	IEXTEN = syscall.IEXTEN
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Termios is the Unix API for terminal I/O.
 | 
			
		||||
type Termios struct {
 | 
			
		||||
	Iflag  uint32
 | 
			
		||||
	Oflag  uint32
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/docker/docker/pkg/term/termios_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/docker/docker/pkg/term/termios_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -12,7 +12,6 @@ const (
 | 
			
		||||
	setTermios = syscall.TCSETS
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Termios is the Unix API for terminal I/O.
 | 
			
		||||
type Termios struct {
 | 
			
		||||
	Iflag  uint32
 | 
			
		||||
	Oflag  uint32
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										69
									
								
								vendor/github.com/docker/docker/pkg/term/termios_openbsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										69
									
								
								vendor/github.com/docker/docker/pkg/term/termios_openbsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,69 +0,0 @@
 | 
			
		||||
package term
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	getTermios = syscall.TIOCGETA
 | 
			
		||||
	setTermios = syscall.TIOCSETA
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Termios magic numbers, passthrough to the ones defined in syscall.
 | 
			
		||||
const (
 | 
			
		||||
	IGNBRK = syscall.IGNBRK
 | 
			
		||||
	PARMRK = syscall.PARMRK
 | 
			
		||||
	INLCR  = syscall.INLCR
 | 
			
		||||
	IGNCR  = syscall.IGNCR
 | 
			
		||||
	ECHONL = syscall.ECHONL
 | 
			
		||||
	CSIZE  = syscall.CSIZE
 | 
			
		||||
	ICRNL  = syscall.ICRNL
 | 
			
		||||
	ISTRIP = syscall.ISTRIP
 | 
			
		||||
	PARENB = syscall.PARENB
 | 
			
		||||
	ECHO   = syscall.ECHO
 | 
			
		||||
	ICANON = syscall.ICANON
 | 
			
		||||
	ISIG   = syscall.ISIG
 | 
			
		||||
	IXON   = syscall.IXON
 | 
			
		||||
	BRKINT = syscall.BRKINT
 | 
			
		||||
	INPCK  = syscall.INPCK
 | 
			
		||||
	OPOST  = syscall.OPOST
 | 
			
		||||
	CS8    = syscall.CS8
 | 
			
		||||
	IEXTEN = syscall.IEXTEN
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Termios is the Unix API for terminal I/O.
 | 
			
		||||
type Termios struct {
 | 
			
		||||
	Iflag  uint32
 | 
			
		||||
	Oflag  uint32
 | 
			
		||||
	Cflag  uint32
 | 
			
		||||
	Lflag  uint32
 | 
			
		||||
	Cc     [20]byte
 | 
			
		||||
	Ispeed uint32
 | 
			
		||||
	Ospeed uint32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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 := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(getTermios), uintptr(unsafe.Pointer(&oldState.termios))); err != 0 {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newState := oldState.termios
 | 
			
		||||
	newState.Iflag &^= (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON)
 | 
			
		||||
	newState.Oflag &^= OPOST
 | 
			
		||||
	newState.Lflag &^= (ECHO | ECHONL | ICANON | ISIG | IEXTEN)
 | 
			
		||||
	newState.Cflag &^= (CSIZE | PARENB)
 | 
			
		||||
	newState.Cflag |= CS8
 | 
			
		||||
	newState.Cc[syscall.VMIN] = 1
 | 
			
		||||
	newState.Cc[syscall.VTIME] = 0
 | 
			
		||||
 | 
			
		||||
	if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(setTermios), uintptr(unsafe.Pointer(&newState))); err != 0 {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &oldState, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1053
									
								
								vendor/github.com/docker/docker/pkg/term/winconsole/console_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1053
									
								
								vendor/github.com/docker/docker/pkg/term/winconsole/console_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										234
									
								
								vendor/github.com/docker/docker/pkg/term/winconsole/term_emulator.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										234
									
								
								vendor/github.com/docker/docker/pkg/term/winconsole/term_emulator.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,234 @@
 | 
			
		||||
package winconsole
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// http://manpages.ubuntu.com/manpages/intrepid/man4/console_codes.4.html
 | 
			
		||||
const (
 | 
			
		||||
	ANSI_ESCAPE_PRIMARY   = 0x1B
 | 
			
		||||
	ANSI_ESCAPE_SECONDARY = 0x5B
 | 
			
		||||
	ANSI_COMMAND_FIRST    = 0x40
 | 
			
		||||
	ANSI_COMMAND_LAST     = 0x7E
 | 
			
		||||
	ANSI_PARAMETER_SEP    = ";"
 | 
			
		||||
	ANSI_CMD_G0           = '('
 | 
			
		||||
	ANSI_CMD_G1           = ')'
 | 
			
		||||
	ANSI_CMD_G2           = '*'
 | 
			
		||||
	ANSI_CMD_G3           = '+'
 | 
			
		||||
	ANSI_CMD_DECPNM       = '>'
 | 
			
		||||
	ANSI_CMD_DECPAM       = '='
 | 
			
		||||
	ANSI_CMD_OSC          = ']'
 | 
			
		||||
	ANSI_CMD_STR_TERM     = '\\'
 | 
			
		||||
	ANSI_BEL              = 0x07
 | 
			
		||||
	KEY_EVENT             = 1
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Interface that implements terminal handling
 | 
			
		||||
type terminalEmulator interface {
 | 
			
		||||
	HandleOutputCommand(fd uintptr, command []byte) (n int, err error)
 | 
			
		||||
	HandleInputSequence(fd uintptr, command []byte) (n int, err error)
 | 
			
		||||
	WriteChars(fd uintptr, w io.Writer, p []byte) (n int, err error)
 | 
			
		||||
	ReadChars(fd uintptr, w io.Reader, p []byte) (n int, err error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type terminalWriter struct {
 | 
			
		||||
	wrappedWriter io.Writer
 | 
			
		||||
	emulator      terminalEmulator
 | 
			
		||||
	command       []byte
 | 
			
		||||
	inSequence    bool
 | 
			
		||||
	fd            uintptr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type terminalReader struct {
 | 
			
		||||
	wrappedReader io.ReadCloser
 | 
			
		||||
	emulator      terminalEmulator
 | 
			
		||||
	command       []byte
 | 
			
		||||
	inSequence    bool
 | 
			
		||||
	fd            uintptr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// http://manpages.ubuntu.com/manpages/intrepid/man4/console_codes.4.html
 | 
			
		||||
func isAnsiCommandChar(b byte) bool {
 | 
			
		||||
	switch {
 | 
			
		||||
	case ANSI_COMMAND_FIRST <= b && b <= ANSI_COMMAND_LAST && b != ANSI_ESCAPE_SECONDARY:
 | 
			
		||||
		return true
 | 
			
		||||
	case b == ANSI_CMD_G1 || b == ANSI_CMD_OSC || b == ANSI_CMD_DECPAM || b == ANSI_CMD_DECPNM:
 | 
			
		||||
		// non-CSI escape sequence terminator
 | 
			
		||||
		return true
 | 
			
		||||
	case b == ANSI_CMD_STR_TERM || b == ANSI_BEL:
 | 
			
		||||
		// String escape sequence terminator
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isCharacterSelectionCmdChar(b byte) bool {
 | 
			
		||||
	return (b == ANSI_CMD_G0 || b == ANSI_CMD_G1 || b == ANSI_CMD_G2 || b == ANSI_CMD_G3)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isXtermOscSequence(command []byte, current byte) bool {
 | 
			
		||||
	return (len(command) >= 2 && command[0] == ANSI_ESCAPE_PRIMARY && command[1] == ANSI_CMD_OSC && current != ANSI_BEL)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Write writes len(p) bytes from p to the underlying data stream.
 | 
			
		||||
// http://golang.org/pkg/io/#Writer
 | 
			
		||||
func (tw *terminalWriter) Write(p []byte) (n int, err error) {
 | 
			
		||||
	if len(p) == 0 {
 | 
			
		||||
		return 0, nil
 | 
			
		||||
	}
 | 
			
		||||
	if tw.emulator == nil {
 | 
			
		||||
		return tw.wrappedWriter.Write(p)
 | 
			
		||||
	}
 | 
			
		||||
	// Emulate terminal by extracting commands and executing them
 | 
			
		||||
	totalWritten := 0
 | 
			
		||||
	start := 0 // indicates start of the next chunk
 | 
			
		||||
	end := len(p)
 | 
			
		||||
	for current := 0; current < end; current++ {
 | 
			
		||||
		if tw.inSequence {
 | 
			
		||||
			// inside escape sequence
 | 
			
		||||
			tw.command = append(tw.command, p[current])
 | 
			
		||||
			if isAnsiCommandChar(p[current]) {
 | 
			
		||||
				if !isXtermOscSequence(tw.command, p[current]) {
 | 
			
		||||
					// found the last command character.
 | 
			
		||||
					// Now we have a complete command.
 | 
			
		||||
					nchar, err := tw.emulator.HandleOutputCommand(tw.fd, tw.command)
 | 
			
		||||
					totalWritten += nchar
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						return totalWritten, err
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					// clear the command
 | 
			
		||||
					// don't include current character again
 | 
			
		||||
					tw.command = tw.command[:0]
 | 
			
		||||
					start = current + 1
 | 
			
		||||
					tw.inSequence = false
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			if p[current] == ANSI_ESCAPE_PRIMARY {
 | 
			
		||||
				// entering escape sequnce
 | 
			
		||||
				tw.inSequence = true
 | 
			
		||||
				// indicates end of "normal sequence", write whatever you have so far
 | 
			
		||||
				if len(p[start:current]) > 0 {
 | 
			
		||||
					nw, err := tw.emulator.WriteChars(tw.fd, tw.wrappedWriter, p[start:current])
 | 
			
		||||
					totalWritten += nw
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						return totalWritten, err
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				// include the current character as part of the next sequence
 | 
			
		||||
				tw.command = append(tw.command, p[current])
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// note that so far, start of the escape sequence triggers writing out of bytes to console.
 | 
			
		||||
	// For the part _after_ the end of last escape sequence, it is not written out yet. So write it out
 | 
			
		||||
	if !tw.inSequence {
 | 
			
		||||
		// assumption is that we can't be inside sequence and therefore command should be empty
 | 
			
		||||
		if len(p[start:]) > 0 {
 | 
			
		||||
			nw, err := tw.emulator.WriteChars(tw.fd, tw.wrappedWriter, p[start:])
 | 
			
		||||
			totalWritten += nw
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return totalWritten, err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return totalWritten, nil
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Read reads up to len(p) bytes into p.
 | 
			
		||||
// http://golang.org/pkg/io/#Reader
 | 
			
		||||
func (tr *terminalReader) Read(p []byte) (n int, err error) {
 | 
			
		||||
	//Implementations of Read are discouraged from returning a zero byte count
 | 
			
		||||
	// with a nil error, except when len(p) == 0.
 | 
			
		||||
	if len(p) == 0 {
 | 
			
		||||
		return 0, nil
 | 
			
		||||
	}
 | 
			
		||||
	if nil == tr.emulator {
 | 
			
		||||
		return tr.readFromWrappedReader(p)
 | 
			
		||||
	}
 | 
			
		||||
	return tr.emulator.ReadChars(tr.fd, tr.wrappedReader, p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Close the underlying stream
 | 
			
		||||
func (tr *terminalReader) Close() (err error) {
 | 
			
		||||
	return tr.wrappedReader.Close()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (tr *terminalReader) readFromWrappedReader(p []byte) (n int, err error) {
 | 
			
		||||
	return tr.wrappedReader.Read(p)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ansiCommand struct {
 | 
			
		||||
	CommandBytes []byte
 | 
			
		||||
	Command      string
 | 
			
		||||
	Parameters   []string
 | 
			
		||||
	IsSpecial    bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseAnsiCommand(command []byte) *ansiCommand {
 | 
			
		||||
	if isCharacterSelectionCmdChar(command[1]) {
 | 
			
		||||
		// Is Character Set Selection commands
 | 
			
		||||
		return &ansiCommand{
 | 
			
		||||
			CommandBytes: command,
 | 
			
		||||
			Command:      string(command),
 | 
			
		||||
			IsSpecial:    true,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// last char is command character
 | 
			
		||||
	lastCharIndex := len(command) - 1
 | 
			
		||||
 | 
			
		||||
	retValue := &ansiCommand{
 | 
			
		||||
		CommandBytes: command,
 | 
			
		||||
		Command:      string(command[lastCharIndex]),
 | 
			
		||||
		IsSpecial:    false,
 | 
			
		||||
	}
 | 
			
		||||
	// more than a single escape
 | 
			
		||||
	if lastCharIndex != 0 {
 | 
			
		||||
		start := 1
 | 
			
		||||
		// skip if double char escape sequence
 | 
			
		||||
		if command[0] == ANSI_ESCAPE_PRIMARY && command[1] == ANSI_ESCAPE_SECONDARY {
 | 
			
		||||
			start++
 | 
			
		||||
		}
 | 
			
		||||
		// convert this to GetNextParam method
 | 
			
		||||
		retValue.Parameters = strings.Split(string(command[start:lastCharIndex]), ANSI_PARAMETER_SEP)
 | 
			
		||||
	}
 | 
			
		||||
	return retValue
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *ansiCommand) getParam(index int) string {
 | 
			
		||||
	if len(c.Parameters) > index {
 | 
			
		||||
		return c.Parameters[index]
 | 
			
		||||
	}
 | 
			
		||||
	return ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ac *ansiCommand) String() string {
 | 
			
		||||
	return fmt.Sprintf("0x%v \"%v\" (\"%v\")",
 | 
			
		||||
		bytesToHex(ac.CommandBytes),
 | 
			
		||||
		ac.Command,
 | 
			
		||||
		strings.Join(ac.Parameters, "\",\""))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func bytesToHex(b []byte) string {
 | 
			
		||||
	hex := make([]string, len(b))
 | 
			
		||||
	for i, ch := range b {
 | 
			
		||||
		hex[i] = fmt.Sprintf("%X", ch)
 | 
			
		||||
	}
 | 
			
		||||
	return strings.Join(hex, "")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseInt16OrDefault(s string, defaultValue int16) (n int16, err error) {
 | 
			
		||||
	if s == "" {
 | 
			
		||||
		return defaultValue, nil
 | 
			
		||||
	}
 | 
			
		||||
	parsedValue, err := strconv.ParseInt(s, 10, 16)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return defaultValue, err
 | 
			
		||||
	}
 | 
			
		||||
	return int16(parsedValue), nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										257
									
								
								vendor/github.com/docker/docker/pkg/term/windows/ansi_reader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										257
									
								
								vendor/github.com/docker/docker/pkg/term/windows/ansi_reader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,257 +0,0 @@
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newAnsiReader(nFile int) *ansiReader {
 | 
			
		||||
	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
 | 
			
		||||
	}
 | 
			
		||||
	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[winterm.WORD]string{
 | 
			
		||||
	winterm.VK_UP:    "%s%sA",
 | 
			
		||||
	winterm.VK_DOWN:  "%s%sB",
 | 
			
		||||
	winterm.VK_RIGHT: "%s%sC",
 | 
			
		||||
	winterm.VK_LEFT:  "%s%sD",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var keyMapPrefix = map[winterm.WORD]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 winterm.WORD, controlState winterm.DWORD, 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 winterm.DWORD) (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 ""
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										76
									
								
								vendor/github.com/docker/docker/pkg/term/windows/ansi_writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										76
									
								
								vendor/github.com/docker/docker/pkg/term/windows/ansi_writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,76 +0,0 @@
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	ansiterm "github.com/Azure/go-ansiterm"
 | 
			
		||||
	"github.com/Azure/go-ansiterm/winterm"
 | 
			
		||||
	"github.com/Sirupsen/logrus"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var logger *logrus.Logger
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newAnsiWriter(nFile int) *ansiWriter {
 | 
			
		||||
	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,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										97
									
								
								vendor/github.com/docker/docker/pkg/term/windows/console.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										97
									
								
								vendor/github.com/docker/docker/pkg/term/windows/console.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,97 +0,0 @@
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"syscall"
 | 
			
		||||
 | 
			
		||||
	"github.com/Azure/go-ansiterm/winterm"
 | 
			
		||||
 | 
			
		||||
	ansiterm "github.com/Azure/go-ansiterm"
 | 
			
		||||
	"github.com/Sirupsen/logrus"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ConEmuStreams returns prepared versions of console streams,
 | 
			
		||||
// for proper use in ConEmu terminal.
 | 
			
		||||
// The ConEmu terminal emulates ANSI on output streams well by default.
 | 
			
		||||
func ConEmuStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) {
 | 
			
		||||
	if IsConsole(os.Stdin.Fd()) {
 | 
			
		||||
		stdIn = newAnsiReader(syscall.STD_INPUT_HANDLE)
 | 
			
		||||
	} else {
 | 
			
		||||
		stdIn = os.Stdin
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	stdOut = os.Stdout
 | 
			
		||||
	stdErr = os.Stderr
 | 
			
		||||
 | 
			
		||||
	// WARNING (BEGIN): sourced from newAnsiWriter
 | 
			
		||||
 | 
			
		||||
	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,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// WARNING (END): sourced from newAnsiWriter
 | 
			
		||||
 | 
			
		||||
	return stdIn, stdOut, stdErr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ConsoleStreams returns a wrapped version for each standard stream referencing a console,
 | 
			
		||||
// that handles ANSI character sequences.
 | 
			
		||||
func ConsoleStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) {
 | 
			
		||||
	if IsConsole(os.Stdin.Fd()) {
 | 
			
		||||
		stdIn = newAnsiReader(syscall.STD_INPUT_HANDLE)
 | 
			
		||||
	} else {
 | 
			
		||||
		stdIn = os.Stdin
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if IsConsole(os.Stdout.Fd()) {
 | 
			
		||||
		stdOut = newAnsiWriter(syscall.STD_OUTPUT_HANDLE)
 | 
			
		||||
	} else {
 | 
			
		||||
		stdOut = os.Stdout
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if IsConsole(os.Stderr.Fd()) {
 | 
			
		||||
		stdErr = newAnsiWriter(syscall.STD_ERROR_HANDLE)
 | 
			
		||||
	} else {
 | 
			
		||||
		stdErr = os.Stderr
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return stdIn, stdOut, stdErr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										5
									
								
								vendor/github.com/docker/docker/pkg/term/windows/windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/docker/docker/pkg/term/windows/windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +0,0 @@
 | 
			
		||||
// 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 windows
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
// Package jsonlog provides helper functions to parse and print time (time.Time) as JSON.
 | 
			
		||||
package jsonlog
 | 
			
		||||
package timeutils
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
@@ -15,9 +14,9 @@ const (
 | 
			
		||||
	JSONFormat = `"` + time.RFC3339Nano + `"`
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// FastTimeMarshalJSON avoids one of the extra allocations that
 | 
			
		||||
// FastMarshalJSON avoids one of the extra allocations that
 | 
			
		||||
// time.MarshalJSON is making.
 | 
			
		||||
func FastTimeMarshalJSON(t time.Time) (string, error) {
 | 
			
		||||
func FastMarshalJSON(t time.Time) (string, error) {
 | 
			
		||||
	if y := t.Year(); y < 0 || y >= 10000 {
 | 
			
		||||
		// RFC 3339 is clear that years are 4 digits exactly.
 | 
			
		||||
		// See golang.org/issue/4556#c15 for more discussion.
 | 
			
		||||
							
								
								
									
										36
									
								
								vendor/github.com/docker/docker/pkg/timeutils/utils.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								vendor/github.com/docker/docker/pkg/timeutils/utils.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
package timeutils
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// GetTimestamp tries to parse given string as golang duration,
 | 
			
		||||
// then RFC3339 time and finally as a Unix timestamp. If
 | 
			
		||||
// any of these were successful, it returns a Unix timestamp
 | 
			
		||||
// as string otherwise returns the given value back.
 | 
			
		||||
// In case of duration input, the returned timestamp is computed
 | 
			
		||||
// as the given reference time minus the amount of the duration.
 | 
			
		||||
func GetTimestamp(value string, reference time.Time) string {
 | 
			
		||||
	if d, err := time.ParseDuration(value); value != "0" && err == nil {
 | 
			
		||||
		return strconv.FormatInt(reference.Add(-d).Unix(), 10)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var format string
 | 
			
		||||
	if strings.Contains(value, ".") {
 | 
			
		||||
		format = time.RFC3339Nano
 | 
			
		||||
	} else {
 | 
			
		||||
		format = time.RFC3339
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	loc := time.FixedZone(time.Now().Zone())
 | 
			
		||||
	if len(value) < len(format) {
 | 
			
		||||
		format = format[:len(value)]
 | 
			
		||||
	}
 | 
			
		||||
	t, err := time.ParseInLocation(format, value, loc)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return value
 | 
			
		||||
	}
 | 
			
		||||
	return strconv.FormatInt(t.Unix(), 10)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								vendor/github.com/docker/docker/pkg/units/duration.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								vendor/github.com/docker/docker/pkg/units/duration.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
package units
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// HumanDuration returns a human-readable approximation of a duration
 | 
			
		||||
// (eg. "About a minute", "4 hours ago", etc.)
 | 
			
		||||
func HumanDuration(d time.Duration) string {
 | 
			
		||||
	if seconds := int(d.Seconds()); seconds < 1 {
 | 
			
		||||
		return "Less than a second"
 | 
			
		||||
	} else if seconds < 60 {
 | 
			
		||||
		return fmt.Sprintf("%d seconds", seconds)
 | 
			
		||||
	} else if minutes := int(d.Minutes()); minutes == 1 {
 | 
			
		||||
		return "About a minute"
 | 
			
		||||
	} else if minutes < 60 {
 | 
			
		||||
		return fmt.Sprintf("%d minutes", minutes)
 | 
			
		||||
	} else if hours := int(d.Hours()); hours == 1 {
 | 
			
		||||
		return "About an hour"
 | 
			
		||||
	} else if hours < 48 {
 | 
			
		||||
		return fmt.Sprintf("%d hours", hours)
 | 
			
		||||
	} else if hours < 24*7*2 {
 | 
			
		||||
		return fmt.Sprintf("%d days", hours/24)
 | 
			
		||||
	} else if hours < 24*30*3 {
 | 
			
		||||
		return fmt.Sprintf("%d weeks", hours/24/7)
 | 
			
		||||
	} else if hours < 24*365*2 {
 | 
			
		||||
		return fmt.Sprintf("%d months", hours/24/30)
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf("%d years", int(d.Hours())/24/365)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										93
									
								
								vendor/github.com/docker/docker/pkg/units/size.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								vendor/github.com/docker/docker/pkg/units/size.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
package units
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// See: http://en.wikipedia.org/wiki/Binary_prefix
 | 
			
		||||
const (
 | 
			
		||||
	// Decimal
 | 
			
		||||
 | 
			
		||||
	KB = 1000
 | 
			
		||||
	MB = 1000 * KB
 | 
			
		||||
	GB = 1000 * MB
 | 
			
		||||
	TB = 1000 * GB
 | 
			
		||||
	PB = 1000 * TB
 | 
			
		||||
 | 
			
		||||
	// Binary
 | 
			
		||||
 | 
			
		||||
	KiB = 1024
 | 
			
		||||
	MiB = 1024 * KiB
 | 
			
		||||
	GiB = 1024 * MiB
 | 
			
		||||
	TiB = 1024 * GiB
 | 
			
		||||
	PiB = 1024 * TiB
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type unitMap map[string]int64
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	decimalMap = unitMap{"k": KB, "m": MB, "g": GB, "t": TB, "p": PB}
 | 
			
		||||
	binaryMap  = unitMap{"k": KiB, "m": MiB, "g": GiB, "t": TiB, "p": PiB}
 | 
			
		||||
	sizeRegex  = regexp.MustCompile(`^(\d+)([kKmMgGtTpP])?[bB]?$`)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var decimapAbbrs = []string{"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"}
 | 
			
		||||
var binaryAbbrs = []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"}
 | 
			
		||||
 | 
			
		||||
// CustomSize returns a human-readable approximation of a size
 | 
			
		||||
// using custom format
 | 
			
		||||
func CustomSize(format string, size float64, base float64, _map []string) string {
 | 
			
		||||
	i := 0
 | 
			
		||||
	for size >= base {
 | 
			
		||||
		size = size / base
 | 
			
		||||
		i++
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Sprintf(format, size, _map[i])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// HumanSize returns a human-readable approximation of a size
 | 
			
		||||
// using SI standard (eg. "44kB", "17MB")
 | 
			
		||||
func HumanSize(size float64) string {
 | 
			
		||||
	return CustomSize("%.4g %s", size, 1000.0, decimapAbbrs)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BytesSize(size float64) string {
 | 
			
		||||
	return CustomSize("%.4g %s", size, 1024.0, binaryAbbrs)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FromHumanSize returns an integer from a human-readable specification of a
 | 
			
		||||
// size using SI standard (eg. "44kB", "17MB")
 | 
			
		||||
func FromHumanSize(size string) (int64, error) {
 | 
			
		||||
	return parseSize(size, decimalMap)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RAMInBytes parses a human-readable string representing an amount of RAM
 | 
			
		||||
// in bytes, kibibytes, mebibytes, gibibytes, or tebibytes and
 | 
			
		||||
// returns the number of bytes, or -1 if the string is unparseable.
 | 
			
		||||
// Units are case-insensitive, and the 'b' suffix is optional.
 | 
			
		||||
func RAMInBytes(size string) (int64, error) {
 | 
			
		||||
	return parseSize(size, binaryMap)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Parses the human-readable size string into the amount it represents
 | 
			
		||||
func parseSize(sizeStr string, uMap unitMap) (int64, error) {
 | 
			
		||||
	matches := sizeRegex.FindStringSubmatch(sizeStr)
 | 
			
		||||
	if len(matches) != 3 {
 | 
			
		||||
		return -1, fmt.Errorf("invalid size: '%s'", sizeStr)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	size, err := strconv.ParseInt(matches[1], 10, 0)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return -1, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	unitPrefix := strings.ToLower(matches[2])
 | 
			
		||||
	if mul, ok := uMap[unitPrefix]; ok {
 | 
			
		||||
		size *= mul
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return size, nil
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user