From ac486ab15c47edc31a5b2898bf79d26b9a9c939a Mon Sep 17 00:00:00 2001 From: Mikio Hara Date: Tue, 29 May 2012 06:12:06 +0900 Subject: [PATCH] net: make parsePort as a function R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/6256059 --- src/pkg/net/ipsock.go | 13 ++----- src/pkg/net/port.go | 75 ++++++++-------------------------------- src/pkg/net/port_unix.go | 69 ++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 70 deletions(-) create mode 100644 src/pkg/net/port_unix.go diff --git a/src/pkg/net/ipsock.go b/src/pkg/net/ipsock.go index bfbce18a41..84547c7a6a 100644 --- a/src/pkg/net/ipsock.go +++ b/src/pkg/net/ipsock.go @@ -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 - } diff --git a/src/pkg/net/port.go b/src/pkg/net/port.go index 16780da116..c24f4ed5b1 100644 --- a/src/pkg/net/port.go +++ b/src/pkg/net/port.go @@ -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 - } - } - return 0, &AddrError{"unknown port", network + "/" + service} + if p < 0 || p > 0xFFFF { + return 0, &AddrError{"invalid port", port} + } + return p, nil } diff --git a/src/pkg/net/port_unix.go b/src/pkg/net/port_unix.go new file mode 100644 index 0000000000..16780da116 --- /dev/null +++ b/src/pkg/net/port_unix.go @@ -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} +}