diff options
Diffstat (limited to 'cmd/podman/common/util.go')
| -rw-r--r-- | cmd/podman/common/util.go | 57 | 
1 files changed, 56 insertions, 1 deletions
diff --git a/cmd/podman/common/util.go b/cmd/podman/common/util.go index a3626b4e4..ce323a4ba 100644 --- a/cmd/podman/common/util.go +++ b/cmd/podman/common/util.go @@ -1,6 +1,7 @@  package common  import ( +	"io/ioutil"  	"net"  	"strconv"  	"strings" @@ -10,6 +11,30 @@ import (  	"github.com/sirupsen/logrus"  ) +// ReadPodIDFile reads the specified file and returns its content (i.e., first +// line). +func ReadPodIDFile(path string) (string, error) { +	content, err := ioutil.ReadFile(path) +	if err != nil { +		return "", errors.Wrap(err, "error reading pod ID file") +	} +	return strings.Split(string(content), "\n")[0], nil +} + +// ReadPodIDFiles reads the specified files and returns their content (i.e., +// first line). +func ReadPodIDFiles(files []string) ([]string, error) { +	ids := []string{} +	for _, file := range files { +		id, err := ReadPodIDFile(file) +		if err != nil { +			return nil, err +		} +		ids = append(ids, id) +	} +	return ids, nil +} +  // createExpose parses user-provided exposed port definitions and converts them  // into SpecGen format.  // TODO: The SpecGen format should really handle ranges more sanely - we could @@ -71,14 +96,44 @@ func createPortBindings(ports []string) ([]specgen.PortMapping, error) {  			return nil, errors.Errorf("invalid port format - protocol can only be specified once")  		} -		splitPort := strings.Split(splitProto[0], ":") +		remainder := splitProto[0] +		haveV6 := false + +		// Check for an IPv6 address in brackets +		splitV6 := strings.Split(remainder, "]") +		switch len(splitV6) { +		case 1: +			// Do nothing, proceed as before +		case 2: +			// We potentially have an IPv6 address +			haveV6 = true +			if !strings.HasPrefix(splitV6[0], "[") { +				return nil, errors.Errorf("invalid port format - IPv6 addresses must be enclosed by []") +			} +			if !strings.HasPrefix(splitV6[1], ":") { +				return nil, errors.Errorf("invalid port format - IPv6 address must be followed by a colon (':')") +			} +			ipNoPrefix := strings.TrimPrefix(splitV6[0], "[") +			hostIP = &ipNoPrefix +			remainder = strings.TrimPrefix(splitV6[1], ":") +		default: +			return nil, errors.Errorf("invalid port format - at most one IPv6 address can be specified in a --publish") +		} + +		splitPort := strings.Split(remainder, ":")  		switch len(splitPort) {  		case 1: +			if haveV6 { +				return nil, errors.Errorf("invalid port format - must provide host and destination port if specifying an IP") +			}  			ctrPort = splitPort[0]  		case 2:  			hostPort = &(splitPort[0])  			ctrPort = splitPort[1]  		case 3: +			if haveV6 { +				return nil, errors.Errorf("invalid port format - when v6 address specified, must be [ipv6]:hostPort:ctrPort") +			}  			hostIP = &(splitPort[0])  			hostPort = &(splitPort[1])  			ctrPort = splitPort[2]  | 
