]> Cypherpunks repositories - gostls13.git/commitdiff
net: make parsePort as a function
authorMikio Hara <mikioh.mikioh@gmail.com>
Mon, 28 May 2012 21:12:06 +0000 (06:12 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Mon, 28 May 2012 21:12:06 +0000 (06:12 +0900)
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/6256059

src/pkg/net/ipsock.go
src/pkg/net/port.go
src/pkg/net/port_unix.go [new file with mode: 0644]

index bfbce18a4147f432a3acbe0a2a5163589898f77b..84547c7a6a8ea537e83819d0230cf6b4a085ad51 100644 (file)
@@ -129,17 +129,10 @@ func hostPortToIP(net, hostport string) (ip IP, iport int, err error) {
                }
        }
 
-       p, i, ok := dtoi(port, 0)
-       if !ok || i != len(port) {
-               p, err = LookupPort(net, port)
-               if err != nil {
-                       return nil, 0, err
-               }
-       }
-       if p < 0 || p > 0xFFFF {
-               return nil, 0, &AddrError{"invalid port", port}
+       p, err := parsePort(net, port)
+       if err != nil {
+               return nil, 0, err
        }
 
        return addr, p, nil
-
 }
index 16780da1160cd81dc6065924c364ae0f5adcf589..c24f4ed5b17733da84c7a34e61f909b6ae5309d6 100644 (file)
@@ -1,69 +1,24 @@
-// Copyright 2009 The Go Authors. All rights reserved.
+// Copyright 2012 The Go Authors.  All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build darwin freebsd linux netbsd openbsd
-
-// Read system port mappings from /etc/services
+// Network service port manipulations
 
 package net
 
-import "sync"
-
-var services map[string]map[string]int
-var servicesError error
-var onceReadServices sync.Once
-
-func readServices() {
-       services = make(map[string]map[string]int)
-       var file *file
-       if file, servicesError = open("/etc/services"); servicesError != nil {
-               return
-       }
-       for line, ok := file.readLine(); ok; line, ok = file.readLine() {
-               // "http 80/tcp www www-http # World Wide Web HTTP"
-               if i := byteIndex(line, '#'); i >= 0 {
-                       line = line[0:i]
-               }
-               f := getFields(line)
-               if len(f) < 2 {
-                       continue
-               }
-               portnet := f[1] // "tcp/80"
-               port, j, ok := dtoi(portnet, 0)
-               if !ok || port <= 0 || j >= len(portnet) || portnet[j] != '/' {
-                       continue
-               }
-               netw := portnet[j+1:] // "tcp"
-               m, ok1 := services[netw]
-               if !ok1 {
-                       m = make(map[string]int)
-                       services[netw] = m
-               }
-               for i := 0; i < len(f); i++ {
-                       if i != 1 { // f[1] was port/net
-                               m[f[i]] = port
-                       }
+// parsePort parses port as a network service port number for both
+// TCP and UDP.
+func parsePort(net, port string) (int, error) {
+       p, i, ok := dtoi(port, 0)
+       if !ok || i != len(port) {
+               var err error
+               p, err = LookupPort(net, port)
+               if err != nil {
+                       return 0, err
                }
        }
-       file.close()
-}
-
-// goLookupPort is the native Go implementation of LookupPort.
-func goLookupPort(network, service string) (port int, err error) {
-       onceReadServices.Do(readServices)
-
-       switch network {
-       case "tcp4", "tcp6":
-               network = "tcp"
-       case "udp4", "udp6":
-               network = "udp"
-       }
-
-       if m, ok := services[network]; ok {
-               if port, ok = m[service]; ok {
-                       return
-               }
+       if p < 0 || p > 0xFFFF {
+               return 0, &AddrError{"invalid port", port}
        }
-       return 0, &AddrError{"unknown port", network + "/" + service}
+       return p, nil
 }
diff --git a/src/pkg/net/port_unix.go b/src/pkg/net/port_unix.go
new file mode 100644 (file)
index 0000000..16780da
--- /dev/null
@@ -0,0 +1,69 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin freebsd linux netbsd openbsd
+
+// Read system port mappings from /etc/services
+
+package net
+
+import "sync"
+
+var services map[string]map[string]int
+var servicesError error
+var onceReadServices sync.Once
+
+func readServices() {
+       services = make(map[string]map[string]int)
+       var file *file
+       if file, servicesError = open("/etc/services"); servicesError != nil {
+               return
+       }
+       for line, ok := file.readLine(); ok; line, ok = file.readLine() {
+               // "http 80/tcp www www-http # World Wide Web HTTP"
+               if i := byteIndex(line, '#'); i >= 0 {
+                       line = line[0:i]
+               }
+               f := getFields(line)
+               if len(f) < 2 {
+                       continue
+               }
+               portnet := f[1] // "tcp/80"
+               port, j, ok := dtoi(portnet, 0)
+               if !ok || port <= 0 || j >= len(portnet) || portnet[j] != '/' {
+                       continue
+               }
+               netw := portnet[j+1:] // "tcp"
+               m, ok1 := services[netw]
+               if !ok1 {
+                       m = make(map[string]int)
+                       services[netw] = m
+               }
+               for i := 0; i < len(f); i++ {
+                       if i != 1 { // f[1] was port/net
+                               m[f[i]] = port
+                       }
+               }
+       }
+       file.close()
+}
+
+// goLookupPort is the native Go implementation of LookupPort.
+func goLookupPort(network, service string) (port int, err error) {
+       onceReadServices.Do(readServices)
+
+       switch network {
+       case "tcp4", "tcp6":
+               network = "tcp"
+       case "udp4", "udp6":
+               network = "udp"
+       }
+
+       if m, ok := services[network]; ok {
+               if port, ok = m[service]; ok {
+                       return
+               }
+       }
+       return 0, &AddrError{"unknown port", network + "/" + service}
+}