]> Cypherpunks repositories - gostls13.git/commitdiff
net: add minimal internet protocol number information base
authorMikio Hara <mikioh.mikioh@gmail.com>
Thu, 22 Aug 2013 01:33:37 +0000 (10:33 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Thu, 22 Aug 2013 01:33:37 +0000 (10:33 +0900)
This CL adds minimal information for supporting platforms that don't
have a complete list of internet protocol numbers.

Fixes #5344.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/12898045

src/pkg/net/lookup.go
src/pkg/net/lookup_unix.go
src/pkg/net/lookup_windows.go

index 28d439d643dc02139677515f97a67402c10bcd56..0cd19931296163b9e6680250898a672d4ec2471c 100644 (file)
@@ -8,6 +8,19 @@ import (
        "time"
 )
 
+// protocols contains minimal mappings between internet protocol
+// names and numbers for platforms that don't have a complete list of
+// protocol numbers.
+//
+// See http://www.iana.org/assignments/protocol-numbers
+var protocols = map[string]int{
+       "icmp": 1, "ICMP": 1,
+       "igmp": 2, "IGMP": 2,
+       "tcp": 6, "TCP": 6,
+       "udp": 17, "UDP": 17,
+       "ipv6-icmp": 58, "IPV6-ICMP": 58, "IPv6-ICMP": 58,
+}
+
 var lookupGroup singleflight
 
 // lookupHostMerge wraps lookupHost, but makes sure that for any given
index fa98eed5f2675c7c42f1adccd868074f232a1448..a39e72619252f62ef14e8c831c5993d9aa8e43cb 100644 (file)
@@ -11,15 +11,11 @@ import (
        "sync"
 )
 
-var (
-       protocols         map[string]int
-       onceReadProtocols sync.Once
-)
+var onceReadProtocols sync.Once
 
 // readProtocols loads contents of /etc/protocols into protocols map
 // for quick access.
 func readProtocols() {
-       protocols = make(map[string]int)
        if file, err := open("/etc/protocols"); err == nil {
                for line, ok := file.readLine(); ok; line, ok = file.readLine() {
                        // tcp    6   TCP    # transmission control protocol
@@ -31,9 +27,13 @@ func readProtocols() {
                                continue
                        }
                        if proto, _, ok := dtoi(f[1], 0); ok {
-                               protocols[f[0]] = proto
+                               if _, ok := protocols[f[0]]; !ok {
+                                       protocols[f[0]] = proto
+                               }
                                for _, alias := range f[2:] {
-                                       protocols[alias] = proto
+                                       if _, ok := protocols[alias]; !ok {
+                                               protocols[alias] = proto
+                                       }
                                }
                        }
                }
index 6d20b7976a0ccb57fa4191eb6dc4115494d73a0d..dcbb6d74f1c9fde324cb0dc6097909107ccb5639 100644 (file)
@@ -42,6 +42,11 @@ func lookupProtocol(name string) (proto int, err error) {
                ch <- result{proto: proto, err: err}
        }()
        r := <-ch
+       if r.err != nil {
+               if proto, ok := protocols[name]; ok {
+                       return protol, nil
+               }
+       }
        return r.proto, r.err
 }