/* 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 #include #include #include #include #include #include /* needs u_char/u_short, but is only included by if _SGIAPI (i.e. _SGI_SOURCE && !_XOPEN_SOURCE. only defines TIOCNOTTY if !_XOPEN_SOURCE, while does so unconditionally. */ #ifdef __sgi__ #include #include #endif #include #if defined(HAVE_NETINET_IN_SYSTM_H) #include #endif #if defined(HAVE_NETINET_IP_H) #include #endif #if defined(HAVE_NETINET_IP_MROUTE_H) #include #endif #if defined(HAVE_NETINET_IF_ETHER_H) #include #endif #include #include #include #if defined(HAVE_SYSCALL_H) #include #endif #if defined(HAVE_SYS_SYSCALL_H) #include #endif #if defined(HAVE_SYS_EPOLL_H) #include #endif #if defined(HAVE_SYS_EVENT_H) #include #endif #if defined(HAVE_SYS_FILE_H) #include #endif #if defined(HAVE_SYS_MMAN_H) #include #endif #if defined(HAVE_SYS_PRCTL_H) #include #endif #if defined(HAVE_SYS_PTRACE_H) #include #endif #include #include #include #include #include #include #include #include #if defined(HAVE_SYS_USER_H) #include #endif #if defined(HAVE_SYS_UTSNAME_H) #include #endif #if defined(HAVE_SYS_SELECT_H) #include #endif #include #include #include #include #include #if defined(HAVE_LINUX_FILTER_H) #include #endif #if defined(HAVE_LINUX_IF_ADDR_H) #include #endif #if defined(HAVE_LINUX_IF_ETHER_H) #include #endif #if defined(HAVE_LINUX_IF_TUN_H) #include #endif #if defined(HAVE_LINUX_NETLINK_H) #include #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 . https://gcc.gnu.org/PR81324 . */ #define ptrace_peeksiginfo_args ignore_ptrace_peeksiginfo_args #include #undef ia64_fpreg #undef pt_all_user_regs #undef ptrace_peeksiginfo_args #endif #if defined(HAVE_LINUX_RTNETLINK_H) #include #endif #if defined(HAVE_NET_IF_H) #include #endif #if defined(HAVE_NET_IF_ARP_H) #include #endif #if defined(HAVE_NET_ROUTE_H) #include #endif #if defined (HAVE_NETPACKET_PACKET_H) #include #endif #if defined(HAVE_SYS_MOUNT_H) #include #endif #if defined(HAVE_SYS_VFS_H) #include #endif #if defined(HAVE_STATFS_H) #include #endif #if defined(HAVE_SYS_TIMEX_H) #include #endif #if defined(HAVE_SYS_SYSINFO_H) #include #endif #if defined(HAVE_UTIME_H) #include #endif #if defined(HAVE_LINUX_ETHER_H) #include #endif #if defined(HAVE_LINUX_FS_H) #include #endif #if defined(HAVE_LINUX_REBOOT_H) #include #endif #if defined(HAVE_SYS_INOTIFY_H) #include #endif #if defined(HAVE_NETINET_ICMP6_H) #include #endif #if defined(HAVE_SCHED_H) #include #endif #if defined(HAVE_SEMAPHORE_H) #include #endif #if defined(HAVE_PORT_H) #include #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 }; #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); // 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 #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 #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); // 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