syscall, golang_org/x/net/lif: fixes for gccgo on Solaris

Reviewed-on: https://go-review.googlesource.com/35390

From-SVN: r244563
This commit is contained in:
Ian Lance Taylor 2017-01-18 03:37:52 +00:00
parent 4cc0208ac8
commit 49947b33ff
5 changed files with 26 additions and 25 deletions

View File

@ -1,4 +1,4 @@
223cba75b947afc1ee5a13a60c15c66f6ff355c1
2b3d389f961b8461b3fdf42318a628f68b56f8b1
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.

View File

@ -84,7 +84,7 @@ func links(eps []endpoint, name string) ([]Link, error) {
b := make([]byte, lifn.Count*sizeofLifreq)
lifc.Family = uint16(ep.af)
lifc.Len = lifn.Count * sizeofLifreq
littleEndian.PutUint64(lifc.Lifcu[:], uint64(uintptr(unsafe.Pointer(&b[0]))))
lifc.Lifcu = unsafe.Pointer(&b[0])
ioc = int64(sysSIOCGLIFCONF)
if err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifc)); err != nil {
continue

View File

@ -11,23 +11,12 @@ import (
"unsafe"
)
//go:cgo_import_dynamic libc_ioctl ioctl "libc.so"
//go:linkname procIoctl libc_ioctl
var procIoctl uintptr
func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno)
// TODO: replace with runtime.KeepAlive when available
//go:noescape
func keepAlive(p unsafe.Pointer)
//extern __go_ioctl_ptr
func libc_ioctl(int32, int32, unsafe.Pointer) int32
func ioctl(s, ioc uintptr, arg unsafe.Pointer) error {
_, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procIoctl)), 3, s, ioc, uintptr(arg), 0, 0, 0)
keepAlive(arg)
if errno != 0 {
return error(errno)
if libc_ioctl(int32(s), int32(ioc), arg) < 0 {
return syscall.GetErrno()
}
return nil
}

View File

@ -3,6 +3,8 @@
package lif
import "unsafe"
const (
sysAF_UNSPEC = 0x0
sysAF_INET = 0x2
@ -59,15 +61,11 @@ const (
)
const (
sizeofLifnum = 0xc
sizeofLifreq = 0x178
sizeofLifconf = 0x18
sizeofLifIfinfoReq = 0x10
)
type sysLifnum struct {
Family uint16
Pad_cgo_0 [2]byte
Flags int32
Count int32
}
@ -81,16 +79,13 @@ type lifreq struct {
type lifconf struct {
Family uint16
Pad_cgo_0 [2]byte
Flags int32
Len int32
Pad_cgo_1 [4]byte
Lifcu [8]byte
Lifcu unsafe.Pointer
}
type lifIfinfoReq struct {
Maxhops uint8
Pad_cgo_0 [3]byte
Reachtime uint32
Reachretrans uint32
Maxmtu uint32

View File

@ -29,3 +29,20 @@ func direntNamlen(buf []byte) (uint64, bool) {
}
return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true
}
//sysnb getexecname() (execname unsafe.Pointer, err error)
//getexecname() *byte
func Getexecname() (path string, err error) {
ptr, err := getexecname()
if err != nil {
return "", err
}
bytes := (*[1 << 29]byte)(ptr)[:]
for i, b := range bytes {
if b == 0 {
return string(bytes[:i]), nil
}
}
panic("unreachable")
}