github.com/golang/gofrontend@v0.0.0-20240429183944-60f985a78526/libgo/sysinfo.c (about)

     1  /* sysinfo.c -- input for mksysinfo.sh
     2  
     3     Copyright 2009 The Go Authors. All rights reserved.
     4     Use of this source code is governed by a BSD-style
     5     license that can be found in the LICENSE file.  */
     6  
     7  /* This file is passed to GCC with the -fdump-go-spec option to
     8     generate a Go version of the system information.  */
     9  
    10  #include "config.h"
    11  
    12  #include <stddef.h>
    13  #include <stdlib.h>
    14  #include <stdio.h>
    15  #include <sys/types.h>
    16  #include <dirent.h>
    17  #include <errno.h>
    18  #include <fcntl.h>
    19  #include <ucontext.h>
    20  #include <netinet/in.h>
    21  /* <netinet/tcp.h> needs u_char/u_short, but <sys/bsd_types> is only
    22     included by <netinet/in.h> if _SGIAPI (i.e. _SGI_SOURCE
    23     && !_XOPEN_SOURCE.
    24     <sys/termios.h> only defines TIOCNOTTY if !_XOPEN_SOURCE, while
    25     <sys/ttold.h> does so unconditionally.  */
    26  #ifdef __sgi__
    27  #include <sys/bsd_types.h>
    28  #include <sys/ttold.h>
    29  #endif
    30  #include <netinet/tcp.h>
    31  #if defined(HAVE_NETINET_IN_SYSTM_H)
    32  #include <netinet/in_systm.h>
    33  #endif
    34  #if defined(HAVE_NETINET_IP_H)
    35  #include <netinet/ip.h>
    36  #endif
    37  #if defined(HAVE_NETINET_IP_MROUTE_H)
    38  #include <netinet/ip_mroute.h>
    39  #endif
    40  #if defined(HAVE_NETINET_IF_ETHER_H)
    41  #include <netinet/if_ether.h>
    42  #endif
    43  #include <signal.h>
    44  #include <sys/ioctl.h>
    45  #include <termios.h>
    46  #if defined(HAVE_SYSCALL_H)
    47  #include <syscall.h>
    48  #endif
    49  #if defined(HAVE_SYS_SYSCALL_H)
    50  #include <sys/syscall.h>
    51  #endif
    52  #if defined(HAVE_SYS_SYSCTL_H)
    53  #include <sys/sysctl.h>
    54  #endif
    55  #if defined(HAVE_SYS_EPOLL_H)
    56  #include <sys/epoll.h>
    57  #endif
    58  #if defined(HAVE_SYS_EVENT_H)
    59  #include <sys/event.h>
    60  #endif
    61  #if defined(HAVE_SYS_FILE_H)
    62  #include <sys/file.h>
    63  #endif
    64  #if defined(HAVE_SYS_MMAN_H)
    65  #include <sys/mman.h>
    66  #endif
    67  #if defined(HAVE_SYS_PRCTL_H)
    68  #include <sys/prctl.h>
    69  #endif
    70  #if defined(HAVE_SYS_PTRACE_H)
    71  #include <sys/ptrace.h>
    72  #endif
    73  #include <sys/resource.h>
    74  #include <sys/uio.h>
    75  #include <sys/socket.h>
    76  #include <sys/stat.h>
    77  #include <sys/time.h>
    78  #include <sys/times.h>
    79  #include <sys/wait.h>
    80  #include <sys/un.h>
    81  #if defined(HAVE_SYS_USER_H)
    82  #include <sys/user.h>
    83  #endif
    84  #if defined(HAVE_SYS_UTSNAME_H)
    85  #include <sys/utsname.h>
    86  #endif
    87  #if defined(HAVE_SYS_SELECT_H)
    88  #include <sys/select.h>
    89  #endif
    90  #include <time.h>
    91  #include <unistd.h>
    92  #include <netdb.h>
    93  #include <pwd.h>
    94  #include <grp.h>
    95  #if defined(HAVE_LINUX_FILTER_H)
    96  #include <linux/filter.h>
    97  #endif
    98  #if defined(HAVE_LINUX_IF_ADDR_H)
    99  #include <linux/if_addr.h>
   100  #endif
   101  #if defined(HAVE_LINUX_IF_ETHER_H)
   102  #include <linux/if_ether.h>
   103  #endif
   104  #if defined(HAVE_LINUX_IF_TUN_H)
   105  #include <linux/if_tun.h>
   106  #endif
   107  #if defined(HAVE_LINUX_NETLINK_H)
   108  #include <linux/netlink.h>
   109  #endif
   110  #if defined(HAVE_LINUX_PTRACE_H)
   111  /* Avoid https://sourceware.org/bugzilla/show_bug.cgi?id=762 .  */
   112  #define ia64_fpreg pt_ia64_fpreg
   113  #define pt_all_user_regs pt_ia64_all_user_regs
   114  /* Avoid redefinition of ptrace_peeksiginfo from <sys/ptrace.h>.
   115     https://gcc.gnu.org/PR81324 .  */
   116  #define ptrace_peeksiginfo_args ignore_ptrace_peeksiginfo_args
   117  #include <linux/ptrace.h>
   118  #undef ia64_fpreg
   119  #undef pt_all_user_regs
   120  #undef ptrace_peeksiginfo_args
   121  #endif
   122  #if defined(HAVE_LINUX_RTNETLINK_H)
   123  #include <linux/rtnetlink.h>
   124  #endif
   125  #if defined(HAVE_NET_BPF_H)
   126  #include <net/bpf.h>
   127  #endif
   128  #if defined(HAVE_NET_IF_H)
   129  #include <net/if.h>
   130  #endif
   131  #if defined(HAVE_NET_IF_ARP_H)
   132  #include <net/if_arp.h>
   133  #endif
   134  #if defined(HAVE_NET_ROUTE_H)
   135  #include <net/route.h>
   136  #endif
   137  #if defined (HAVE_NETPACKET_PACKET_H)
   138  #include <netpacket/packet.h>
   139  #endif
   140  #if defined(HAVE_SYS_MOUNT_H)
   141  #include <sys/mount.h>
   142  #endif
   143  #if defined(HAVE_SYS_VFS_H)
   144  #include <sys/vfs.h>
   145  #endif
   146  #if defined(HAVE_STATFS_H)
   147  #include <sys/statfs.h>
   148  #endif
   149  #if defined(HAVE_SYS_TIMEX_H)
   150  #include <sys/timex.h>
   151  #endif
   152  #if defined(HAVE_SYS_SYSINFO_H)
   153  #include <sys/sysinfo.h>
   154  #endif
   155  #if defined(HAVE_UTIME_H)
   156  #include <utime.h>
   157  #endif
   158  #if defined(HAVE_LINUX_ETHER_H)
   159  #include <linux/ether.h>
   160  #endif
   161  #if defined(HAVE_LINUX_REBOOT_H)
   162  #include <linux/reboot.h>
   163  #endif
   164  #if defined(HAVE_SYS_INOTIFY_H)
   165  #include <sys/inotify.h>
   166  #endif
   167  #if defined(HAVE_NETINET_ICMP6_H)
   168  #include <netinet/icmp6.h>
   169  #endif
   170  #if defined(HAVE_SCHED_H)
   171  #include <sched.h>
   172  #endif
   173  #if defined(HAVE_SEMAPHORE_H)
   174  #include <semaphore.h>
   175  #endif
   176  #if defined(HAVE_PORT_H)
   177  #include <port.h>
   178  #endif
   179  #if defined(HAVE_LWP_H)
   180  #include <lwp.h>
   181  #endif
   182  
   183  #ifdef USE_LIBFFI
   184  #include "ffi.h"
   185  #endif
   186  
   187  /* Constants that may only be defined as expressions on some systems,
   188     expressions too complex for -fdump-go-spec to handle.  These are
   189     handled specially below.  */
   190  enum {
   191  #ifdef TIOCGWINSZ
   192    TIOCGWINSZ_val = TIOCGWINSZ,
   193  #endif
   194  #ifdef TIOCSWINSZ
   195    TIOCSWINSZ_val = TIOCSWINSZ,
   196  #endif
   197  #ifdef TIOCNOTTY
   198    TIOCNOTTY_val = TIOCNOTTY,
   199  #endif
   200  #ifdef TIOCSCTTY
   201    TIOCSCTTY_val = TIOCSCTTY,
   202  #endif
   203  #ifdef TIOCGPGRP
   204    TIOCGPGRP_val = TIOCGPGRP,
   205  #endif
   206  #ifdef TIOCSPGRP
   207    TIOCSPGRP_val = TIOCSPGRP,
   208  #endif
   209  #ifdef TIOCGPTN
   210    TIOCGPTN_val = TIOCGPTN,
   211  #endif
   212  #ifdef TIOCSPTLCK
   213    TIOCSPTLCK_val = TIOCSPTLCK,
   214  #endif
   215  #ifdef TIOCGDEV
   216    TIOCGDEV_val = TIOCGDEV,
   217  #endif
   218  #ifdef TIOCSIG
   219    TIOCSIG_val = TIOCSIG,
   220  #endif
   221  #ifdef TCGETS
   222    TCGETS_val = TCGETS,
   223  #endif
   224  #ifdef TCSETS
   225    TCSETS_val = TCSETS,
   226  #endif
   227  #ifdef TUNSETIFF
   228    TUNSETIFF_val = TUNSETIFF,
   229  #endif
   230  #ifdef TUNSETNOCSUM
   231    TUNSETNOCSUM_val = TUNSETNOCSUM,
   232  #endif
   233  #ifdef TUNSETDEBUG
   234    TUNSETDEBUG_val = TUNSETDEBUG,
   235  #endif
   236  #ifdef TUNSETPERSIST
   237    TUNSETPERSIST_val = TUNSETPERSIST,
   238  #endif
   239  #ifdef TUNSETOWNER
   240    TUNSETOWNER_val = TUNSETOWNER,
   241  #endif
   242  #ifdef TUNSETLINK
   243    TUNSETLINK_val = TUNSETLINK,
   244  #endif
   245  #ifdef TUNSETGROUP
   246    TUNSETGROUP_val = TUNSETGROUP,
   247  #endif
   248  #ifdef TUNGETFEATURES
   249    TUNGETFEATURES_val = TUNGETFEATURES,
   250  #endif
   251  #ifdef TUNSETOFFLOAD
   252    TUNSETOFFLOAD_val = TUNSETOFFLOAD,
   253  #endif
   254  #ifdef TUNSETTXFILTER
   255    TUNSETTXFILTER_val = TUNSETTXFILTER,
   256  #endif
   257  #ifdef TUNGETIFF
   258    TUNGETIFF_val = TUNGETIFF,
   259  #endif
   260  #ifdef TUNGETSNDBUF
   261    TUNGETSNDBUF_val = TUNGETSNDBUF,
   262  #endif
   263  #ifdef TUNSETSNDBUF
   264    TUNSETSNDBUF_val = TUNSETSNDBUF,
   265  #endif
   266  #ifdef TUNATTACHFILTER
   267    TUNATTACHFILTER_val = TUNATTACHFILTER,
   268  #endif
   269  #ifdef TUNDETACHFILTER
   270    TUNDETACHFILTER_val = TUNDETACHFILTER,
   271  #endif
   272  #ifdef TUNGETVNETHDRSZ
   273    TUNGETVNETHDRSZ_val = TUNGETVNETHDRSZ,
   274  #endif
   275  #ifdef TUNSETVNETHDRSZ
   276    TUNSETVNETHDRSZ_val = TUNSETVNETHDRSZ,
   277  #endif
   278  #ifdef TUNSETQUEUE
   279    TUNSETQUEUE_val = TUNSETQUEUE,
   280  #endif
   281  #ifdef TUNSETIFINDEX
   282    TUNSETIFINDEX_val = TUNSETIFINDEX,
   283  #endif
   284  #ifdef TUNGETFILTER
   285    TUNGETFILTER_val = TUNGETFILTER,
   286  #endif
   287  #ifdef NLA_HDRLEN
   288    NLA_HDRLEN_val = NLA_HDRLEN,
   289  #endif
   290  #ifdef BIOCFLUSH
   291    BIOCFLUSH_val = BIOCFLUSH,
   292  #endif
   293  #ifdef BIOCGBLEN
   294    BIOCGBLEN_val = BIOCGBLEN,
   295  #endif
   296  #ifdef BIOCGDLT
   297    BIOCGDLT_val = BIOCGDLT,
   298  #endif
   299  #ifdef BIOCGETIF
   300    BIOCGETIF_val = BIOCGETIF,
   301  #endif
   302  #ifdef BIOCGHDRCMPLT
   303    BIOCGHDRCMPLT_val = BIOCGHDRCMPLT,
   304  #endif
   305  #ifdef BIOCGRTIMEOUT
   306    BIOCGRTIMEOUT_val = BIOCGRTIMEOUT,
   307  #endif
   308  #ifdef BIOCGSTATS
   309    BIOCGSTATS_val = BIOCGSTATS,
   310  #endif
   311  #ifdef BIOCIMMEDIATE
   312    BIOCIMMEDIATE_val = BIOCIMMEDIATE,
   313  #endif
   314  #ifdef BIOCPROMISC
   315    BIOCPROMISC_val = BIOCPROMISC,
   316  #endif
   317  #ifdef BIOCSBLEN
   318    BIOCSBLEN_val = BIOCSBLEN,
   319  #endif
   320  #ifdef BIOCSDLT
   321    BIOCSDLT_val = BIOCSDLT,
   322  #endif
   323  #ifdef BIOCSETF
   324    BIOCSETF_val = BIOCSETF,
   325  #endif
   326  #ifdef BIOCSETIF
   327    BIOCSETIF_val = BIOCSETIF,
   328  #endif
   329  #ifdef BIOCSHDRCMPLT
   330    BIOCSHDRCMPLT_val = BIOCSHDRCMPLT,
   331  #endif
   332  #ifdef BIOCSRTIMEOUT
   333    BIOCSRTIMEOUT_val = BIOCSRTIMEOUT,
   334  #endif
   335  #ifdef BIOCVERSION
   336    BIOCVERSION_val = BIOCVERSION,
   337  #endif
   338  #ifdef SO_RCVTIMEO
   339    SO_RCVTIMEO_val = SO_RCVTIMEO,
   340  #endif
   341  };
   342  
   343  // SIOCGIFMTU can't be added in the above enum as it might
   344  // be signed in some OSes.
   345  #ifdef SIOCGIFMTU
   346  enum {
   347    SIOCGIFMTU_val = SIOCGIFMTU,
   348  };
   349  #endif
   350  
   351  #if defined(HAVE_SYS_EPOLL_H)
   352  enum {
   353    epoll_data_offset = offsetof(struct epoll_event, data)
   354  };
   355  #endif
   356  
   357  #if !defined(SYS_timer_settime) && defined(SYS_timer_settime32)
   358  // musl defines SYS_timer_settim32 on 32-bit systems.
   359  #define SYS_timer_settime SYS_timer_settime32
   360  #endif
   361  
   362  #if defined(HAVE_LOFF_T)
   363  // loff_t can be defined as a macro; for -fgo-dump-spec make sure we
   364  // see a typedef.
   365  typedef loff_t libgo_loff_t_type;
   366  #endif
   367  
   368  #if defined(HAVE_OFF64_T)
   369  typedef off64_t libgo_off_t_type;
   370  #else
   371  typedef off_t libgo_off_t_type;
   372  #endif
   373  
   374  // The following section introduces explicit references to types and
   375  // constants of interest to support bootstrapping libgo using a
   376  // compiler that doesn't support -fdump-go-spec (e.g., clang), via
   377  // DWARF-based tools. This process is made more difficult due to the
   378  // fact that clang tries hard to omit types/constants from DWARF if it
   379  // can't find explicit references to them, so here we make sure that
   380  // key items are mentioned in ways that will force them into the
   381  // generated DWARF.
   382  
   383  #if defined(__clang__)
   384  
   385  // Make a reference to a type
   386  #define TREF(typ) typ typ ## ref
   387  
   388  // Make a reference to an opaque type
   389  #define OTREF(typ) typ *typ ## ref
   390  
   391  // Make a reference to a struct tag
   392  #define SREF(stag) struct stag stag ## ref
   393  
   394  // Make a reference to an enum literal
   395  #define EREF(elit) unsigned elit ## fn(unsigned x) { return x == elit ? 1 : 0; }
   396  
   397  //......................................................................
   398  
   399  // From dirent.h
   400  SREF(dirent);
   401  SREF(dirent64);
   402  OTREF(DIR);
   403  EREF(DT_UNKNOWN);
   404  
   405  // From fcntl.h
   406  SREF(flock);
   407  SREF(flock64);
   408  
   409  // From ffi headers
   410  SREF(_ffi_type);
   411  TREF(ffi_cif);
   412  TREF(ffi_abi);
   413  TREF(ffi_status);
   414  EREF(FFI_OK);
   415  
   416  // From grp.h
   417  SREF(group);
   418  
   419  #if defined(HAVE_LINUX_FILTER_H)
   420  // From linux/filter.h
   421  SREF(sock_filter);
   422  SREF(sock_fprog);
   423  #endif
   424  
   425  // From linux/if.h
   426  EREF(IFF_UP);
   427  
   428  #if defined(HAVE_LINUX_IF_ADDR_H)
   429  // From linux/if_addr.h
   430  SREF(ifaddrmsg);
   431  EREF(IFA_ADDRESS);
   432  #endif
   433  
   434  #if defined(HAVE_LINUX_RTNETLINK_H)
   435  // From linux/if_link.h
   436  EREF(IFLA_ADDRESS);
   437  #endif
   438  
   439  // From in.h, in6.h, icmp6.h
   440  SREF(ip_mreq);
   441  SREF(ip_mreqn);
   442  SREF(ipv6_mreq);
   443  SREF(ip6_mtuinfo);
   444  SREF(icmp6_filter);
   445  SREF(in_pktinfo);
   446  EREF(IPPROTO_TCP);
   447  
   448  #if defined(HAVE_LINUX_RTNETLINK_H)
   449  // From linux/rtnetlink.h
   450  SREF(rtgenmsg);
   451  SREF(rtmsg);
   452  SREF(ifinfomsg);
   453  SREF(rtattr);
   454  SREF(rtnexthop);
   455  EREF(RTM_BASE);
   456  EREF(RTN_UNSPEC);
   457  #endif
   458  
   459  // From netdb.h
   460  SREF(addrinfo);
   461  
   462  // From netlink.h
   463  SREF(nlattr);
   464  SREF(nlmsgerr);
   465  
   466  // From pthread.h and related
   467  TREF(pthread_attr_t);
   468  TREF(pthread_t);
   469  TREF(pthread_mutex_t);
   470  TREF(pthread_mutexattr_t);
   471  
   472  // From pwd.h
   473  SREF(passwd);
   474  
   475  // From signal.h and related
   476  TREF(sigset_t);
   477  TREF(siginfo_t);
   478  TREF(stack_t);
   479  SREF(sigaction);
   480  SREF(sigstack);
   481  EREF(SI_USER);
   482  EREF(FPE_INTOVF);
   483  EREF(BUS_ADRALN);
   484  EREF(SS_ONSTACK);
   485  EREF(SEGV_MAPERR);
   486  
   487  // From stat.h
   488  SREF(stat64);
   489  
   490  // From statfs.h
   491  SREF(statfs);
   492  SREF(statfs64);
   493  
   494  // From sysinfo.h
   495  SREF(sysinfo);
   496  
   497  // From <sys/epoll.h>
   498  #if defined(HAVE_SYS_EPOLL_H)
   499  SREF(epoll_event);
   500  EREF(EPOLLIN);
   501  EREF(epoll_data_offset);
   502  #endif
   503  
   504  #if defined(HAVE_SYS_MOUNT_H)
   505  // From sys/mount.h
   506  EREF(MS_PRIVATE);
   507  EREF(MNT_FORCE);
   508  #endif
   509  
   510  #if defined(HAVE_SYS_PTRACE_H)
   511  // From <sys/ptrace.h>
   512  #if defined (__aarch64__)
   513  SREF(user_pt_regs);
   514  #else
   515  SREF(pt_regs);
   516  #endif
   517  EREF(PTRACE_PEEKTEXT);
   518  #endif
   519  
   520  // From sys/resource.h
   521  SREF(rusage);
   522  SREF(rlimit64);
   523  EREF(RLIMIT_NOFILE);
   524  EREF(PRIO_USER);
   525  EREF(RUSAGE_SELF);
   526  
   527  // From sys/select.h
   528  TREF(fd_set);
   529  
   530  // From sys/socket.h
   531  SREF(msghdr);
   532  SREF(cmsghdr);
   533  SREF(ucred);
   534  EREF(MSG_OOB);
   535  EREF(SCM_RIGHTS);
   536  EREF(SOCK_RAW);
   537  EREF(SHUT_RD);
   538  
   539  // From sys/time.h and sys/times.h
   540  SREF(timespec);
   541  SREF(timeval);
   542  SREF(itimerval);
   543  SREF(tms);
   544  EREF(ITIMER_PROF);
   545  
   546  #if defined(HAVE_SYS_TIMEX_H)
   547  // From sys/timex.h
   548  SREF(timex);
   549  #endif
   550  
   551  // From sys/types.h
   552  TREF(pid_t);
   553  TREF(off_t);
   554  TREF(libgo_loff_t_type);
   555  TREF(libgo_off_t_type);
   556  TREF(size_t);
   557  TREF(ssize_t);
   558  TREF(mode_t);
   559  TREF(dev_t);
   560  TREF(time_t);
   561  
   562  // From sys/ucontext.h
   563  TREF(ucontext_t);
   564  
   565  #if defined(HAVE_SYS_USER_H)
   566  // From sys/user.h
   567  SREF(user_regs_struct);
   568  #endif
   569  
   570  #if defined(HAVE_SYS_UTSNAME_H)
   571  // From sys/utsname.h
   572  SREF(utsname);
   573  #endif
   574  
   575  // From termios.h
   576  SREF(termios);
   577  
   578  // From uio.h
   579  SREF(iovec);
   580  
   581  // From utime.h
   582  SREF(utimbuf);
   583  
   584  // From unistd.h
   585  EREF(_PC_NAME_MAX);
   586  EREF(_SC_GETPW_R_SIZE_MAX);
   587  
   588  #endif // clang