| /* 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 <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_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_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 |
| |
| #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 |
| }; |
| |
| // 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 |