net, cmd/fix: add IPv6 scoped addressing zone to INET, INET6 address structs

This CL starts to introduce IPv6 scoped addressing capability
into the net package.

The Public API changes are:
+pkg net, type IPAddr struct, Zone string
+pkg net, type IPNet struct, Zone string
+pkg net, type TCPAddr struct, Zone string
+pkg net, type UDPAddr struct, Zone string

Update #4234.

R=rsc, bradfitz, iant
CC=golang-dev
https://golang.org/cl/6849045
diff --git a/src/pkg/net/ipsock_posix.go b/src/pkg/net/ipsock_posix.go
index 87a2288..4c37616 100644
--- a/src/pkg/net/ipsock_posix.go
+++ b/src/pkg/net/ipsock_posix.go
@@ -4,6 +4,8 @@
 
 // +build darwin freebsd linux netbsd openbsd windows
 
+// Internet protocol family sockets for POSIX
+
 package net
 
 import (
@@ -155,7 +157,7 @@
 	return nil, &OpError{mode, net, addr, err}
 }
 
-func ipToSockaddr(family int, ip IP, port int) (syscall.Sockaddr, error) {
+func ipToSockaddr(family int, ip IP, port int, zone string) (syscall.Sockaddr, error) {
 	switch family {
 	case syscall.AF_INET:
 		if len(ip) == 0 {
@@ -164,12 +166,12 @@
 		if ip = ip.To4(); ip == nil {
 			return nil, InvalidAddrError("non-IPv4 address")
 		}
-		s := new(syscall.SockaddrInet4)
+		sa := new(syscall.SockaddrInet4)
 		for i := 0; i < IPv4len; i++ {
-			s.Addr[i] = ip[i]
+			sa.Addr[i] = ip[i]
 		}
-		s.Port = port
-		return s, nil
+		sa.Port = port
+		return sa, nil
 	case syscall.AF_INET6:
 		if len(ip) == 0 {
 			ip = IPv6zero
@@ -183,12 +185,13 @@
 		if ip = ip.To16(); ip == nil {
 			return nil, InvalidAddrError("non-IPv6 address")
 		}
-		s := new(syscall.SockaddrInet6)
+		sa := new(syscall.SockaddrInet6)
 		for i := 0; i < IPv6len; i++ {
-			s.Addr[i] = ip[i]
+			sa.Addr[i] = ip[i]
 		}
-		s.Port = port
-		return s, nil
+		sa.Port = port
+		sa.ZoneId = uint32(zoneToInt(zone))
+		return sa, nil
 	}
 	return nil, InvalidAddrError("unexpected socket family")
 }