diff options
Diffstat (limited to 'libgo/go/net/port.go')
-rw-r--r-- | libgo/go/net/port.go | 73 |
1 files changed, 14 insertions, 59 deletions
diff --git a/libgo/go/net/port.go b/libgo/go/net/port.go index 16780da1160..c24f4ed5b17 100644 --- a/libgo/go/net/port.go +++ b/libgo/go/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 - } + if p < 0 || p > 0xFFFF { + return 0, &AddrError{"invalid port", port} } - return 0, &AddrError{"unknown port", network + "/" + service} + return p, nil } |