Commit 49947b33 by Ian Lance Taylor

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

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

From-SVN: r244563
parent 4cc0208a
223cba75b947afc1ee5a13a60c15c66f6ff355c1 2b3d389f961b8461b3fdf42318a628f68b56f8b1
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -84,7 +84,7 @@ func links(eps []endpoint, name string) ([]Link, error) { ...@@ -84,7 +84,7 @@ func links(eps []endpoint, name string) ([]Link, error) {
b := make([]byte, lifn.Count*sizeofLifreq) b := make([]byte, lifn.Count*sizeofLifreq)
lifc.Family = uint16(ep.af) lifc.Family = uint16(ep.af)
lifc.Len = lifn.Count * sizeofLifreq lifc.Len = lifn.Count * sizeofLifreq
littleEndian.PutUint64(lifc.Lifcu[:], uint64(uintptr(unsafe.Pointer(&b[0])))) lifc.Lifcu = unsafe.Pointer(&b[0])
ioc = int64(sysSIOCGLIFCONF) ioc = int64(sysSIOCGLIFCONF)
if err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifc)); err != nil { if err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifc)); err != nil {
continue continue
......
...@@ -11,23 +11,12 @@ import ( ...@@ -11,23 +11,12 @@ import (
"unsafe" "unsafe"
) )
//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" //extern __go_ioctl_ptr
func libc_ioctl(int32, int32, unsafe.Pointer) int32
//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)
func ioctl(s, ioc uintptr, arg unsafe.Pointer) error { func ioctl(s, ioc uintptr, arg unsafe.Pointer) error {
_, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procIoctl)), 3, s, ioc, uintptr(arg), 0, 0, 0) if libc_ioctl(int32(s), int32(ioc), arg) < 0 {
keepAlive(arg) return syscall.GetErrno()
if errno != 0 {
return error(errno)
} }
return nil return nil
} }
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
package lif package lif
import "unsafe"
const ( const (
sysAF_UNSPEC = 0x0 sysAF_UNSPEC = 0x0
sysAF_INET = 0x2 sysAF_INET = 0x2
...@@ -59,15 +61,11 @@ const ( ...@@ -59,15 +61,11 @@ const (
) )
const ( const (
sizeofLifnum = 0xc
sizeofLifreq = 0x178 sizeofLifreq = 0x178
sizeofLifconf = 0x18
sizeofLifIfinfoReq = 0x10
) )
type sysLifnum struct { type sysLifnum struct {
Family uint16 Family uint16
Pad_cgo_0 [2]byte
Flags int32 Flags int32
Count int32 Count int32
} }
...@@ -81,16 +79,13 @@ type lifreq struct { ...@@ -81,16 +79,13 @@ type lifreq struct {
type lifconf struct { type lifconf struct {
Family uint16 Family uint16
Pad_cgo_0 [2]byte
Flags int32 Flags int32
Len int32 Len int32
Pad_cgo_1 [4]byte Lifcu unsafe.Pointer
Lifcu [8]byte
} }
type lifIfinfoReq struct { type lifIfinfoReq struct {
Maxhops uint8 Maxhops uint8
Pad_cgo_0 [3]byte
Reachtime uint32 Reachtime uint32
Reachretrans uint32 Reachretrans uint32
Maxmtu uint32 Maxmtu uint32
......
...@@ -29,3 +29,20 @@ func direntNamlen(buf []byte) (uint64, bool) { ...@@ -29,3 +29,20 @@ func direntNamlen(buf []byte) (uint64, bool) {
} }
return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true 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")
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment