veyron/lib/flags: make it possible to set an empty string for IPHostPortFlag validation!

Change-Id: I9e5e9a24a27c9bd8cf76d4822b307979ec31453a
diff --git a/lib/flags/flags.go b/lib/flags/flags.go
index cb9dde9..bff6c4b 100644
--- a/lib/flags/flags.go
+++ b/lib/flags/flags.go
@@ -232,7 +232,7 @@
 	return roots, os.Getenv(consts.VeyronCredentials)
 }
 
-// Parse parses the supplied args, as per flag.Parse
+// Parse parses the supplied args, as per flag.Parse.
 func (f *Flags) Parse(args []string) error {
 	// TODO(cnicolaou): implement a single env var 'VANADIUM_OPTS'
 	// that can be used to specify any command line.
diff --git a/lib/flags/listen.go b/lib/flags/listen.go
index de2855f..929dd56 100644
--- a/lib/flags/listen.go
+++ b/lib/flags/listen.go
@@ -52,6 +52,10 @@
 
 // Implements flag.Value.Set
 func (ip *IPHostPortFlag) Set(s string) error {
+	if len(s) == 0 {
+		ip.Address, ip.Port, ip.Host = "", "", ""
+		return nil
+	}
 	ip.Address = s
 	host, port, err := net.SplitHostPort(s)
 	if err != nil {
@@ -87,6 +91,9 @@
 
 // Implements flag.Value.String
 func (ip IPHostPortFlag) String() string {
+	if len(ip.Address) == 0 && len(ip.Port) == 0 {
+		return ""
+	}
 	host := ip.Host
 	if len(ip.Host) == 0 && ip.IP != nil && len(ip.IP) > 0 {
 		// We don't have a hostname, so there should be at most one IP address.
diff --git a/lib/flags/listen_test.go b/lib/flags/listen_test.go
index 6c1fc6c..1ec6472 100644
--- a/lib/flags/listen_test.go
+++ b/lib/flags/listen_test.go
@@ -43,7 +43,7 @@
 		want  flags.IPHostPortFlag
 		str   string
 	}{
-		{"", flags.IPHostPortFlag{Port: "0"}, ":0"},
+		{"", flags.IPHostPortFlag{Port: ""}, ""},
 		{":0", flags.IPHostPortFlag{Port: "0"}, ":0"},
 		{":22", flags.IPHostPortFlag{Port: "22"}, ":22"},
 		{"127.0.0.1", flags.IPHostPortFlag{IP: lh, Port: "0"}, "127.0.0.1:0"},
diff --git a/lib/flags/main.go b/lib/flags/main.go
new file mode 100644
index 0000000..cae781a
--- /dev/null
+++ b/lib/flags/main.go
@@ -0,0 +1,29 @@
+// +build ignore
+
+package main
+
+import (
+	"flag"
+	"fmt"
+	"os"
+
+	"veyron.io/veyron/veyron/lib/flags"
+)
+
+func main() {
+	fl := flags.CreateAndRegister(flag.CommandLine, flags.Runtime, flags.ACL, flags.Listen)
+	flag.PrintDefaults()
+	fmt.Printf("Args: %v\n", os.Args)
+	if err := fl.Parse(os.Args[1:]); err != nil {
+		fmt.Println("ERROR: %s", err)
+		return
+	}
+	rtf := fl.RuntimeFlags()
+	fmt.Printf("Runtime: Credentials: %s\n", rtf.Credentials)
+	fmt.Printf("Runtime: Namespace Roots: %s\n", rtf.NamespaceRoots)
+	lf := fl.ListenFlags()
+	fmt.Printf("Listen: Protocol %q\n", lf.ListenProtocol)
+	fmt.Printf("Listen: Address %q\n", lf.ListenAddress)
+	fmt.Printf("Listen: Proxy %q\n", lf.ListenProxy)
+	fmt.Printf("ACL: %v\n", fl.ACLFlags())
+}