Source file src/net/port_unix.go

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build aix || darwin || dragonfly || freebsd || (js && wasm) || linux || netbsd || openbsd || solaris
     6  
     7  // Read system port mappings from /etc/services
     8  
     9  package net
    10  
    11  import (
    12  	"internal/bytealg"
    13  	"sync"
    14  )
    15  
    16  var onceReadServices sync.Once
    17  
    18  func readServices() {
    19  	file, err := open("/etc/services")
    20  	if err != nil {
    21  		return
    22  	}
    23  	defer file.close()
    24  
    25  	for line, ok := file.readLine(); ok; line, ok = file.readLine() {
    26  		// "http 80/tcp www www-http # World Wide Web HTTP"
    27  		if i := bytealg.IndexByteString(line, '#'); i >= 0 {
    28  			line = line[:i]
    29  		}
    30  		f := getFields(line)
    31  		if len(f) < 2 {
    32  			continue
    33  		}
    34  		portnet := f[1] // "80/tcp"
    35  		port, j, ok := dtoi(portnet)
    36  		if !ok || port <= 0 || j >= len(portnet) || portnet[j] != '/' {
    37  			continue
    38  		}
    39  		netw := portnet[j+1:] // "tcp"
    40  		m, ok1 := services[netw]
    41  		if !ok1 {
    42  			m = make(map[string]int)
    43  			services[netw] = m
    44  		}
    45  		for i := 0; i < len(f); i++ {
    46  			if i != 1 { // f[1] was port/net
    47  				m[f[i]] = port
    48  			}
    49  		}
    50  	}
    51  }
    52  
    53  // goLookupPort is the native Go implementation of LookupPort.
    54  func goLookupPort(network, service string) (port int, err error) {
    55  	onceReadServices.Do(readServices)
    56  	return lookupPortMap(network, service)
    57  }
    58  

View as plain text