|  | #!/bin/sh | 
|  |  | 
|  | # 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. | 
|  |  | 
|  | # Create runtime_sysinfo.go from gen-sysinfo.go and errno.i. | 
|  |  | 
|  | OUT=tmp-runtime_sysinfo.go | 
|  |  | 
|  | set -e | 
|  |  | 
|  | echo 'package runtime' > ${OUT} | 
|  |  | 
|  | # Get all the consts and types, skipping ones which could not be | 
|  | # represented in Go and ones which we need to rewrite.  We also skip | 
|  | # function declarations, as we don't need them here.  All the symbols | 
|  | # will all have a leading underscore. | 
|  | grep -v '^// ' gen-sysinfo.go | \ | 
|  | grep -v '^func' | \ | 
|  | grep -v '^var ' | \ | 
|  | grep -v '^type _timeval ' | \ | 
|  | grep -v '^type _timespec_t ' | \ | 
|  | grep -v '^type _timespec ' | \ | 
|  | grep -v '^type _epoll_' | \ | 
|  | grep -v '^type _*locale[_ ]' | \ | 
|  | grep -v 'in6_addr' | \ | 
|  | grep -v 'sockaddr_in6' | \ | 
|  | sed -e 's/\([^a-zA-Z0-9_]\)_timeval\([^a-zA-Z0-9_]\)/\1timeval\2/g' \ | 
|  | -e 's/\([^a-zA-Z0-9_]\)_timespec_t\([^a-zA-Z0-9_]\)/\1timespec\2/g' \ | 
|  | -e 's/\([^a-zA-Z0-9_]\)_timespec\([^a-zA-Z0-9_]\)/\1timespec\2/g' \ | 
|  | >> ${OUT} | 
|  |  | 
|  | # On AIX, the _arpcom struct, is filtered by the above grep sequence, as it as | 
|  | # a field of type _in6_addr, but other types depend on _arpcom, so we need to | 
|  | # put it back. | 
|  | grep '^type _arpcom ' gen-sysinfo.go | \ | 
|  | sed -e 's/_in6_addr/[16]byte/' >> ${OUT} | 
|  |  | 
|  | # Same on Solaris for _mld_hdr_t. | 
|  | grep '^type _mld_hdr_t ' gen-sysinfo.go | \ | 
|  | sed -e 's/_in6_addr/[16]byte/' >> ${OUT} | 
|  |  | 
|  | # The time structures need special handling: we need to name the | 
|  | # types, so that we can cast integers to the right types when | 
|  | # assigning to the structures. | 
|  | timeval=`grep '^type _timeval ' gen-sysinfo.go` | 
|  | timeval_sec=`echo $timeval | sed -n -e 's/^.*tv_sec \([^ ]*\);.*$/\1/p'` | 
|  | timeval_usec=`echo $timeval | sed -n -e 's/^.*tv_usec \([^ ]*\);.*$/\1/p'` | 
|  | echo "type timeval_sec_t $timeval_sec" >> ${OUT} | 
|  | echo "type timeval_usec_t $timeval_usec" >> ${OUT} | 
|  | echo $timeval | \ | 
|  | sed -e 's/type _timeval /type timeval /' \ | 
|  | -e 's/tv_sec *[a-zA-Z0-9_]*/tv_sec timeval_sec_t/' \ | 
|  | -e 's/tv_usec *[a-zA-Z0-9_]*/tv_usec timeval_usec_t/' >> ${OUT} | 
|  | echo >> ${OUT} | 
|  | echo "func (tv *timeval) set_usec(x int32) {" >> ${OUT} | 
|  | echo "	tv.tv_usec = timeval_usec_t(x)" >> ${OUT} | 
|  | echo "}" >> ${OUT} | 
|  |  | 
|  | timespec=`grep '^type _timespec ' gen-sysinfo.go || true` | 
|  | if test "$timespec" = ""; then | 
|  | # IRIX 6.5 has __timespec instead. | 
|  | timespec=`grep '^type ___timespec ' gen-sysinfo.go || true` | 
|  | fi | 
|  | timespec_sec=`echo $timespec | sed -n -e 's/^.*tv_sec \([^ ]*\);.*$/\1/p'` | 
|  | timespec_nsec=`echo $timespec | sed -n -e 's/^.*tv_nsec \([^ ]*\);.*$/\1/p'` | 
|  | echo "type timespec_sec_t $timespec_sec" >> ${OUT} | 
|  | echo "type timespec_nsec_t $timespec_nsec" >> ${OUT} | 
|  | echo $timespec | \ | 
|  | sed -e 's/^type ___timespec /type timespec /' \ | 
|  | -e 's/^type _timespec /type timespec /' \ | 
|  | -e 's/tv_sec *[a-zA-Z0-9_]*/tv_sec timespec_sec_t/' \ | 
|  | -e 's/tv_nsec *[a-zA-Z0-9_]*/tv_nsec timespec_nsec_t/' >> ${OUT} | 
|  | echo >> ${OUT} | 
|  | echo "func (ts *timespec) set_sec(x int64) {" >> ${OUT} | 
|  | echo "	ts.tv_sec = timespec_sec_t(x)" >> ${OUT} | 
|  | echo "}" >> ${OUT} | 
|  | echo >> ${OUT} | 
|  | echo "func (ts *timespec) set_nsec(x int32) {" >> ${OUT} | 
|  | echo "	ts.tv_nsec = timespec_nsec_t(x)" >> ${OUT} | 
|  | echo "}" >> ${OUT} | 
|  |  | 
|  | # Define the epollevent struct.  This needs special attention because | 
|  | # the C definition uses a union and is sometimes packed. | 
|  | if grep '^const _epoll_data_offset ' ${OUT} >/dev/null 2>&1; then | 
|  | val=`grep '^const _epoll_data_offset ' ${OUT} | sed -e 's/const _epoll_data_offset = \(.*\)$/\1/'` | 
|  | if test "$val" = "4"; then | 
|  | echo 'type epollevent struct { events uint32; data [8]byte }' >> ${OUT} | 
|  | elif test "$val" = "8"; then | 
|  | if test "$GOARCH" = "sparc64" -a "$GOOS" = "linux"; then | 
|  | echo 'type epollevent struct { events uint32; pad [4]byte; data [8]byte; _align [0]int64 }' >> ${OUT} | 
|  | else | 
|  | echo 'type epollevent struct { events uint32; pad [4]byte; data [8]byte }' >> ${OUT} | 
|  | fi | 
|  | else | 
|  | echo 1>&2 "unknown epoll data offset value ${val}" | 
|  | exit 1 | 
|  | fi | 
|  | fi | 
|  | # Make sure EPOLLET is positive. | 
|  | if grep '^const _EPOLLET = [0-9]' gen-sysinfo.go > /dev/null 2>&1; then | 
|  | echo "const _EPOLLETpos = _EPOLLET" >> ${OUT} | 
|  | else | 
|  | echo "const _EPOLLETpos = 0x80000000" >> ${OUT} | 
|  | fi | 
|  | # Make sure EPOLLRDHUP and EPOLL_CLOEXEC are defined. | 
|  | if ! grep '^const _EPOLLRDHUP' ${OUT} >/dev/null 2>&1; then | 
|  | echo "const _EPOLLRDHUP = 0x2000" >> ${OUT} | 
|  | fi | 
|  | if ! grep '^const _EPOLL_CLOEXEC' ${OUT} >/dev/null 2>&1; then | 
|  | echo "const _EPOLL_CLOEXEC = 02000000" >> ${OUT} | 
|  | fi | 
|  |  | 
|  | # AIX 7.1 is a 64 bits value for _FCLOEXEC (referenced by O_CLOEXEC) | 
|  | # which leads to a constant overflow when using O_CLOEXEC in some | 
|  | # go code. Issue wan not present in 6.1 (no O_CLOEXEC) and is no | 
|  | # more present in 7.2 (_FCLOEXEC is a 32 bit value). | 
|  | if test "${GOOS}" = "aix" && `oslevel | grep -q "^7.1"`; then | 
|  | sed -e 's/const __FCLOEXEC = .*/const __FCLOEXEC = 0/' ${OUT} > ${OUT}-2 | 
|  | mv ${OUT}-2 ${OUT} | 
|  | fi | 
|  |  | 
|  | # Make sure _MAP_FAILED is defined. | 
|  | if ! grep '^const _MAP_FAILED =' gen-sysinfo.go > /dev/null 2>&1; then | 
|  | echo "const _MAP_FAILED = ^uintptr(0)" >> ${OUT} | 
|  | fi | 
|  | # Make sure _MAP_ANON is defined. | 
|  | if ! grep '^const _MAP_ANON =' gen-sysinfo.go > /dev/null 2>&1; then | 
|  | if grep '^const _MAP_ANONYMOUS ' gen-sysinfo.go > /dev/null 2>&1; then | 
|  | echo "const _MAP_ANON = _MAP_ANONYMOUS" >> ${OUT} | 
|  | else | 
|  | echo "const _MAP_ANON = 0" >> ${OUT} | 
|  | fi | 
|  | fi | 
|  | # Make sure _MADV_DONTNEED is defined. | 
|  | if ! grep '^const _MADV_DONTNEED =' gen-sysinfo.go > /dev/null 2>&1; then | 
|  | echo "const _MADV_DONTNEED = 0" >> ${OUT} | 
|  | fi | 
|  | # Make sure _MADV_FREE is defined. | 
|  | if ! grep '^const _MADV_FREE =' gen-sysinfo.go > /dev/null 2>&1; then | 
|  | echo "const _MADV_FREE = 0" >> ${OUT} | 
|  | fi | 
|  | # Make sure _MADV_HUGEPAGE is defined. | 
|  | if ! grep '^const _MADV_HUGEPAGE =' gen-sysinfo.go > /dev/null 2>&1; then | 
|  | echo "const _MADV_HUGEPAGE = 0" >> ${OUT} | 
|  | fi | 
|  | # Make sure _MADV_NOHUGEPAGE is defined. | 
|  | if ! grep '^const _MADV_NOHUGEPAGE =' gen-sysinfo.go > /dev/null 2>&1; then | 
|  | echo "const _MADV_NOHUGEPAGE = 0" >> ${OUT} | 
|  | fi | 
|  |  | 
|  | # The semt structure, for Solaris. | 
|  | grep '^type _sem_t ' gen-sysinfo.go | \ | 
|  | sed -e 's/_sem_t/semt/' >> ${OUT} | 
|  |  | 
|  | # Solaris 2 needs _u?pad128_t, but its default definition in terms of long | 
|  | # double is commented by -fdump-go-spec. | 
|  | if grep "^// type _pad128_t" gen-sysinfo.go > /dev/null 2>&1; then | 
|  | echo "type _pad128_t struct { _l [4]int32; }" >> ${OUT} | 
|  | fi | 
|  | if grep "^// type _upad128_t" gen-sysinfo.go > /dev/null 2>&1; then | 
|  | echo "type _upad128_t struct { _l [4]uint32; }" >> ${OUT} | 
|  | fi | 
|  |  | 
|  | # The Solaris 11 Update 1 _zone_net_addr_t struct. | 
|  | grep '^type _zone_net_addr_t ' gen-sysinfo.go | \ | 
|  | sed -e 's/_in6_addr/[16]byte/' \ | 
|  | >> ${OUT} | 
|  |  | 
|  | # The Solaris 11.4 _flow_arp_desc_t struct. | 
|  | grep '^type _flow_arp_desc_t ' gen-sysinfo.go | \ | 
|  | sed -e 's/_in6_addr_t/[16]byte/g' \ | 
|  | >> ${OUT} | 
|  |  | 
|  | # The Solaris 11.4 _flow_l3_desc_t struct. | 
|  | grep '^type _flow_l3_desc_t ' gen-sysinfo.go | \ | 
|  | sed -e 's/_in6_addr_t/[16]byte/g' \ | 
|  | >> ${OUT} | 
|  |  | 
|  | # The Solaris 11.3 _mac_ipaddr_t struct. | 
|  | grep '^type _mac_ipaddr_t ' gen-sysinfo.go | \ | 
|  | sed -e 's/_in6_addr_t/[16]byte/g' \ | 
|  | >> ${OUT} | 
|  |  | 
|  | # The Solaris 11.3 _mactun_info_t struct. | 
|  | grep '^type _mactun_info_t ' gen-sysinfo.go | \ | 
|  | sed -e 's/_in6_addr_t/[16]byte/g' \ | 
|  | >> ${OUT} | 
|  |  | 
|  | # The Solaris port_event_t struct. | 
|  | grep '^type _port_event_t ' gen-sysinfo.go | \ | 
|  | sed -e s'/_port_event_t/portevent/' \ | 
|  | >> ${OUT} | 
|  |  | 
|  | # The *BSD kevent struct. | 
|  | grep '^type _kevent ' gen-sysinfo.go | \ | 
|  | sed -e s'/_kevent/keventt/' \ | 
|  | -e 's/ udata [^;}]*/ udata *byte/' \ | 
|  | >> ${OUT} |