gcc/libgo/mksysinfo.sh
Ian Lance Taylor 75791bab05 runtime: use -fgo-c-header to build C header file
Use the new -fgo-c-header option to build a header file for the Go
    runtime code in libgo/go/runtime, and use the new header file in the C
    runtime code in libgo/runtime.  This will ensure that the Go code and C
    code share the same data structures as we convert the runtime from C to
    Go.
    
    The new file libgo/go/runtime/runtime2.go is copied from the Go 1.7
    release, and then edited to remove unnecessary data structures and
    modify others for use with libgo.
    
    The new file libgo/go/runtime/mcache.go is an initial version of the
    same files in the Go 1.7 release, and will be replaced by the Go 1.7
    file when we convert to the new memory allocator.
    
    The new file libgo/go/runtime/type.go describes the gccgo version of the
    reflection data structures, and replaces the Go 1.7 runtime file which
    describes the gc version of those structures.
    
    Using the new header file means changing a number of struct fields to
    use Go naming conventions (that is, no underscores) and to rename
    constants to have a leading underscore so that they are not exported
    from the Go package.  These names were updated in the C code.
    
    The C code was also changed to drop the thread-local variable m, as was
    done some time ago in the gc sources.  Now the m field is always
    accessed using g->m, where g is the single remaining thread-local
    variable.  This in turn required some adjustments to set g->m correctly
    in all cases.
    
    Also pass the new -fgo-compiling-runtime option when compiling the
    runtime package, although that option doesn't do anything yet.
    
    Reviewed-on: https://go-review.googlesource.com/28051

From-SVN: r239872
2016-08-30 21:07:47 +00:00

1542 lines
49 KiB
Bash
Executable File

#!/bin/sh
# Copyright 2009 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 sysinfo.go.
# This shell script creates the sysinfo.go file which holds types and
# constants extracted from the system header files. This relies on a
# hook in gcc: the -fdump-go-spec option will generate debugging
# information in Go syntax.
# We currently #include all the files at once, which works, but leads
# to exposing some names which ideally should not be exposed, as they
# match grep patterns. E.g., WCHAR_MIN gets exposed because it starts
# with W, like the wait flags.
CC=${CC:-gcc}
OUT=tmp-sysinfo.go
set -e
rm -f sysinfo.c
cat > sysinfo.c <<EOF
#include "config.h"
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <ucontext.h>
#include <netinet/in.h>
/* <netinet/tcp.h> needs u_char/u_short, but <sys/bsd_types> is only
included by <netinet/in.h> if _SGIAPI (i.e. _SGI_SOURCE
&& !_XOPEN_SOURCE.
<sys/termios.h> only defines TIOCNOTTY if !_XOPEN_SOURCE, while
<sys/ttold.h> does so unconditionally. */
#ifdef __sgi__
#include <sys/bsd_types.h>
#include <sys/ttold.h>
#endif
#include <netinet/tcp.h>
#if defined(HAVE_NETINET_IN_SYSTM_H)
#include <netinet/in_systm.h>
#endif
#if defined(HAVE_NETINET_IP_H)
#include <netinet/ip.h>
#endif
#if defined(HAVE_NETINET_IP_MROUTE_H)
#include <netinet/ip_mroute.h>
#endif
#if defined(HAVE_NETINET_IF_ETHER_H)
#include <netinet/if_ether.h>
#endif
#include <signal.h>
#include <sys/ioctl.h>
#include <termios.h>
#if defined(HAVE_SYSCALL_H)
#include <syscall.h>
#endif
#if defined(HAVE_SYS_SYSCALL_H)
#include <sys/syscall.h>
#endif
#if defined(HAVE_SYS_EPOLL_H)
#include <sys/epoll.h>
#endif
#if defined(HAVE_SYS_FILE_H)
#include <sys/file.h>
#endif
#if defined(HAVE_SYS_MMAN_H)
#include <sys/mman.h>
#endif
#if defined(HAVE_SYS_PRCTL_H)
#include <sys/prctl.h>
#endif
#if defined(HAVE_SYS_PTRACE_H)
#include <sys/ptrace.h>
#endif
#include <sys/resource.h>
#include <sys/uio.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/wait.h>
#include <sys/un.h>
#if defined(HAVE_SYS_USER_H)
#include <sys/user.h>
#endif
#if defined(HAVE_SYS_UTSNAME_H)
#include <sys/utsname.h>
#endif
#if defined(HAVE_SYS_SELECT_H)
#include <sys/select.h>
#endif
#include <time.h>
#include <unistd.h>
#include <netdb.h>
#include <pwd.h>
#include <grp.h>
#if defined(HAVE_LINUX_FILTER_H)
#include <linux/filter.h>
#endif
#if defined(HAVE_LINUX_IF_ADDR_H)
#include <linux/if_addr.h>
#endif
#if defined(HAVE_LINUX_IF_ETHER_H)
#include <linux/if_ether.h>
#endif
#if defined(HAVE_LINUX_IF_TUN_H)
#include <linux/if_tun.h>
#endif
#if defined(HAVE_LINUX_NETLINK_H)
#include <linux/netlink.h>
#endif
#if defined(HAVE_LINUX_RTNETLINK_H)
#include <linux/rtnetlink.h>
#endif
#if defined(HAVE_NET_IF_H)
#include <net/if.h>
#endif
#if defined(HAVE_NET_IF_ARP_H)
#include <net/if_arp.h>
#endif
#if defined(HAVE_NET_ROUTE_H)
#include <net/route.h>
#endif
#if defined (HAVE_NETPACKET_PACKET_H)
#include <netpacket/packet.h>
#endif
#if defined(HAVE_SYS_MOUNT_H)
#include <sys/mount.h>
#endif
#if defined(HAVE_SYS_VFS_H)
#include <sys/vfs.h>
#endif
#if defined(HAVE_STATFS_H)
#include <sys/statfs.h>
#endif
#if defined(HAVE_SYS_TIMEX_H)
#include <sys/timex.h>
#endif
#if defined(HAVE_SYS_SYSINFO_H)
#include <sys/sysinfo.h>
#endif
#if defined(HAVE_USTAT_H)
#include <ustat.h>
#endif
#if defined(HAVE_UTIME_H)
#include <utime.h>
#endif
#if defined(HAVE_LINUX_ETHER_H)
#include <linux/ether.h>
#endif
#if defined(HAVE_LINUX_FS_H)
#include <linux/fs.h>
#endif
#if defined(HAVE_LINUX_REBOOT_H)
#include <linux/reboot.h>
#endif
#if defined(HAVE_SYS_INOTIFY_H)
#include <sys/inotify.h>
#endif
#if defined(HAVE_NETINET_ICMP6_H)
#include <netinet/icmp6.h>
#endif
#if defined(HAVE_SCHED_H)
#include <sched.h>
#endif
/* Constants that may only be defined as expressions on some systems,
expressions too complex for -fdump-go-spec to handle. These are
handled specially below. */
enum {
#ifdef TIOCGWINSZ
TIOCGWINSZ_val = TIOCGWINSZ,
#endif
#ifdef TIOCSWINSZ
TIOCSWINSZ_val = TIOCSWINSZ,
#endif
#ifdef TIOCNOTTY
TIOCNOTTY_val = TIOCNOTTY,
#endif
#ifdef TIOCSCTTY
TIOCSCTTY_val = TIOCSCTTY,
#endif
#ifdef TIOCGPGRP
TIOCGPGRP_val = TIOCGPGRP,
#endif
#ifdef TIOCSPGRP
TIOCSPGRP_val = TIOCSPGRP,
#endif
#ifdef TIOCGPTN
TIOCGPTN_val = TIOCGPTN,
#endif
#ifdef TIOCSPTLCK
TIOCSPTLCK_val = TIOCSPTLCK,
#endif
#ifdef TIOCGDEV
TIOCGDEV_val = TIOCGDEV,
#endif
#ifdef TIOCSIG
TIOCSIG_val = TIOCSIG,
#endif
#ifdef TCGETS
TCGETS_val = TCGETS,
#endif
#ifdef TCSETS
TCSETS_val = TCSETS,
#endif
#ifdef TUNSETIFF
TUNSETIFF_val = TUNSETIFF,
#endif
#ifdef TUNSETNOCSUM
TUNSETNOCSUM_val = TUNSETNOCSUM,
#endif
#ifdef TUNSETDEBUG
TUNSETDEBUG_val = TUNSETDEBUG,
#endif
#ifdef TUNSETPERSIST
TUNSETPERSIST_val = TUNSETPERSIST,
#endif
#ifdef TUNSETOWNER
TUNSETOWNER_val = TUNSETOWNER,
#endif
#ifdef TUNSETLINK
TUNSETLINK_val = TUNSETLINK,
#endif
#ifdef TUNSETGROUP
TUNSETGROUP_val = TUNSETGROUP,
#endif
#ifdef TUNGETFEATURES
TUNGETFEATURES_val = TUNGETFEATURES,
#endif
#ifdef TUNSETOFFLOAD
TUNSETOFFLOAD_val = TUNSETOFFLOAD,
#endif
#ifdef TUNSETTXFILTER
TUNSETTXFILTER_val = TUNSETTXFILTER,
#endif
#ifdef TUNGETIFF
TUNGETIFF_val = TUNGETIFF,
#endif
#ifdef TUNGETSNDBUF
TUNGETSNDBUF_val = TUNGETSNDBUF,
#endif
#ifdef TUNSETSNDBUF
TUNSETSNDBUF_val = TUNSETSNDBUF,
#endif
#ifdef TUNATTACHFILTER
TUNATTACHFILTER_val = TUNATTACHFILTER,
#endif
#ifdef TUNDETACHFILTER
TUNDETACHFILTER_val = TUNDETACHFILTER,
#endif
#ifdef TUNGETVNETHDRSZ
TUNGETVNETHDRSZ_val = TUNGETVNETHDRSZ,
#endif
#ifdef TUNSETVNETHDRSZ
TUNSETVNETHDRSZ_val = TUNSETVNETHDRSZ,
#endif
#ifdef TUNSETQUEUE
TUNSETQUEUE_val = TUNSETQUEUE,
#endif
#ifdef TUNSETIFINDEX
TUNSETIFINDEX_val = TUNSETIFINDEX,
#endif
#ifdef TUNGETFILTER
TUNGETFILTER_val = TUNGETFILTER,
#endif
#ifdef NLA_HDRLEN
NLA_HDRLEN_val = NLA_HDRLEN,
#endif
};
EOF
${CC} -fdump-go-spec=gen-sysinfo.go -std=gnu99 -S -o sysinfo.s sysinfo.c
echo 'package syscall' > ${OUT}
echo 'import "unsafe"' >> ${OUT}
echo 'type _ unsafe.Pointer' >> ${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 '^type _timeval ' | \
grep -v '^type _timespec_t ' | \
grep -v '^type _timespec ' | \
grep -v '^type _timestruc_t ' | \
grep -v '^type _epoll_' | \
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' \
-e 's/\([^a-zA-Z0-9_]\)_timestruc_t\([^a-zA-Z0-9_]\)/\1Timestruc\2/g' \
>> ${OUT}
# The errno constants. These get type Errno.
echo '#include <errno.h>' | ${CC} -x c - -E -dM | \
egrep '#define E[A-Z0-9_]+ ' | \
sed -e 's/^#define \(E[A-Z0-9_]*\) .*$/const \1 = Errno(_\1)/' >> ${OUT}
# The O_xxx flags.
egrep '^const _(O|F|FD)_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\([^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
if ! grep '^const O_ASYNC' ${OUT} >/dev/null 2>&1; then
echo "const O_ASYNC = 0" >> ${OUT}
fi
if ! grep '^const O_CLOEXEC' ${OUT} >/dev/null 2>&1; then
echo "const O_CLOEXEC = 0" >> ${OUT}
fi
# The os package requires F_DUPFD_CLOEXEC to be defined.
if ! grep '^const F_DUPFD_CLOEXEC' ${OUT} >/dev/null 2>&1; then
echo "const F_DUPFD_CLOEXEC = 0" >> ${OUT}
fi
# These flags can be lost on i386 GNU/Linux when using
# -D_FILE_OFFSET_BITS=64, because we see "#define F_SETLK F_SETLK64"
# before we see the definition of F_SETLK64.
for flag in F_GETLK F_SETLK F_SETLKW; do
if ! grep "^const ${flag} " ${OUT} >/dev/null 2>&1 \
&& grep "^const ${flag}64 " ${OUT} >/dev/null 2>&1; then
echo "const ${flag} = ${flag}64" >> ${OUT}
fi
done
# The Flock_t struct for fcntl.
grep '^type _flock ' gen-sysinfo.go | \
sed -e 's/type _flock/type Flock_t/' \
-e 's/l_type/Type/' \
-e 's/l_whence/Whence/' \
-e 's/l_start/Start/' \
-e 's/l_len/Len/' \
-e 's/l_pid/Pid/' \
>> ${OUT}
# The signal numbers.
grep '^const _SIG[^_]' gen-sysinfo.go | \
grep -v '^const _SIGEV_' | \
sed -e 's/^\(const \)_\(SIG[^= ]*\)\(.*\)$/\1\2 = Signal(_\2)/' >> ${OUT}
if ! grep '^const SIGPOLL ' ${OUT} >/dev/null 2>&1; then
if grep '^const SIGIO ' ${OUT} > /dev/null 2>&1; then
echo "const SIGPOLL = SIGIO" >> ${OUT}
fi
fi
if ! grep '^const SIGCLD ' ${OUT} >/dev/null 2>&1; then
if grep '^const SIGCHLD ' ${OUT} >/dev/null 2>&1; then
echo "const SIGCLD = SIGCHLD" >> ${OUT}
fi
fi
# The syscall numbers. We force the names to upper case.
grep '^const _SYS_' gen-sysinfo.go | \
sed -e 's/const _\(SYS_[^= ]*\).*$/\1/' | \
while read sys; do
sup=`echo $sys | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
echo "const $sup = _$sys" >> ${OUT}
done
# The GNU/Linux support wants to use SYS_GETDENTS64 if available.
if ! grep '^const SYS_GETDENTS ' ${OUT} >/dev/null 2>&1; then
echo "const SYS_GETDENTS = 0" >> ${OUT}
fi
if ! grep '^const SYS_GETDENTS64 ' ${OUT} >/dev/null 2>&1; then
echo "const SYS_GETDENTS64 = 0" >> ${OUT}
fi
# Stat constants.
grep '^const _S_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(S_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# Mmap constants.
grep '^const _PROT_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(PROT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _MAP_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(MAP_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _MADV_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(MADV_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _MCL_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(MCL_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# Process status constants.
grep '^const _W' gen-sysinfo.go |
sed -e 's/^\(const \)_\(W[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# WSTOPPED was introduced in glibc 2.3.4.
if ! grep '^const _WSTOPPED = ' gen-sysinfo.go >/dev/null 2>&1; then
if grep '^const _WUNTRACED = ' gen-sysinfo.go > /dev/null 2>&1; then
echo 'const WSTOPPED = _WUNTRACED' >> ${OUT}
else
echo 'const WSTOPPED = 2' >> ${OUT}
fi
fi
if grep '^const ___WALL = ' gen-sysinfo.go >/dev/null 2>&1 \
&& ! grep '^const _WALL = ' gen-sysinfo.go >/dev/null 2>&1; then
echo 'const WALL = ___WALL' >> ${OUT}
fi
# Networking constants.
egrep '^const _(AF|ARPHRD|ETH|IN|SOCK|SOL|SO|IPPROTO|TCP|IP|IPV6)_' gen-sysinfo.go |
sed -e 's/^\(const \)_\([^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _SOMAXCONN' gen-sysinfo.go |
sed -e 's/^\(const \)_\(SOMAXCONN[^= ]*\)\(.*\)$/\1\2 = _\2/' \
>> ${OUT}
grep '^const _SHUT_' gen-sysinfo.go |
sed -e 's/^\(const \)_\(SHUT[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The net package requires some const definitions.
for m in IP_PKTINFO IPV6_V6ONLY IPPROTO_IPV6 IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_TCLASS SO_REUSEPORT; do
if ! grep "^const $m " ${OUT} >/dev/null 2>&1; then
echo "const $m = 0" >> ${OUT}
fi
done
for m in SOCK_CLOEXEC SOCK_NONBLOCK; do
if ! grep "^const $m " ${OUT} >/dev/null 2>&1; then
echo "const $m = -1" >> ${OUT}
fi
done
# The syscall package requires AF_LOCAL.
if ! grep '^const AF_LOCAL ' ${OUT} >/dev/null 2>&1; then
if grep '^const AF_UNIX ' ${OUT} >/dev/null 2>&1; then
echo "const AF_LOCAL = AF_UNIX" >> ${OUT}
fi
fi
# sysconf constants.
grep '^const __SC' gen-sysinfo.go |
sed -e 's/^\(const \)__\(SC[^= ]*\)\(.*\)$/\1\2 = __\2/' >> ${OUT}
# pathconf constants.
grep '^const __PC' gen-sysinfo.go |
sed -e 's/^\(const \)__\(PC[^= ]*\)\(.*\)$/\1\2 = __\2/' >> ${OUT}
# The PATH_MAX constant.
if grep '^const _PATH_MAX ' gen-sysinfo.go >/dev/null 2>&1; then
echo 'const PathMax = _PATH_MAX' >> ${OUT}
fi
# epoll constants.
grep '^const _EPOLL' gen-sysinfo.go |
sed -e 's/^\(const \)_\(EPOLL[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# 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
# Prctl constants.
grep '^const _PR_' gen-sysinfo.go |
sed -e 's/^\(const \)_\(PR_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# Ptrace constants.
grep '^const _PTRACE' gen-sysinfo.go |
sed -e 's/^\(const \)_\(PTRACE[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# We need some ptrace options that are not defined in older versions
# of glibc.
if ! grep '^const PTRACE_SETOPTIONS' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_SETOPTIONS = 0x4200" >> ${OUT}
fi
if ! grep '^const PTRACE_O_TRACESYSGOOD' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_O_TRACESYSGOOD = 0x1" >> ${OUT}
fi
if ! grep '^const PTRACE_O_TRACEFORK' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_O_TRACEFORK = 0x2" >> ${OUT}
fi
if ! grep '^const PTRACE_O_TRACEVFORK' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_O_TRACEVFORK = 0x4" >> ${OUT}
fi
if ! grep '^const PTRACE_O_TRACECLONE' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_O_TRACECLONE = 0x8" >> ${OUT}
fi
if ! grep '^const PTRACE_O_TRACEEXEC' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_O_TRACEEXEC = 0x10" >> ${OUT}
fi
if ! grep '^const PTRACE_O_TRACEVFORKDONE' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_O_TRACEVFORKDONE = 0x20" >> ${OUT}
fi
if ! grep '^const PTRACE_O_TRACEEXIT' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_O_TRACEEXIT = 0x40" >> ${OUT}
fi
if ! grep '^const PTRACE_O_MASK' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_O_MASK = 0x7f" >> ${OUT}
fi
if ! grep '^const _PTRACE_GETEVENTMSG' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_GETEVENTMSG = 0x4201" >> ${OUT}
fi
if ! grep '^const PTRACE_EVENT_FORK' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_EVENT_FORK = 1" >> ${OUT}
fi
if ! grep '^const PTRACE_EVENT_VFORK' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_EVENT_VFORK = 2" >> ${OUT}
fi
if ! grep '^const PTRACE_EVENT_CLONE' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_EVENT_CLONE = 3" >> ${OUT}
fi
if ! grep '^const PTRACE_EVENT_EXEC' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_EVENT_EXEC = 4" >> ${OUT}
fi
if ! grep '^const PTRACE_EVENT_VFORK_DONE' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_EVENT_VFORK_DONE = 5" >> ${OUT}
fi
if ! grep '^const PTRACE_EVENT_EXIT' ${OUT} > /dev/null 2>&1; then
echo "const PTRACE_EVENT_EXIT = 6" >> ${OUT}
fi
if ! grep '^const _PTRACE_TRACEME' ${OUT} > /dev/null 2>&1; then
echo "const _PTRACE_TRACEME = 0" >> ${OUT}
fi
# A helper function that prints a structure from gen-sysinfo.go with the first
# letter of the field names in upper case. $1 is the name of structure. If $2
# is not empty, the structure or type is renamed to $2.
upcase_fields () {
name="$1"
def=`grep "^type $name" gen-sysinfo.go`
fields=`echo $def | sed -e 's/^[^{]*{\(.*\)}$/\1/'`
prefix=`echo $def | sed -e 's/{.*//'`
if test "$2" != ""; then
prefix=`echo $prefix | sed -e "s/$1/$2/"`
fi
if test "$fields" != ""; then
nfields=
while test -n "$fields"; do
field=`echo $fields | sed -e 's/^\([^;]*\);.*$/\1/'`
fields=`echo $fields | sed -e 's/^[^;]*; *\(.*\)$/\1/'`
# capitalize the next character.
f=`echo $field | sed -e 's/^\(.\).*$/\1/'`
r=`echo $field | sed -e 's/^.\(.*\)$/\1/'`
f=`echo $f | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
field="$f$r"
nfields="$nfields $field;"
done
echo "${prefix} {$nfields }"
fi
}
# The registers returned by PTRACE_GETREGS. This is probably
# GNU/Linux specific; it should do no harm if there is no
# _user_regs_struct.
regs=`grep '^type _user_regs_struct struct' gen-sysinfo.go || true`
if test "$regs" = ""; then
# s390
regs=`grep '^type __user_regs_struct struct' gen-sysinfo.go || true`
if test "$regs" != ""; then
# Substructures of __user_regs_struct on s390
upcase_fields "__user_psw_struct" "PtracePsw" >> ${OUT} || true
upcase_fields "__user_fpregs_struct" "PtraceFpregs" >> ${OUT} || true
upcase_fields "__user_per_struct" "PtracePer" >> ${OUT} || true
fi
fi
if test "$regs" != ""; then
regs=`echo $regs |
sed -e 's/type __*user_regs_struct struct //' -e 's/[{}]//g'`
regs=`echo $regs | sed -e s'/^ *//'`
nregs=
while test -n "$regs"; do
field=`echo $regs | sed -e 's/^\([^;]*\);.*$/\1/'`
regs=`echo $regs | sed -e 's/^[^;]*; *\(.*\)$/\1/'`
# Capitalize the first character of the field.
f=`echo $field | sed -e 's/^\(.\).*$/\1/'`
r=`echo $field | sed -e 's/^.\(.*\)$/\1/'`
f=`echo $f | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
field="$f$r"
field=`echo "$field" | sed \
-e 's/__user_psw_struct/PtracePsw/' \
-e 's/__user_fpregs_struct/PtraceFpregs/' \
-e 's/__user_per_struct/PtracePer/'`
nregs="$nregs $field;"
done
echo "type PtraceRegs struct {$nregs }" >> ${OUT}
fi
# Some basic types.
echo 'type Size_t _size_t' >> ${OUT}
echo "type Ssize_t _ssize_t" >> ${OUT}
if grep '^const _HAVE_OFF64_T = ' gen-sysinfo.go > /dev/null 2>&1; then
echo "type Offset_t _off64_t" >> ${OUT}
else
echo "type Offset_t _off_t" >> ${OUT}
fi
echo "type Mode_t _mode_t" >> ${OUT}
echo "type Pid_t _pid_t" >> ${OUT}
echo "type Uid_t _uid_t" >> ${OUT}
echo "type Gid_t _gid_t" >> ${OUT}
echo "type Socklen_t _socklen_t" >> ${OUT}
# The C int type.
sizeof_int=`grep '^const ___SIZEOF_INT__ = ' gen-sysinfo.go | sed -e 's/.*= //'`
if test "$sizeof_int" = "4"; then
echo "type _C_int int32" >> ${OUT}
echo "type _C_uint uint32" >> ${OUT}
elif test "$sizeof_int" = "8"; then
echo "type _C_int int64" >> ${OUT}
echo "type _C_uint uint64" >> ${OUT}
else
echo 1>&2 "mksysinfo.sh: could not determine size of int (got $sizeof_int)"
exit 1
fi
# The C long type, needed because that is the type that ptrace returns.
sizeof_long=`grep '^const ___SIZEOF_LONG__ = ' gen-sysinfo.go | sed -e 's/.*= //'`
if test "$sizeof_long" = "4"; then
echo "type _C_long int32" >> ${OUT}
elif test "$sizeof_long" = "8"; then
echo "type _C_long int64" >> ${OUT}
else
echo 1>&2 "mksysinfo.sh: could not determine size of long (got $sizeof_long)"
exit 1
fi
# 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 time_t type.
if grep '^type _time_t ' gen-sysinfo.go > /dev/null 2>&1; then
echo 'type Time_t _time_t' >> ${OUT}
fi
# 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_]*/Sec Timeval_sec_t/' \
-e 's/tv_usec *[a-zA-Z0-9_]*/Usec Timeval_usec_t/' >> ${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_]*/Sec Timespec_sec_t/' \
-e 's/tv_nsec *[a-zA-Z0-9_]*/Nsec Timespec_nsec_t/' >> ${OUT}
timestruc=`grep '^type _timestruc_t ' gen-sysinfo.go || true`
if test "$timestruc" != ""; then
timestruc_sec=`echo $timestruc | sed -n -e 's/^.*tv_sec \([^ ]*\);.*$/\1/p'`
timestruc_nsec=`echo $timestruc | sed -n -e 's/^.*tv_nsec \([^ ]*\);.*$/\1/p'`
echo "type Timestruc_sec_t $timestruc_sec" >> ${OUT}
echo "type Timestruc_nsec_t $timestruc_nsec" >> ${OUT}
echo $timestruc | \
sed -e 's/^type _timestruc_t /type Timestruc /' \
-e 's/tv_sec *[a-zA-Z0-9_]*/Sec Timestruc_sec_t/' \
-e 's/tv_nsec *[a-zA-Z0-9_]*/Nsec Timestruc_nsec_t/' >> ${OUT}
fi
# The tms struct.
grep '^type _tms ' gen-sysinfo.go | \
sed -e 's/type _tms/type Tms/' \
-e 's/tms_utime/Utime/' \
-e 's/tms_stime/Stime/' \
-e 's/tms_cutime/Cutime/' \
-e 's/tms_cstime/Cstime/' \
>> ${OUT}
# The stat type.
# Prefer largefile variant if available.
stat=`grep '^type _stat64 ' gen-sysinfo.go || true`
if test "$stat" != ""; then
grep '^type _stat64 ' gen-sysinfo.go
else
grep '^type _stat ' gen-sysinfo.go
fi | sed -e 's/type _stat64/type Stat_t/' \
-e 's/type _stat/type Stat_t/' \
-e 's/st_dev/Dev/' \
-e 's/st_ino/Ino/g' \
-e 's/st_nlink/Nlink/' \
-e 's/st_mode/Mode/' \
-e 's/st_uid/Uid/' \
-e 's/st_gid/Gid/' \
-e 's/st_rdev/Rdev/' \
-e 's/st_size/Size/' \
-e 's/st_blksize/Blksize/' \
-e 's/st_blocks/Blocks/' \
-e 's/st_atim/Atim/' \
-e 's/st_mtim/Mtim/' \
-e 's/st_ctim/Ctim/' \
-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' \
-e 's/\([^a-zA-Z0-9_]\)_timestruc_t\([^a-zA-Z0-9_]\)/\1Timestruc\2/g' \
-e 's/Godump_[0-9] struct { \([^;]*;\) };/\1/g' \
>> ${OUT}
# The directory searching types.
# Prefer largefile variant if available.
dirent=`grep '^type _dirent64 ' gen-sysinfo.go || true`
if test "$dirent" != ""; then
grep '^type _dirent64 ' gen-sysinfo.go
else
grep '^type _dirent ' gen-sysinfo.go
fi | sed -e 's/type _dirent64/type Dirent/' \
-e 's/type _dirent/type Dirent/' \
-e 's/d_name \[0+1\]/d_name [0+256]/' \
-e 's/d_name/Name/' \
-e 's/]int8/]byte/' \
-e 's/d_ino/Ino/' \
-e 's/d_off/Off/' \
-e 's/d_reclen/Reclen/' \
-e 's/d_type/Type/' \
>> ${OUT}
echo "type DIR _DIR" >> ${OUT}
# Values for d_type field in dirent.
grep '^const _DT_' gen-sysinfo.go |
sed -e 's/^\(const \)_\(DT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The rusage struct.
rusage=`grep '^type _rusage struct' gen-sysinfo.go`
if test "$rusage" != ""; then
# Remove anonymous unions from GNU/Linux <bits/resource.h>.
rusage=`echo $rusage | sed -e 's/Godump_[0-9][0-9]* struct {\([^}]*\)};/\1/g'`
rusage=`echo $rusage | sed -e 's/type _rusage struct //' -e 's/[{}]//g'`
rusage=`echo $rusage | sed -e 's/^ *//'`
nrusage=
while test -n "$rusage"; do
field=`echo $rusage | sed -e 's/^\([^;]*\);.*$/\1/'`
rusage=`echo $rusage | sed -e 's/^[^;]*; *\(.*\)$/\1/'`
# Drop the leading ru_, capitalize the next character.
field=`echo $field | sed -e 's/^ru_//'`
f=`echo $field | sed -e 's/^\(.\).*$/\1/'`
r=`echo $field | sed -e 's/^.\(.*\)$/\1/'`
f=`echo $f | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
# Fix _timeval _timespec, and _timestruc_t.
r=`echo $r | sed -e s'/ _timeval$/ Timeval/'`
r=`echo $r | sed -e s'/ _timespec$/ Timespec/'`
r=`echo $r | sed -e s'/ _timestruc_t$/ Timestruc/'`
field="$f$r"
nrusage="$nrusage $field;"
done
echo "type Rusage struct {$nrusage }" >> ${OUT}
else
echo "type Rusage struct {}" >> ${OUT}
fi
# The RUSAGE constants.
grep '^const _RUSAGE_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(RUSAGE_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The utsname struct.
grep '^type _utsname ' gen-sysinfo.go | \
sed -e 's/_utsname/Utsname/' \
-e 's/sysname/Sysname/' \
-e 's/nodename/Nodename/' \
-e 's/release/Release/' \
-e 's/version/Version/' \
-e 's/machine/Machine/' \
-e 's/domainname/Domainname/' \
>> ${OUT}
# The iovec struct.
iovec=`grep '^type _iovec ' gen-sysinfo.go`
iovec_len=`echo $iovec | sed -n -e 's/^.*iov_len \([^ ]*\);.*$/\1/p'`
echo "type Iovec_len_t $iovec_len" >> ${OUT}
echo $iovec | \
sed -e 's/_iovec/Iovec/' \
-e 's/iov_base/Base/' \
-e 's/iov_len *[a-zA-Z0-9_]*/Len Iovec_len_t/' \
>> ${OUT}
# The msghdr struct.
msghdr=`grep '^type _msghdr ' gen-sysinfo.go`
msghdr_controllen=`echo $msghdr | sed -n -e 's/^.*msg_controllen \([^ ]*\);.*$/\1/p'`
echo "type Msghdr_controllen_t $msghdr_controllen" >> ${OUT}
echo $msghdr | \
sed -e 's/_msghdr/Msghdr/' \
-e 's/msg_name/Name/' \
-e 's/msg_namelen/Namelen/' \
-e 's/msg_iov/Iov/' \
-e 's/msg_iovlen/Iovlen/' \
-e 's/_iovec/Iovec/' \
-e 's/msg_control/Control/' \
-e 's/msg_controllen *[a-zA-Z0-9_]*/Controllen Msghdr_controllen_t/' \
-e 's/msg_flags/Flags/' \
>> ${OUT}
# The MSG_ flags for Msghdr.
grep '^const _MSG_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(MSG_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The cmsghdr struct.
cmsghdr=`grep '^type _cmsghdr ' gen-sysinfo.go`
if test -n "$cmsghdr"; then
cmsghdr_len=`echo $cmsghdr | sed -n -e 's/^.*cmsg_len \([^ ]*\);.*$/\1/p'`
echo "type Cmsghdr_len_t $cmsghdr_len" >> ${OUT}
echo "$cmsghdr" | \
sed -e 's/_cmsghdr/Cmsghdr/' \
-e 's/cmsg_len *[a-zA-Z0-9_]*/Len Cmsghdr_len_t/' \
-e 's/cmsg_level/Level/' \
-e 's/cmsg_type/Type/' \
-e 's/\[\]/[0]/' \
>> ${OUT}
fi
# The SCM_ flags for Cmsghdr.
grep '^const _SCM_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(SCM_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The ucred struct.
upcase_fields "_ucred" "Ucred" >> ${OUT} || true
# The ip_mreq struct.
grep '^type _ip_mreq ' gen-sysinfo.go | \
sed -e 's/_ip_mreq/IPMreq/' \
-e 's/imr_multiaddr/Multiaddr/' \
-e 's/imr_interface/Interface/' \
-e 's/_in_addr/[4]byte/g' \
>> ${OUT}
# We need IPMreq to compile the net package.
if ! grep 'type IPMreq ' ${OUT} >/dev/null 2>&1; then
echo 'type IPMreq struct { Multiaddr [4]byte; Interface [4]byte; }' >> ${OUT}
fi
# The ipv6_mreq struct.
grep '^type _ipv6_mreq ' gen-sysinfo.go | \
sed -e 's/_ipv6_mreq/IPv6Mreq/' \
-e 's/ipv6mr_multiaddr/Multiaddr/' \
-e 's/ipv6mr_interface/Interface/' \
-e 's/_in6_addr/[16]byte/' \
>> ${OUT}
# We need IPv6Mreq to compile the net package.
if ! grep 'type IPv6Mreq ' ${OUT} >/dev/null 2>&1; then
echo 'type IPv6Mreq struct { Multiaddr [16]byte; Interface uint32; }' >> ${OUT}
fi
# The ip_mreqn struct.
grep '^type _ip_mreqn ' gen-sysinfo.go | \
sed -e 's/_ip_mreqn/IPMreqn/' \
-e 's/imr_multiaddr/Multiaddr/' \
-e 's/imr_address/Address/' \
-e 's/imr_ifindex/Ifindex/' \
-e 's/_in_addr/[4]byte/g' \
>> ${OUT}
# We need IPMreq to compile the net package.
if ! grep 'type IPMreqn ' ${OUT} >/dev/null 2>&1; then
echo 'type IPMreqn struct { Multiaddr [4]byte; Interface [4]byte; Ifindex int32 }' >> ${OUT}
fi
# The icmp6_filter struct.
grep '^type _icmp6_filter ' gen-sysinfo.go | \
sed -e 's/_icmp6_filter/ICMPv6Filter/' \
-e 's/data/Data/' \
-e 's/filt/Filt/' \
>> ${OUT}
# We need ICMPv6Filter to compile the syscall package.
if ! grep 'type ICMPv6Filter ' ${OUT} > /dev/null 2>&1; then
echo 'type ICMPv6Filter struct { Data [8]uint32 }' >> ${OUT}
fi
# The ip6_mtuinfo struct.
grep '^type _ip6_mtuinfo ' gen-sysinfo.go | \
sed -e 's/_ip6_mtuinfo/IPv6MTUInfo/' \
-e 's/ip6m_addr/Addr/' \
-e 's/_sockaddr_in6/RawSockaddrInet6/' \
-e 's/ip6m_mtu/Mtu/' \
>> ${OUT}
# Try to guess the type to use for fd_set.
fd_set=`grep '^type _fd_set ' gen-sysinfo.go || true`
fds_bits_type="_C_long"
if test "$fd_set" != ""; then
fds_bits_type=`echo $fd_set | sed -e 's/.*[]]\([^;]*\); }$/\1/'`
fi
echo "type fds_bits_type $fds_bits_type" >> ${OUT}
# The addrinfo struct.
grep '^type _addrinfo ' gen-sysinfo.go | \
sed -e 's/_addrinfo/Addrinfo/g' \
-e 's/ ai_/ Ai_/g' \
>> ${OUT}
# The addrinfo and nameinfo flags and errors.
grep '^const _AI_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(AI_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _EAI_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(EAI_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _NI_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(NI_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The passwd struct.
grep '^type _passwd ' gen-sysinfo.go | \
sed -e 's/_passwd/Passwd/' \
-e 's/ pw_/ Pw_/g' \
>> ${OUT}
# The group struct.
grep '^type _group ' gen-sysinfo.go | \
sed -e 's/_group/Group/' \
-e 's/ gr_/ Gr_/g' \
>> ${OUT}
# The ioctl flags for the controlling TTY.
grep '^const _TIOC' gen-sysinfo.go | \
grep -v '_val =' | \
sed -e 's/^\(const \)_\(TIOC[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _TUNSET' gen-sysinfo.go | \
grep -v '_val =' | \
sed -e 's/^\(const \)_\(TUNSET[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# We need TIOCGWINSZ.
if ! grep '^const TIOCGWINSZ' ${OUT} >/dev/null 2>&1; then
if grep '^const _TIOCGWINSZ_val' ${OUT} >/dev/null 2>&1; then
echo 'const TIOCGWINSZ = _TIOCGWINSZ_val' >> ${OUT}
fi
fi
if ! grep '^const TIOCSWINSZ' ${OUT} >/dev/null 2>&1; then
if grep '^const _TIOCSWINSZ_val' ${OUT} >/dev/null 2>&1; then
echo 'const TIOCSWINSZ = _TIOCSWINSZ_val' >> ${OUT}
fi
fi
if ! grep '^const TIOCNOTTY' ${OUT} >/dev/null 2>&1; then
if grep '^const _TIOCNOTTY_val' ${OUT} >/dev/null 2>&1; then
echo 'const TIOCNOTTY = _TIOCNOTTY_val' >> ${OUT}
fi
fi
if ! grep '^const TIOCSCTTY' ${OUT} >/dev/null 2>&1; then
if grep '^const _TIOCSCTTY_val' ${OUT} >/dev/null 2>&1; then
echo 'const TIOCSCTTY = _TIOCSCTTY_val' >> ${OUT}
fi
fi
if ! grep '^const TIOCGPGRP' ${OUT} >/dev/null 2>&1; then
if grep '^const _TIOCGPGRP_val' ${OUT} >/dev/null 2>&1; then
echo 'const TIOCGPGRP = _TIOCGPGRP_val' >> ${OUT}
fi
fi
if ! grep '^const TIOCSPGRP' ${OUT} >/dev/null 2>&1; then
if grep '^const _TIOCSPGRP_val' ${OUT} >/dev/null 2>&1; then
echo 'const TIOCSPGRP = _TIOCSPGRP_val' >> ${OUT}
fi
fi
if ! grep '^const TIOCGPTN' ${OUT} >/dev/null 2>&1; then
if grep '^const _TIOCGPTN_val' ${OUT} >/dev/null 2>&1; then
echo 'const TIOCGPTN = _TIOCGPTN_val' >> ${OUT}
fi
fi
if ! grep '^const TIOCSPTLCK' ${OUT} >/dev/null 2>&1; then
if grep '^const _TIOCSPTLCK_val' ${OUT} >/dev/null 2>&1; then
echo 'const TIOCSPTLCK = _TIOCSPTLCK_val' >> ${OUT}
fi
fi
if ! grep '^const TIOCGDEV' ${OUT} >/dev/null 2>&1; then
if grep '^const _TIOCGDEV_val' ${OUT} >/dev/null 2>&1; then
echo 'const TIOCGDEV = _TIOCGDEV_val' >> ${OUT}
fi
fi
if ! grep '^const TIOCSIG' ${OUT} >/dev/null 2>&1; then
if grep '^const _TIOCSIG_val' ${OUT} >/dev/null 2>&1; then
echo 'const TIOCSIG = _TIOCSIG_val' >> ${OUT}
fi
fi
if ! grep '^const TUNSETNOCSUM' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNSETNOCSUM_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNSETNOCSUM = _TUNSETNOCSUM_val' >> ${OUT}
fi
fi
if ! grep '^const TUNSETDEBUG' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNSETDEBUG_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNSETDEBUG = _TUNSETDEBUG_val' >> ${OUT}
fi
fi
if ! grep '^const TUNSETIFF' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNSETIFF_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNSETIFF = _TUNSETIFF_val' >> ${OUT}
fi
fi
if ! grep '^const TUNSETPERSIST' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNSETPERSIST_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNSETPERSIST = _TUNSETPERSIST_val' >> ${OUT}
fi
fi
if ! grep '^const TUNSETOWNER' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNSETOWNER_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNSETOWNER = _TUNSETOWNER_val' >> ${OUT}
fi
fi
if ! grep '^const TUNSETLINK' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNSETLINK_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNSETLINK = _TUNSETLINK_val' >> ${OUT}
fi
fi
if ! grep '^const TUNSETGROUP' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNSETGROUP_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNSETGROUP = _TUNSETGROUP_val' >> ${OUT}
fi
fi
if ! grep '^const TUNGETFEATURES' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNGETFEATURES_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNGETFEATURES = _TUNGETFEATURES_val' >> ${OUT}
fi
fi
if ! grep '^const TUNSETOFFLOAD' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNSETOFFLOAD_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNSETOFFLOAD = _TUNSETOFFLOAD_val' >> ${OUT}
fi
fi
if ! grep '^const TUNSETTXFILTER' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNSETTXFILTER_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNSETTXFILTER = _TUNSETTXFILTER_val' >> ${OUT}
fi
fi
if ! grep '^const TUNGETIFF' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNGETIFF_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNGETIFF = _TUNGETIFF_val' >> ${OUT}
fi
fi
if ! grep '^const TUNGETSNDBUF' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNGETSNDBUF_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNGETSNDBUF = _TUNGETSNDBUF_val' >> ${OUT}
fi
fi
if ! grep '^const TUNSETSNDBUF' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNSETSNDBUF_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNSETSNDBUF = _TUNSETSNDBUF_val' >> ${OUT}
fi
fi
if ! grep '^const TUNATTACHFILTER' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNATTACHFILTER_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNATTACHFILTER = _TUNATTACHFILTER_val' >> ${OUT}
fi
fi
if ! grep '^const TUNDETACHFILTER' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNDETACHFILTER_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNDETACHFILTER = _TUNDETACHFILTER_val' >> ${OUT}
fi
fi
if ! grep '^const TUNGETVNETHDRSZ' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNGETVNETHDRSZ_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNGETVNETHDRSZ = _TUNGETVNETHDRSZ_val' >> ${OUT}
fi
fi
if ! grep '^const TUNSETVNETHDRSZ' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNSETVNETHDRSZ_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNSETVNETHDRSZ = _TUNSETVNETHDRSZ_val' >> ${OUT}
fi
fi
if ! grep '^const TUNSETQUEUE' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNSETQUEUE_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNSETQUEUE = _TUNSETQUEUE_val' >> ${OUT}
fi
fi
if ! grep '^const TUNSETIFINDEX' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNSETIFINDEX_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNSETIFINDEX = _TUNSETIFINDEX_val' >> ${OUT}
fi
fi
if ! grep '^const TUNGETFILTER' ${OUT} >/dev/null 2>&1; then
if grep '^const _TUNGETFILTER_val' ${OUT} >/dev/null 2>&1; then
echo 'const TUNGETFILTER = _TUNGETFILTER_val' >> ${OUT}
fi
fi
# The ioctl flags for terminal control
grep '^const _TC[GS]ET' gen-sysinfo.go | grep -v _val | \
sed -e 's/^\(const \)_\(TC[GS]ET[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
if ! grep '^const TCGETS' ${OUT} >/dev/null 2>&1; then
if grep '^const _TCGETS_val' ${OUT} >/dev/null 2>&1; then
echo 'const TCGETS = _TCGETS_val' >> ${OUT}
fi
fi
if ! grep '^const TCSETS' ${OUT} >/dev/null 2>&1; then
if grep '^const _TCSETS_val' ${OUT} >/dev/null 2>&1; then
echo 'const TCSETS = _TCSETS_val' >> ${OUT}
fi
fi
# ioctl constants. Might fall back to 0 if TIOCNXCL is missing, too, but
# needs handling in syscalls.exec.go.
if ! grep '^const _TIOCSCTTY ' gen-sysinfo.go >/dev/null 2>&1; then
if grep '^const _TIOCNXCL ' gen-sysinfo.go >/dev/null 2>&1; then
echo "const TIOCSCTTY = TIOCNXCL" >> ${OUT}
fi
fi
# The nlmsghdr struct.
grep '^type _nlmsghdr ' gen-sysinfo.go | \
sed -e 's/_nlmsghdr/NlMsghdr/' \
-e 's/nlmsg_len/Len/' \
-e 's/nlmsg_type/Type/' \
-e 's/nlmsg_flags/Flags/' \
-e 's/nlmsg_seq/Seq/' \
-e 's/nlmsg_pid/Pid/' \
>> ${OUT}
# The nlmsg flags and operators.
grep '^const _NLM' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(NLM[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# NLMSG_HDRLEN is defined as an expression using sizeof.
if ! grep '^const NLMSG_HDRLEN' ${OUT} > /dev/null 2>&1; then
if grep '^const _sizeof_nlmsghdr ' ${OUT} > /dev/null 2>&1; then
echo 'const NLMSG_HDRLEN = (_sizeof_nlmsghdr + (NLMSG_ALIGNTO-1)) &^ (NLMSG_ALIGNTO-1)' >> ${OUT}
fi
fi
# The rtmsg struct.
grep '^type _rtmsg ' gen-sysinfo.go | \
sed -e 's/_rtmsg/RtMsg/' \
-e 's/rtm_family/Family/' \
-e 's/rtm_dst_len/Dst_len/' \
-e 's/rtm_src_len/Src_len/' \
-e 's/rtm_tos/Tos/' \
-e 's/rtm_table/Table/' \
-e 's/rtm_protocol/Protocol/' \
-e 's/rtm_scope/Scope/' \
-e 's/rtm_type/Type/' \
-e 's/rtm_flags/Flags/' \
>> ${OUT}
# The rtgenmsg struct.
grep '^type _rtgenmsg ' gen-sysinfo.go | \
sed -e 's/_rtgenmsg/RtGenmsg/' \
-e 's/rtgen_family/Family/' \
>> ${OUT}
# The routing message flags.
grep '^const _RT_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(RT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _RTA' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(RTA[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _RTF' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(RTF[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _RTCF' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(RTCF[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _RTM' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(RTM[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _RTN' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(RTN[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _RTPROT' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(RTPROT[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The ifinfomsg struct.
grep '^type _ifinfomsg ' gen-sysinfo.go | \
sed -e 's/_ifinfomsg/IfInfomsg/' \
-e 's/ifi_family/Family/' \
-e 's/ifi_type/Type/' \
-e 's/ifi_index/Index/' \
-e 's/ifi_flags/Flags/' \
-e 's/ifi_change/Change/' \
>> ${OUT}
# The interface information types and flags.
grep '^const _IFA' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(IFA[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _IFLA' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(IFLA[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _IFF' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(IFF[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _IFNAMSIZ' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(IFNAMSIZ[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _SIOC' gen-sysinfo.go |
sed -e 's/^\(const \)_\(SIOC[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The ifaddrmsg struct.
grep '^type _ifaddrmsg ' gen-sysinfo.go | \
sed -e 's/_ifaddrmsg/IfAddrmsg/' \
-e 's/ifa_family/Family/' \
-e 's/ifa_prefixlen/Prefixlen/' \
-e 's/ifa_flags/Flags/' \
-e 's/ifa_scope/Scope/' \
-e 's/ifa_index/Index/' \
>> ${OUT}
# The rtattr struct.
grep '^type _rtattr ' gen-sysinfo.go | \
sed -e 's/_rtattr/RtAttr/' \
-e 's/rta_len/Len/' \
-e 's/rta_type/Type/' \
>> ${OUT}
# The in_pktinfo struct.
grep '^type _in_pktinfo ' gen-sysinfo.go | \
sed -e 's/_in_pktinfo/Inet4Pktinfo/' \
-e 's/ipi_ifindex/Ifindex/' \
-e 's/ipi_spec_dst/Spec_dst/' \
-e 's/ipi_addr/Addr/' \
-e 's/_in_addr/[4]byte/g' \
>> ${OUT}
# The in6_pktinfo struct.
grep '^type _in6_pktinfo ' gen-sysinfo.go | \
sed -e 's/_in6_pktinfo/Inet6Pktinfo/' \
-e 's/ipi6_addr/Addr/' \
-e 's/ipi6_ifindex/Ifindex/' \
-e 's/_in6_addr/[16]byte/' \
>> ${OUT}
# The termios struct.
grep '^type _termios ' gen-sysinfo.go | \
sed -e 's/_termios/Termios/' \
-e 's/c_iflag/Iflag/' \
-e 's/c_oflag/Oflag/' \
-e 's/c_cflag/Cflag/' \
-e 's/c_lflag/Lflag/' \
-e 's/c_line/Line/' \
-e 's/c_cc/Cc/' \
-e 's/c_ispeed/Ispeed/' \
-e 's/c_ospeed/Ospeed/' \
>> ${OUT}
# The termios constants.
for n in IGNBRK BRKINT IGNPAR PARMRK INPCK ISTRIP INLCR IGNCR ICRNL IUCLC \
IXON IXANY IXOFF IMAXBEL IUTF8 OPOST OLCUC ONLCR OCRNL ONOCR ONLRET \
OFILL OFDEL NLDLY NL0 NL1 CRDLY CR0 CR1 CR2 CR3 CS5 CS6 CS7 CS8 TABDLY \
BSDLY VTDLY FFDLY CBAUD CBAUDEX CSIZE CSTOPB CREAD PARENB PARODD HUPCL \
CLOCAL LOBLK CIBAUD CMSPAR CRTSCTS ISIG ICANON XCASE ECHO ECHOE ECHOK \
ECHONL ECHOCTL ECHOPRT ECHOKE DEFECHO FLUSHO NOFLSH TOSTOP PENDIN IEXTEN \
VINTR VQUIT VERASE VKILL VEOF VMIN VEOL VTIME VEOL2 VSWTCH VSTART VSTOP \
VSUSP VDSUSP VLNEXT VWERASE VREPRINT VDISCARD VSTATUS TCSANOW TCSADRAIN \
TCSAFLUSH TCIFLUSH TCOFLUSH TCIOFLUSH TCOOFF TCOON TCIOFF TCION B0 B50 \
B75 B110 B134 B150 B200 B300 B600 B1200 B1800 B2400 B4800 B9600 B19200 \
B38400 B57600 B115200 B230400 B460800 B500000 B576000 B921600 B1000000 \
B1152000 B1500000 B2000000 B2500000 B3000000 B3500000 B4000000; do
grep "^const _$n " gen-sysinfo.go | \
sed -e 's/^\(const \)_\([^=]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
done
# The mount flags
grep '^const _MNT_' gen-sysinfo.go |
sed -e 's/^\(const \)_\(MNT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _MS_' gen-sysinfo.go |
sed -e 's/^\(const \)_\(MS_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The fallocate flags.
grep '^const _FALLOC_' gen-sysinfo.go |
sed -e 's/^\(const \)_\(FALLOC_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The statfs struct.
# Prefer largefile variant if available.
statfs=`grep '^type _statfs64 ' gen-sysinfo.go || true`
if test "$statfs" != ""; then
grep '^type _statfs64 ' gen-sysinfo.go
else
grep '^type _statfs ' gen-sysinfo.go
fi | sed -e 's/type _statfs64/type Statfs_t/' \
-e 's/type _statfs/type Statfs_t/' \
-e 's/f_type/Type/' \
-e 's/f_bsize/Bsize/' \
-e 's/f_blocks/Blocks/' \
-e 's/f_bfree/Bfree/' \
-e 's/f_bavail/Bavail/' \
-e 's/f_files/Files/' \
-e 's/f_ffree/Ffree/' \
-e 's/f_fsid/Fsid/' \
-e 's/f_namelen/Namelen/' \
-e 's/f_frsize/Frsize/' \
-e 's/f_flags/Flags/' \
-e 's/f_spare/Spare/' \
>> ${OUT}
# The timex struct.
timex=`grep '^type _timex ' gen-sysinfo.go || true`
if test "$timex" = ""; then
timex=`grep '^// type _timex ' gen-sysinfo.go || true`
if test "$timex" != ""; then
timex=`echo $timex | sed -e 's|// ||' -e 's/INVALID-bit-field/int32/g'`
fi
fi
if test "$timex" != ""; then
echo "$timex" | \
sed -e 's/_timex/Timex/' \
-e 's/modes/Modes/' \
-e 's/offset/Offset/' \
-e 's/freq/Freq/' \
-e 's/maxerror/Maxerror/' \
-e 's/esterror/Esterror/' \
-e 's/status/Status/' \
-e 's/constant/Constant/' \
-e 's/precision/Precision/' \
-e 's/tolerance/Tolerance/' \
-e 's/ time / Time /' \
-e 's/tick/Tick/' \
-e 's/ppsfreq/Ppsfreq/' \
-e 's/jitter/Jitter/' \
-e 's/shift/Shift/' \
-e 's/stabil/Stabil/' \
-e 's/jitcnt/Jitcnt/' \
-e 's/calcnt/Calcnt/' \
-e 's/errcnt/Errcnt/' \
-e 's/stbcnt/Stbcnt/' \
-e 's/tai/Tai/' \
-e 's/_timeval/Timeval/' \
>> ${OUT}
fi
# The rlimit struct.
grep '^type _rlimit ' gen-sysinfo.go | \
sed -e 's/_rlimit/Rlimit/' \
-e 's/rlim_cur/Cur/' \
-e 's/rlim_max/Max/' \
>> ${OUT}
# The RLIMIT constants.
grep '^const _RLIMIT_' gen-sysinfo.go |
sed -e 's/^\(const \)_\(RLIMIT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _RLIM_' gen-sysinfo.go |
sed -e 's/^\(const \)_\(RLIM_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The sysinfo struct.
grep '^type _sysinfo ' gen-sysinfo.go | \
sed -e 's/_sysinfo/Sysinfo_t/' \
-e 's/uptime/Uptime/' \
-e 's/loads/Loads/' \
-e 's/totalram/Totalram/' \
-e 's/freeram/Freeram/' \
-e 's/sharedram/Sharedram/' \
-e 's/bufferram/Bufferram/' \
-e 's/totalswap/Totalswap/' \
-e 's/freeswap/Freeswap/' \
-e 's/procs/Procs/' \
-e 's/totalhigh/Totalhigh/' \
-e 's/freehigh/Freehigh/' \
-e 's/mem_unit/Unit/' \
>> ${OUT}
# The ustat struct.
grep '^type _ustat ' gen-sysinfo.go | \
sed -e 's/_ustat/Ustat_t/' \
-e 's/f_tfree/Tfree/' \
-e 's/f_tinode/Tinoe/' \
-e 's/f_fname/Fname/' \
-e 's/f_fpack/Fpack/' \
>> ${OUT}
# Force it to be defined, as on some older GNU/Linux systems the
# header file fails when using with <linux/filter.h>.
if ! grep 'type _ustat ' gen-sysinfo.go >/dev/null 2>&1; then
echo 'type Ustat_t struct { Tfree int32; Tinoe uint64; Fname [5+1]int8; Fpack [5+1]int8; }' >> ${OUT}
fi
# The utimbuf struct.
grep '^type _utimbuf ' gen-sysinfo.go | \
sed -e 's/_utimbuf/Utimbuf/' \
-e 's/actime/Actime/' \
-e 's/modtime/Modtime/' \
>> ${OUT}
# The LOCK flags for flock.
grep '^const _LOCK_' gen-sysinfo.go |
sed -e 's/^\(const \)_\(LOCK_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The PRIO constants.
grep '^const _PRIO_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(PRIO_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The GNU/Linux LINUX_REBOOT flags.
grep '^const _LINUX_REBOOT_' gen-sysinfo.go |
sed -e 's/^\(const \)_\(LINUX_REBOOT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The GNU/Linux sock_filter struct.
grep '^type _sock_filter ' gen-sysinfo.go | \
sed -e 's/_sock_filter/SockFilter/' \
-e 's/code/Code/' \
-e 's/jt/Jt/' \
-e 's/jf/Jf/' \
-e 's/k /K /' \
>> ${OUT}
# The GNU/Linux sock_fprog struct.
grep '^type _sock_fprog ' gen-sysinfo.go | \
sed -e 's/_sock_fprog/SockFprog/' \
-e 's/len/Len/' \
-e 's/filter/Filter/' \
-e 's/_sock_filter/SockFilter/' \
>> ${OUT}
# The GNU/Linux filter flags.
grep '^const _BPF_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(BPF_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The GNU/Linux nlattr struct.
grep '^type _nlattr ' gen-sysinfo.go | \
sed -e 's/_nlattr/NlAttr/' \
-e 's/nla_len/Len/' \
-e 's/nla_type/Type/' \
>> ${OUT}
# The GNU/Linux nlmsgerr struct.
grep '^type _nlmsgerr ' gen-sysinfo.go | \
sed -e 's/_nlmsgerr/NlMsgerr/' \
-e 's/error/Error/' \
-e 's/msg/Msg/' \
-e 's/_nlmsghdr/NlMsghdr/' \
>> ${OUT}
# The GNU/Linux rtnexthop struct.
grep '^type _rtnexthop ' gen-sysinfo.go | \
sed -e 's/_rtnexthop/RtNexthop/' \
-e 's/rtnh_len/Len/' \
-e 's/rtnh_flags/Flags/' \
-e 's/rtnh_hops/Hops/' \
-e 's/rtnh_ifindex/Ifindex/' \
>> ${OUT}
# The GNU/Linux netlink flags.
grep '^const _NETLINK_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(NETLINK_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
grep '^const _NLA_' gen-sysinfo.go | grep -v '_val =' | \
sed -e 's/^\(const \)_\(NLA_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
if ! grep '^const NLA_HDRLEN' ${OUT} >/dev/null 2>&1; then
if grep '^const _NLA_HDRLEN_val' ${OUT} >/dev/null 2>&1; then
echo 'const NLA_HDRLEN = _NLA_HDRLEN_val' >> ${OUT}
fi
fi
# The GNU/Linux packet socket flags.
grep '^const _PACKET_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(PACKET_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# The GNU/Linux inotify_event struct.
grep '^type _inotify_event ' gen-sysinfo.go | \
sed -e 's/_inotify_event/InotifyEvent/' \
-e 's/wd/Wd/' \
-e 's/mask/Mask/' \
-e 's/cookie/Cookie/' \
-e 's/len/Len/' \
-e 's/name/Name/' \
-e 's/\[\]/[0]/' \
-e 's/\[0\]byte/[0]int8/' \
>> ${OUT}
# The GNU/Linux CLONE flags.
grep '^const _CLONE_' gen-sysinfo.go | \
sed -e 's/^\(const \)_\(CLONE_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# We need some CLONE constants that are not defined in older versions
# of glibc.
if ! grep '^const CLONE_NEWUSER ' ${OUT} > /dev/null 2>&1; then
echo "const CLONE_NEWUSER = 0x10000000" >> ${OUT}
fi
if ! grep '^const CLONE_NEWNET ' ${OUT} > /dev/null 2>&1; then
echo "const CLONE_NEWNET = 0x40000000" >> ${OUT}
fi
# Struct sizes.
set cmsghdr Cmsghdr ip_mreq IPMreq ip_mreqn IPMreqn ipv6_mreq IPv6Mreq \
ifaddrmsg IfAddrmsg ifinfomsg IfInfomsg in_pktinfo Inet4Pktinfo \
in6_pktinfo Inet6Pktinfo inotify_event InotifyEvent linger Linger \
msghdr Msghdr nlattr NlAttr nlmsgerr NlMsgerr nlmsghdr NlMsghdr \
rtattr RtAttr rtgenmsg RtGenmsg rtmsg RtMsg rtnexthop RtNexthop \
sock_filter SockFilter sock_fprog SockFprog ucred Ucred \
icmp6_filter ICMPv6Filter ip6_mtuinfo IPv6MTUInfo
while test $# != 0; do
nc=$1
ngo=$2
shift
shift
if grep "^const _sizeof_$nc =" gen-sysinfo.go >/dev/null 2>&1; then
echo "const Sizeof$ngo = _sizeof_$nc" >> ${OUT}
fi
done
# In order to compile the net package, we need some sizes to exist
# even if the types do not.
if ! grep 'const SizeofIPMreq ' ${OUT} >/dev/null 2>&1; then
echo 'const SizeofIPMreq = 8' >> ${OUT}
fi
if ! grep 'const SizeofIPv6Mreq ' ${OUT} >/dev/null 2>&1; then
echo 'const SizeofIPv6Mreq = 20' >> ${OUT}
fi
if ! grep 'const SizeofIPMreqn ' ${OUT} >/dev/null 2>&1; then
echo 'const SizeofIPMreqn = 12' >> ${OUT}
fi
if ! grep 'const SizeofICMPv6Filter ' ${OUT} >/dev/null 2>&1; then
echo 'const SizeofICMPv6Filter = 32' >> ${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 12 _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 12 _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 12 _mac_ipaddr_t struct.
grep '^type _mac_ipaddr_t ' gen-sysinfo.go | \
sed -e 's/_in6_addr_t/[16]byte/g' \
>> ${OUT}
# The Solaris 12 _mactun_info_t struct.
grep '^type _mactun_info_t ' gen-sysinfo.go | \
sed -e 's/_in6_addr_t/[16]byte/g' \
>> ${OUT}
exit $?