| /* sysinfo.c -- input for mksysinfo.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.  */ | 
 |  | 
 | /* This file is passed to GCC with the -fdump-go-spec option to | 
 |    generate a Go version of the system information.  */ | 
 |  | 
 | #include "config.h" | 
 |  | 
 | #include <stddef.h> | 
 | #include <stdlib.h> | 
 | #include <stdio.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_SYSCTL_H) | 
 | #include <sys/sysctl.h> | 
 | #endif | 
 | #if defined(HAVE_SYS_EPOLL_H) | 
 | #include <sys/epoll.h> | 
 | #endif | 
 | #if defined(HAVE_SYS_EVENT_H) | 
 | #include <sys/event.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_PTRACE_H) | 
 | /* Avoid https://sourceware.org/bugzilla/show_bug.cgi?id=762 .  */ | 
 | #define ia64_fpreg pt_ia64_fpreg | 
 | #define pt_all_user_regs pt_ia64_all_user_regs | 
 | /* Avoid redefinition of ptrace_peeksiginfo from <sys/ptrace.h>. | 
 |    https://gcc.gnu.org/PR81324 .  */ | 
 | #define ptrace_peeksiginfo_args ignore_ptrace_peeksiginfo_args | 
 | #include <linux/ptrace.h> | 
 | #undef ia64_fpreg | 
 | #undef pt_all_user_regs | 
 | #undef ptrace_peeksiginfo_args | 
 | #endif | 
 | #if defined(HAVE_LINUX_RTNETLINK_H) | 
 | #include <linux/rtnetlink.h> | 
 | #endif | 
 | #if defined(HAVE_NET_BPF_H) | 
 | #include <net/bpf.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_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 | 
 | #if defined(HAVE_SEMAPHORE_H) | 
 | #include <semaphore.h> | 
 | #endif | 
 | #if defined(HAVE_PORT_H) | 
 | #include <port.h> | 
 | #endif | 
 | #if defined(HAVE_LWP_H) | 
 | #include <lwp.h> | 
 | #endif | 
 |  | 
 | #ifdef USE_LIBFFI | 
 | #include "ffi.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 | 
 | #ifdef BIOCFLUSH | 
 |   BIOCFLUSH_val = BIOCFLUSH, | 
 | #endif | 
 | #ifdef BIOCGBLEN | 
 |   BIOCGBLEN_val = BIOCGBLEN, | 
 | #endif | 
 | #ifdef BIOCGDLT | 
 |   BIOCGDLT_val = BIOCGDLT, | 
 | #endif | 
 | #ifdef BIOCGETIF | 
 |   BIOCGETIF_val = BIOCGETIF, | 
 | #endif | 
 | #ifdef BIOCGHDRCMPLT | 
 |   BIOCGHDRCMPLT_val = BIOCGHDRCMPLT, | 
 | #endif | 
 | #ifdef BIOCGRTIMEOUT | 
 |   BIOCGRTIMEOUT_val = BIOCGRTIMEOUT, | 
 | #endif | 
 | #ifdef BIOCGSTATS | 
 |   BIOCGSTATS_val = BIOCGSTATS, | 
 | #endif | 
 | #ifdef BIOCIMMEDIATE | 
 |   BIOCIMMEDIATE_val = BIOCIMMEDIATE, | 
 | #endif | 
 | #ifdef BIOCPROMISC | 
 |   BIOCPROMISC_val = BIOCPROMISC, | 
 | #endif | 
 | #ifdef BIOCSBLEN | 
 |   BIOCSBLEN_val = BIOCSBLEN, | 
 | #endif | 
 | #ifdef BIOCSDLT | 
 |   BIOCSDLT_val = BIOCSDLT, | 
 | #endif | 
 | #ifdef BIOCSETF | 
 |   BIOCSETF_val = BIOCSETF, | 
 | #endif | 
 | #ifdef BIOCSETIF | 
 |   BIOCSETIF_val = BIOCSETIF, | 
 | #endif | 
 | #ifdef BIOCSHDRCMPLT | 
 |   BIOCSHDRCMPLT_val = BIOCSHDRCMPLT, | 
 | #endif | 
 | #ifdef BIOCSRTIMEOUT | 
 |   BIOCSRTIMEOUT_val = BIOCSRTIMEOUT, | 
 | #endif | 
 | #ifdef BIOCVERSION | 
 |   BIOCVERSION_val = BIOCVERSION, | 
 | #endif | 
 | #ifdef SO_RCVTIMEO | 
 |   SO_RCVTIMEO_val = SO_RCVTIMEO, | 
 | #endif | 
 | }; | 
 |  | 
 | // SIOCGIFMTU can't be added in the above enum as it might | 
 | // be signed in some OSes. | 
 | #ifdef SIOCGIFMTU | 
 | enum { | 
 |   SIOCGIFMTU_val = SIOCGIFMTU, | 
 | }; | 
 | #endif | 
 |  | 
 | #if defined(HAVE_SYS_EPOLL_H) | 
 | enum { | 
 |   epoll_data_offset = offsetof(struct epoll_event, data) | 
 | }; | 
 | #endif | 
 |  | 
 | // The following section introduces explicit references to types and | 
 | // constants of interest to support bootstrapping libgo using a | 
 | // compiler that doesn't support -fdump-go-spec (e.g., clang), via | 
 | // DWARF-based tools. This process is made more difficult due to the | 
 | // fact that clang tries hard to omit types/constants from DWARF if it | 
 | // can't find explicit references to them, so here we make sure that | 
 | // key items are mentioned in ways that will force them into the | 
 | // generated DWARF. | 
 |  | 
 | #if defined(__clang__) | 
 |  | 
 | // Make a reference to a type | 
 | #define TREF(typ) typ typ ## ref | 
 |  | 
 | // Make a reference to an opaque type | 
 | #define OTREF(typ) typ *typ ## ref | 
 |  | 
 | // Make a reference to a struct tag | 
 | #define SREF(stag) struct stag stag ## ref | 
 |  | 
 | // Make a reference to an enum literal | 
 | #define EREF(elit) unsigned elit ## fn(unsigned x) { return x == elit ? 1 : 0; } | 
 |  | 
 | //...................................................................... | 
 |  | 
 | // From dirent.h | 
 | SREF(dirent); | 
 | SREF(dirent64); | 
 | OTREF(DIR); | 
 | EREF(DT_UNKNOWN); | 
 |  | 
 | // From fcntl.h | 
 | SREF(flock); | 
 | SREF(flock64); | 
 |  | 
 | // From ffi headers | 
 | SREF(_ffi_type); | 
 | TREF(ffi_cif); | 
 | TREF(ffi_abi); | 
 | TREF(ffi_status); | 
 | EREF(FFI_OK); | 
 |  | 
 | // From grp.h | 
 | SREF(group); | 
 |  | 
 | #if defined(HAVE_LINUX_FILTER_H) | 
 | // From linux/filter.h | 
 | SREF(sock_filter); | 
 | SREF(sock_fprog); | 
 | #endif | 
 |  | 
 | // From linux/if.h | 
 | EREF(IFF_UP); | 
 |  | 
 | #if defined(HAVE_LINUX_IF_ADDR_H) | 
 | // From linux/if_addr.h | 
 | SREF(ifaddrmsg); | 
 | EREF(IFA_ADDRESS); | 
 | #endif | 
 |  | 
 | #if defined(HAVE_LINUX_RTNETLINK_H) | 
 | // From linux/if_link.h | 
 | EREF(IFLA_ADDRESS); | 
 | #endif | 
 |  | 
 | // From in.h, in6.h, icmp6.h | 
 | SREF(ip_mreq); | 
 | SREF(ip_mreqn); | 
 | SREF(ipv6_mreq); | 
 | SREF(ip6_mtuinfo); | 
 | SREF(icmp6_filter); | 
 | SREF(in_pktinfo); | 
 | EREF(IPPROTO_TCP); | 
 |  | 
 | #if defined(HAVE_LINUX_RTNETLINK_H) | 
 | // From linux/rtnetlink.h | 
 | SREF(rtgenmsg); | 
 | SREF(rtmsg); | 
 | SREF(ifinfomsg); | 
 | SREF(rtattr); | 
 | SREF(rtnexthop); | 
 | EREF(RTM_BASE); | 
 | EREF(RTN_UNSPEC); | 
 | #endif | 
 |  | 
 | // From netdb.h | 
 | SREF(addrinfo); | 
 |  | 
 | // From netlink.h | 
 | SREF(nlattr); | 
 | SREF(nlmsgerr); | 
 |  | 
 | // From pthread.h and related | 
 | TREF(pthread_attr_t); | 
 | TREF(pthread_t); | 
 | TREF(pthread_mutex_t); | 
 | TREF(pthread_mutexattr_t); | 
 |  | 
 | // From pwd.h | 
 | SREF(passwd); | 
 |  | 
 | // From signal.h and related | 
 | TREF(sigset_t); | 
 | TREF(siginfo_t); | 
 | TREF(stack_t); | 
 | SREF(sigaction); | 
 | SREF(sigstack); | 
 | EREF(SI_USER); | 
 | EREF(FPE_INTOVF); | 
 | EREF(BUS_ADRALN); | 
 | EREF(SS_ONSTACK); | 
 | EREF(SEGV_MAPERR); | 
 |  | 
 | // From stat.h | 
 | SREF(stat64); | 
 |  | 
 | // From statfs.h | 
 | SREF(statfs); | 
 | SREF(statfs64); | 
 |  | 
 | // From sysinfo.h | 
 | SREF(sysinfo); | 
 |  | 
 | // From <sys/epoll.h> | 
 | #if defined(HAVE_SYS_EPOLL_H) | 
 | SREF(epoll_event); | 
 | EREF(EPOLLIN); | 
 | EREF(epoll_data_offset); | 
 | #endif | 
 |  | 
 | #if defined(HAVE_SYS_MOUNT_H) | 
 | // From sys/mount.h | 
 | EREF(MS_PRIVATE); | 
 | EREF(MNT_FORCE); | 
 | #endif | 
 |  | 
 | #if defined(HAVE_SYS_PTRACE_H) | 
 | // From <sys/ptrace.h> | 
 | #if defined (__aarch64__) | 
 | SREF(user_pt_regs); | 
 | #else | 
 | SREF(pt_regs); | 
 | #endif | 
 | EREF(PTRACE_PEEKTEXT); | 
 | #endif | 
 |  | 
 | // From sys/resource.h | 
 | SREF(rusage); | 
 | SREF(rlimit64); | 
 | EREF(RLIMIT_NOFILE); | 
 | EREF(PRIO_USER); | 
 | EREF(RUSAGE_SELF); | 
 |  | 
 | // From sys/select.h | 
 | TREF(fd_set); | 
 |  | 
 | // From sys/socket.h | 
 | SREF(msghdr); | 
 | SREF(cmsghdr); | 
 | SREF(ucred); | 
 | EREF(MSG_OOB); | 
 | EREF(SCM_RIGHTS); | 
 | EREF(SOCK_RAW); | 
 | EREF(SHUT_RD); | 
 |  | 
 | // From sys/time.h and sys/times.h | 
 | SREF(timespec); | 
 | SREF(timeval); | 
 | SREF(itimerval); | 
 | SREF(tms); | 
 | EREF(ITIMER_PROF); | 
 |  | 
 | #if defined(HAVE_SYS_TIMEX_H) | 
 | // From sys/timex.h | 
 | SREF(timex); | 
 | #endif | 
 |  | 
 | // From sys/types.h | 
 | TREF(pid_t); | 
 | TREF(off_t); | 
 | TREF(loff_t); | 
 | TREF(size_t); | 
 | TREF(ssize_t); | 
 | TREF(mode_t); | 
 | TREF(dev_t); | 
 | TREF(time_t); | 
 |  | 
 | // From sys/ucontext.h | 
 | TREF(ucontext_t); | 
 |  | 
 | #if defined(HAVE_SYS_USER_H) | 
 | // From sys/user.h | 
 | SREF(user_regs_struct); | 
 | #endif | 
 |  | 
 | #if defined(HAVE_SYS_UTSNAME_H) | 
 | // From sys/utsname.h | 
 | SREF(utsname); | 
 | #endif | 
 |  | 
 | // From termios.h | 
 | SREF(termios); | 
 |  | 
 | // From uio.h | 
 | SREF(iovec); | 
 |  | 
 | // From utime.h | 
 | SREF(utimbuf); | 
 |  | 
 | // From unistd.h | 
 | EREF(_PC_NAME_MAX); | 
 | EREF(_SC_GETPW_R_SIZE_MAX); | 
 |  | 
 | #endif // clang |