Hi Ian, > This seems to need a version of defs_solaris.go that works with the > constants and structs living in syscall.
I've made some progress here: I need to check <sys/sockio.h> for SIOCGLIF* ioctls, and <net/if_types.h> for the IFT_* constants. I've updated configure.in and sysinfo.c accordingly, and adapted defs_solaris.go as well. However, I still run into a number of errors: /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:29:22: error: reference to undefined identifier 'syscall._sockaddr_storage' type sockaddrStorage syscall._sockaddr_storage ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:32:36: error: reference to undefined identifier 'syscall.LIFC_NOXMIT' sysLIFC_NOXMIT = syscall.LIFC_NOXMIT ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:33:36: error: reference to undefined identifier 'syscall.LIFC_EXTERNAL_SOURCE' sysLIFC_EXTERNAL_SOURCE = syscall.LIFC_EXTERNAL_SOURCE ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:34:36: error: reference to undefined identifier 'syscall.LIFC_TEMPORARY' sysLIFC_TEMPORARY = syscall.LIFC_TEMPORARY ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:35:36: error: reference to undefined identifier 'syscall.LIFC_ALLZONES' sysLIFC_ALLZONES = syscall.LIFC_ALLZONES ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:36:36: error: reference to undefined identifier 'syscall.LIFC_UNDER_IPMP' sysLIFC_UNDER_IPMP = syscall.LIFC_UNDER_IPMP ^ The LIFC_* constants are only present in their _LIFC_* form in sysinfo.go so far; need update to mksysinfo.sh. /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:40:31: error: reference to undefined identifier 'syscall.SIOCGLIFADDR' sysSIOCGLIFADDR = syscall.SIOCGLIFADDR ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:41:31: error: reference to undefined identifier 'syscall.SIOCGLIFDSTADDR' sysSIOCGLIFDSTADDR = syscall.SIOCGLIFDSTADDR ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:42:31: error: reference to undefined identifier 'syscall.SIOCGLIFFLAGS' sysSIOCGLIFFLAGS = syscall.SIOCGLIFFLAGS ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:43:31: error: reference to undefined identifier 'syscall.SIOCGLIFMTU' sysSIOCGLIFMTU = syscall.SIOCGLIFMTU ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:44:31: error: reference to undefined identifier 'syscall.SIOCGLIFNETMASK' sysSIOCGLIFNETMASK = syscall.SIOCGLIFNETMASK ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:45:31: error: reference to undefined identifier 'syscall.SIOCGLIFMETRIC' sysSIOCGLIFMETRIC = syscall.SIOCGLIFMETRIC ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:46:31: error: reference to undefined identifier 'syscall.SIOCGLIFNUM' sysSIOCGLIFNUM = syscall.SIOCGLIFNUM ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:47:31: error: reference to undefined identifier 'syscall.SIOCGLIFINDEX' sysSIOCGLIFINDEX = syscall.SIOCGLIFINDEX ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:48:31: error: reference to undefined identifier 'syscall.SIOCGLIFSUBNET' sysSIOCGLIFSUBNET = syscall.SIOCGLIFSUBNET ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:49:31: error: reference to undefined identifier 'syscall.SIOCGLIFLNKINFO' sysSIOCGLIFLNKINFO = syscall.SIOCGLIFLNKINFO ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:50:31: error: reference to undefined identifier 'syscall.SIOCGLIFCONF' sysSIOCGLIFCONF = syscall.SIOCGLIFCONF ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:51:31: error: reference to undefined identifier 'syscall.SIOCGLIFHWADDR' sysSIOCGLIFHWADDR = syscall.SIOCGLIFHWADDR ^ All of them show as // unknowndefine SIOCGLIFMTU _IOWR('i', 122, struct lifreq) in gen-sysinfo.go. Not sure what's going on here... /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:73:31: error: invalid reference to unexported identifier 'syscall._sizeof_lifnum' sizeofLifnum = syscall._sizeof_lifnum ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:74:31: error: invalid reference to unexported identifier 'syscall._sizeof_lifreq' sizeofLifreq = syscall._sizeof_lifreq ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:75:31: error: invalid reference to unexported identifier 'syscall._sizeof_lifconf' sizeofLifconf = syscall._sizeof_lifconf ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:76:31: error: invalid reference to unexported identifier 'syscall._sizeof_lif_ifinfo_req' sizeofLifIfinfoReq = syscall._sizeof_lif_ifinfo_req ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:79:16: error: reference to undefined identifier 'syscall._lifnum' type sysLifnum syscall._lifnum ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:81:13: error: reference to undefined identifier 'syscall._lifreq' type lifreq syscall._lifreq ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:83:14: error: reference to undefined identifier 'syscall._lifconf' type lifconf syscall._lifconf ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:85:19: error: reference to undefined identifier 'syscall._lif_ifinfo_req' type lifIfinfoReq syscall._lif_ifinfo_req ^ The structs aren't exported yet, need handling in mksysinfo.sh, too, I believe. /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:88:24: error: reference to undefined identifier 'syscall.IFT_IPV4' sysIFT_IPV4 = syscall.IFT_IPV4 ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:89:24: error: reference to undefined identifier 'syscall.IFT_IPV6' sysIFT_IPV6 = syscall.IFT_IPV6 ^ /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/defs_solaris.go:90:24: error: reference to undefined identifier 'syscall.IFT_6TO4' sysIFT_6TO4 = syscall.IFT_6TO4 ^ Need exporting: mksysinfo.sh handling for _IFT_ -> IFT_ transform. /vol/gcc/src/hg/trunk/local/libgo/go/golang_org/x/net/lif/syscall.go:19:25: error: reference to undefined identifier 'syscall.Ioctl' _, _, errno := syscall.Ioctl(s, ioc, uintptr(arg)) ^ No idea what's wrong here... Rainer -- ----------------------------------------------------------------------------- Rainer Orth, Center for Biotechnology, Bielefeld University
diff --git a/libgo/configure.ac b/libgo/configure.ac --- a/libgo/configure.ac +++ b/libgo/configure.ac @@ -578,7 +578,7 @@ AC_C_BIGENDIAN GCC_CHECK_UNWIND_GETIPINFO -AC_CHECK_HEADERS(port.h sched.h semaphore.h sys/file.h sys/mman.h syscall.h sys/epoll.h sys/event.h sys/inotify.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/if.h net/if_arp.h net/route.h netpacket/packet.h sys/prctl.h sys/mount.h sys/vfs.h sys/statfs.h sys/timex.h sys/sysinfo.h utime.h linux/ether.h linux/fs.h linux/reboot.h netinet/icmp6.h netinet/in_syst.h netinet/ip.h netinet/ip_mroute.h netinet/if_ether.h) +AC_CHECK_HEADERS(port.h sched.h semaphore.h sys/file.h sys/mman.h syscall.h sys/epoll.h sys/event.h sys/inotify.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/if.h net/if_arp.h net/route.h netpacket/packet.h sys/prctl.h sys/mount.h sys/vfs.h sys/statfs.h sys/timex.h sys/sysinfo.h utime.h linux/ether.h linux/fs.h linux/reboot.h netinet/icmp6.h netinet/in_syst.h netinet/ip.h netinet/ip_mroute.h netinet/if_ether.h sys/sockio.h net/if_types.h) AC_CHECK_HEADERS([linux/filter.h linux/if_addr.h linux/if_ether.h linux/if_tun.h linux/netlink.h linux/rtnetlink.h], [], [], [#ifdef HAVE_SYS_SOCKET_H diff --git a/libgo/go/golang_org/x/net/lif/defs_solaris.go b/libgo/go/golang_org/x/net/lif/defs_solaris.go --- a/libgo/go/golang_org/x/net/lif/defs_solaris.go +++ b/libgo/go/golang_org/x/net/lif/defs_solaris.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build ignore +// +build solaris // +godefs map struct_in_addr [4]byte /* in_addr */ // +godefs map struct_in6_addr [16]byte /* in6_addr */ @@ -16,75 +16,76 @@ package lif #include <net/if.h> #include <net/if_types.h> */ -import "C" +import "syscall" const ( - sysAF_UNSPEC = C.AF_UNSPEC - sysAF_INET = C.AF_INET - sysAF_INET6 = C.AF_INET6 + sysAF_UNSPEC = syscall.AF_UNSPEC + sysAF_INET = syscall.AF_INET + sysAF_INET6 = syscall.AF_INET6 - sysSOCK_DGRAM = C.SOCK_DGRAM + sysSOCK_DGRAM = syscall.SOCK_DGRAM ) -type sockaddrStorage C.struct_sockaddr_storage +type sockaddrStorage syscall._sockaddr_storage const ( - sysLIFC_NOXMIT = C.LIFC_NOXMIT - sysLIFC_EXTERNAL_SOURCE = C.LIFC_EXTERNAL_SOURCE - sysLIFC_TEMPORARY = C.LIFC_TEMPORARY - sysLIFC_ALLZONES = C.LIFC_ALLZONES - sysLIFC_UNDER_IPMP = C.LIFC_UNDER_IPMP - sysLIFC_ENABLED = C.LIFC_ENABLED + sysLIFC_NOXMIT = syscall.LIFC_NOXMIT + sysLIFC_EXTERNAL_SOURCE = syscall.LIFC_EXTERNAL_SOURCE + sysLIFC_TEMPORARY = syscall.LIFC_TEMPORARY + sysLIFC_ALLZONES = syscall.LIFC_ALLZONES + sysLIFC_UNDER_IPMP = syscall.LIFC_UNDER_IPMP + // Not in Solaris 12, unused. + // sysLIFC_ENABLED = syscall.LIFC_ENABLED - sysSIOCGLIFADDR = C.SIOCGLIFADDR - sysSIOCGLIFDSTADDR = C.SIOCGLIFDSTADDR - sysSIOCGLIFFLAGS = C.SIOCGLIFFLAGS - sysSIOCGLIFMTU = C.SIOCGLIFMTU - sysSIOCGLIFNETMASK = C.SIOCGLIFNETMASK - sysSIOCGLIFMETRIC = C.SIOCGLIFMETRIC - sysSIOCGLIFNUM = C.SIOCGLIFNUM - sysSIOCGLIFINDEX = C.SIOCGLIFINDEX - sysSIOCGLIFSUBNET = C.SIOCGLIFSUBNET - sysSIOCGLIFLNKINFO = C.SIOCGLIFLNKINFO - sysSIOCGLIFCONF = C.SIOCGLIFCONF - sysSIOCGLIFHWADDR = C.SIOCGLIFHWADDR + sysSIOCGLIFADDR = syscall.SIOCGLIFADDR + sysSIOCGLIFDSTADDR = syscall.SIOCGLIFDSTADDR + sysSIOCGLIFFLAGS = syscall.SIOCGLIFFLAGS + sysSIOCGLIFMTU = syscall.SIOCGLIFMTU + sysSIOCGLIFNETMASK = syscall.SIOCGLIFNETMASK + sysSIOCGLIFMETRIC = syscall.SIOCGLIFMETRIC + sysSIOCGLIFNUM = syscall.SIOCGLIFNUM + sysSIOCGLIFINDEX = syscall.SIOCGLIFINDEX + sysSIOCGLIFSUBNET = syscall.SIOCGLIFSUBNET + sysSIOCGLIFLNKINFO = syscall.SIOCGLIFLNKINFO + sysSIOCGLIFCONF = syscall.SIOCGLIFCONF + sysSIOCGLIFHWADDR = syscall.SIOCGLIFHWADDR ) const ( - sysIFF_UP = C.IFF_UP - sysIFF_BROADCAST = C.IFF_BROADCAST - sysIFF_DEBUG = C.IFF_DEBUG - sysIFF_LOOPBACK = C.IFF_LOOPBACK - sysIFF_POINTOPOINT = C.IFF_POINTOPOINT - sysIFF_NOTRAILERS = C.IFF_NOTRAILERS - sysIFF_RUNNING = C.IFF_RUNNING - sysIFF_NOARP = C.IFF_NOARP - sysIFF_PROMISC = C.IFF_PROMISC - sysIFF_ALLMULTI = C.IFF_ALLMULTI - sysIFF_INTELLIGENT = C.IFF_INTELLIGENT - sysIFF_MULTICAST = C.IFF_MULTICAST - sysIFF_MULTI_BCAST = C.IFF_MULTI_BCAST - sysIFF_UNNUMBERED = C.IFF_UNNUMBERED - sysIFF_PRIVATE = C.IFF_PRIVATE + sysIFF_UP = syscall.IFF_UP + sysIFF_BROADCAST = syscall.IFF_BROADCAST + sysIFF_DEBUG = syscall.IFF_DEBUG + sysIFF_LOOPBACK = syscall.IFF_LOOPBACK + sysIFF_POINTOPOINT = syscall.IFF_POINTOPOINT + sysIFF_NOTRAILERS = syscall.IFF_NOTRAILERS + sysIFF_RUNNING = syscall.IFF_RUNNING + sysIFF_NOARP = syscall.IFF_NOARP + sysIFF_PROMISC = syscall.IFF_PROMISC + sysIFF_ALLMULTI = syscall.IFF_ALLMULTI + sysIFF_INTELLIGENT = syscall.IFF_INTELLIGENT + sysIFF_MULTICAST = syscall.IFF_MULTICAST + sysIFF_MULTI_BCAST = syscall.IFF_MULTI_BCAST + sysIFF_UNNUMBERED = syscall.IFF_UNNUMBERED + sysIFF_PRIVATE = syscall.IFF_PRIVATE ) const ( - sizeofLifnum = C.sizeof_struct_lifnum - sizeofLifreq = C.sizeof_struct_lifreq - sizeofLifconf = C.sizeof_struct_lifconf - sizeofLifIfinfoReq = C.sizeof_struct_lif_ifinfo_req + sizeofLifnum = syscall._sizeof_lifnum + sizeofLifreq = syscall._sizeof_lifreq + sizeofLifconf = syscall._sizeof_lifconf + sizeofLifIfinfoReq = syscall._sizeof_lif_ifinfo_req ) -type sysLifnum C.struct_lifnum +type sysLifnum syscall._lifnum -type lifreq C.struct_lifreq +type lifreq syscall._lifreq -type lifconf C.struct_lifconf +type lifconf syscall._lifconf -type lifIfinfoReq C.struct_lif_ifinfo_req +type lifIfinfoReq syscall._lif_ifinfo_req const ( - sysIFT_IPV4 = C.IFT_IPV4 - sysIFT_IPV6 = C.IFT_IPV6 - sysIFT_6TO4 = C.IFT_6TO4 + sysIFT_IPV4 = syscall.IFT_IPV4 + sysIFT_IPV6 = syscall.IFT_IPV6 + sysIFT_6TO4 = syscall.IFT_6TO4 ) diff --git a/libgo/go/golang_org/x/net/lif/syscall.go b/libgo/go/golang_org/x/net/lif/syscall.go --- a/libgo/go/golang_org/x/net/lif/syscall.go +++ b/libgo/go/golang_org/x/net/lif/syscall.go @@ -11,20 +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) func ioctl(s, ioc uintptr, arg unsafe.Pointer) error { - _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procIoctl)), 3, s, ioc, uintptr(arg), 0, 0, 0) + _, _, errno := syscall.Ioctl(s, ioc, uintptr(arg)) keepAlive(arg) if errno != 0 { return error(errno) diff --git a/libgo/sysinfo.c b/libgo/sysinfo.c --- a/libgo/sysinfo.c +++ b/libgo/sysinfo.c @@ -82,6 +82,9 @@ #if defined(HAVE_SYS_SELECT_H) #include <sys/select.h> #endif +#if defined(HAVE_SYS_SOCKIO_H) +#include <sys/sockio.h> +#endif #include <time.h> #include <unistd.h> #include <netdb.h> @@ -111,6 +114,9 @@ #if defined(HAVE_NET_IF_ARP_H) #include <net/if_arp.h> #endif +#if defined(HAVE_NET_IF_TYPES_H) +#include <net/if_types.h> +#endif #if defined(HAVE_NET_ROUTE_H) #include <net/route.h> #endif