// 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. // Read system port mappings from /etc/services package net import ( "once"; "os"; ) var services map[string] map[string] int var servicesError os.Error func readServices() { services = make(map[string] map[string] int); var file *file; file, servicesError = open("/etc/services"); 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:len(portnet)]; // "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(); } // LookupPort looks up the port for the given network and service. func LookupPort(network, service string) (port int, err os.Error) { once.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}; }