|  | // Copyright 2016 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 solaris | 
|  |  | 
|  | // Package lif provides basic functions for the manipulation of | 
|  | // logical network interfaces and interface addresses on Solaris. | 
|  | // | 
|  | // The package supports Solaris 11 or above. | 
|  | package lif | 
|  |  | 
|  | import "syscall" | 
|  |  | 
|  | type endpoint struct { | 
|  | af int | 
|  | s  uintptr | 
|  | } | 
|  |  | 
|  | func (ep *endpoint) close() error { | 
|  | return syscall.Close(int(ep.s)) | 
|  | } | 
|  |  | 
|  | func newEndpoints(af int) ([]endpoint, error) { | 
|  | var lastErr error | 
|  | var eps []endpoint | 
|  | afs := []int{sysAF_INET, sysAF_INET6} | 
|  | if af != sysAF_UNSPEC { | 
|  | afs = []int{af} | 
|  | } | 
|  | for _, af := range afs { | 
|  | s, err := syscall.Socket(af, sysSOCK_DGRAM, 0) | 
|  | if err != nil { | 
|  | lastErr = err | 
|  | continue | 
|  | } | 
|  | eps = append(eps, endpoint{af: af, s: uintptr(s)}) | 
|  | } | 
|  | if len(eps) == 0 { | 
|  | return nil, lastErr | 
|  | } | 
|  | return eps, nil | 
|  | } |