gcc/libgo/mksysinfo.sh
Ian Lance Taylor ab2d47a87f libgo: support gollvm build on arm64 linux
This CL serves as part of an initial change for enabling gollvm
    building on arm64 linux, the rest of the change will be covered by
    another one to the gollvm repo.
    
    Incorporate type definition of 'uint128' to 'runtime' and 'syscall'
    packges, the change is not specific to arm64 linux but made available
    for all platforms.
    
    Verified by building and unit-testing gollvm on linux x86-64 and arm64.
    
    Verified by building and checking gccgo on linux x86-64 and arm64.
    
    Fixes golang/go#33711
    
    Change-Id: I4720c7d810cfd4ef720962fb4104c5641b2459c0

From-SVN: r275919
2019-09-19 00:03:25 +00:00

1403 lines
48 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 from gen-sysinfo.go and errno.i.
# This shell script creates the sysinfo.go file which holds types and
# constants extracted from the system header files. This reads the
# raw data from gen-sysinfo.go which is generated using the
# -fdump-go-spec option.
# This currently exposes some names that 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.
OUT=tmp-sysinfo.go
set -e
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 '^var' | \
grep -v '^type _timeval ' | \
grep -v '^type _timespec_t ' | \
grep -v '^type _timespec ' | \
grep -v '^type _timestruc_t ' | \
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' \
-e 's/\([^a-zA-Z0-9_]\)_timestruc_t\([^a-zA-Z0-9_]\)/\1Timestruc\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 errno constants. These get type Errno.
egrep '#define E[A-Z0-9_]+ [0-9E]' errno.i | \
sed -e 's/^#define \(E[A-Z0-9_]*\) .*$/const \1 = Errno(_\1)/' >> ${OUT}
# Workaround for GNU/Hurd _EMIG_* errors having negative values
egrep '#define E[A-Z0-9_]+ -[0-9]' errno.i | \
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
# The internal/poll package requires F_GETPIPE_SZ to be defined.
if ! grep '^const F_GETPIPE_SZ' ${OUT} >/dev/null 2>&1; then
echo "const F_GETPIPE_SZ = 0" >> ${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
# 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
# Special treatment of SYS_IOCTL for GNU/Hurd.
if ! grep '^const SYS_IOCTL' ${OUT} > /dev/null 2>&1; then
echo "const SYS_IOCTL = 0" >> ${OUT}
fi
# 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
# The syscall package wants the geteuid system call number. It isn't
# defined on Alpha, which only provides the getresuid system call.
if ! grep '^const SYS_GETEUID ' ${OUT} >/dev/null 2>&1; then
echo "const SYS_GETEUID = 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
# On GNU/Linux the os package requires WEXITED and WNOWAIT.
if test "${GOOS}" = "linux"; then
if ! grep '^const WEXITED = ' ${OUT} >/dev/null 2>&1; then
echo 'const WEXITED = 4' >> ${OUT}
fi
if ! grep '^const WNOWAIT = ' ${OUT} >/dev/null 2>&1; then
echo 'const WNOWAIT = 0x01000000' >> ${OUT}
fi
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
# The syscall package requires _AT_FDCWD, but doesn't export it.
if ! grep '^const _AT_FDCWD = ' ${OUT} >/dev/null 2>&1; then
echo "const _AT_FDCWD = -100" >> ${OUT}
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 |
grep -v EPOLLET |
sed -e 's/^\(const \)_\(EPOLL[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
# Make sure EPOLLET is positive.
if grep '^const _EPOLLET = [0-9]' gen-sysinfo.go >/dev/null 2>&1; then
grep '^const _EPOLLET ' gen-sysinfo.go |
sed -e 's/^\(const \)_\(EPOLL[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
else
echo "const EPOLLET = 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
# 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
# mips*
regs=`grep '^type _pt_regs struct' gen-sysinfo.go || true`
fi
if test "$regs" != ""; then
regs=`echo $regs | sed -e 's/type _pt_regs struct//'`
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}
echo "type _C_ulong uint32" >> ${OUT}
elif test "$sizeof_long" = "8"; then
echo "type _C_long int64" >> ${OUT}
echo "type _C_ulong uint64" >> ${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}
# AIX uses st_timespec struct for stat.
grep '^type _st_timespec ' gen-sysinfo.go | \
sed -e 's/type _st_timespec /type StTimespec /' \
-e 's/tv_sec/Sec/' \
-e 's/tv_nsec/Nsec/' >> ${OUT}
# Special treatment of struct stat st_dev for GNU/Hurd
# /usr/include/i386-gnu/bits/stat.h: #define st_dev st_fsid
st_dev='-e s/st_dev/Dev/'
if grep 'define st_dev st_fsid' gen-sysinfo.go > /dev/null 2>&1; then
st_dev='-e s/st_fsid/Dev/'
fi
# 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/' \
${st_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_]\)_st_timespec_t\([^a-zA-Z0-9_]\)/\1StTimespec\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_namlen/Namlen/' \
-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}
# We need IPv6MTUInfo to compile the syscall package.
if ! grep 'type IPv6MTUInfo ' ${OUT} >/dev/null 2>&1; then
echo 'type IPv6MTUInfo struct { Addr RawSockaddrInet6; Mtu uint32; }' >> ${OUT}
fi
if ! grep 'const _sizeof_ip6_mtuinfo = ' ${OUT} >/dev/null 2>&1; then
echo 'const SizeofIPv6MTUInfo = 32' >> ${OUT}
fi
# 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}
# If nothing else defined EAI_OVERFLOW, make sure it has a value.
if ! grep "const EAI_OVERFLOW " ${OUT} >/dev/null 2>&1; then
echo "const EAI_OVERFLOW = 0" >> ${OUT}
fi
# 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
# If nothing else defined TIOCSCTTY, make sure it has a value.
if ! grep "const TIOCSCTTY " ${OUT} >/dev/null 2>&1; then
echo "const TIOCSCTTY = 0" >> ${OUT}
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 if_msghdr struct.
grep '^type _if_msghdr ' gen-sysinfo.go | \
sed -e 's/_if_msghdr/IfMsgHdr/' \
-e 's/ifm_msglen/Msglen/' \
-e 's/ifm_version/Version/' \
-e 's/ifm_type/Type/' \
-e 's/ifm_addrs/Addrs/' \
-e 's/ifm_flags/Flags/' \
-e 's/ifm_index/Index/' \
-e 's/ifm_addrlen/Addrlen/' \
>> ${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.
# CentOS 5 does not have f_flags, so pull from f_spare.
statfs=`grep '^type _statfs64 ' gen-sysinfo.go || true`
if test "$statfs" = ""; then
statfs=`grep '^type _statfs ' gen-sysinfo.go || true`
fi
if ! echo "$statfs" | grep f_flags; then
statfs=`echo "$statfs" | sed -e 's/f_spare \[4+1\]\([^ ;]*\)/f_flags \1; f_spare [3+1]\1/'`
fi
echo "$statfs" | 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.
# On systems that use syscall/libcall_posix_largefile.go, use rlimit64
# if it exists.
rlimit="_rlimit"
if test "${GOOS}" = "aix" || test "${GOOS}" = "linux" || (test "${GOOS}" = "solaris" && (test "${GOARCH}" = "386" || test "${GOARCH}" = "sparc")); then
if grep '^type _rlimit64 ' gen-sysinfo.go > /dev/null 2>&1; then
rlimit="_rlimit64"
fi
fi
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 |
grep -v '^const _RLIM_INFINITY ' |
sed -e 's/^\(const \)_\(RLIM_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT}
rliminf=""
if test "${rlimit}" = "_rlimit64" && grep '^const _RLIM64_INFINITY ' gen-sysinfo.go > /dev/null 2>&1; then
rliminf=`grep '^const _RLIM64_INFINITY ' gen-sysinfo.go | sed -e 's/.* //'`
else
rliminf=`grep '^const _RLIM_INFINITY ' gen-sysinfo.go | sed -e 's/.* //'`
fi
# For compatibility with the gc syscall package, treat 0xffffffffffffffff as -1.
if test "$rliminf" = "0xffffffffffffffff"; then
echo "const RLIM_INFINITY = -1" >> ${OUT}
elif test -n "$rliminf"; then
echo "const RLIM_INFINITY = $rliminf" >> ${OUT}
fi
# 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 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 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}
# Type 'uint128' is needed in a couple of type definitions on arm64,such
# as _user_fpsimd_struct, _elf_fpregset_t, etc.
if ! grep '^type uint128' ${OUT} > /dev/null 2>&1; then
echo "type uint128 [16]byte" >> ${OUT}
fi
exit $?