...

Text file src/pkg/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh

     1	#!/usr/bin/env bash
     2	# Copyright 2009 The Go Authors. All rights reserved.
     3	# Use of this source code is governed by a BSD-style
     4	# license that can be found in the LICENSE file.
     5	
     6	# Generate Go code listing errors and other #defined constant
     7	# values (ENAMETOOLONG etc.), by asking the preprocessor
     8	# about the definitions.
     9	
    10	unset LANG
    11	export LC_ALL=C
    12	export LC_CTYPE=C
    13	
    14	if test -z "$GOARCH" -o -z "$GOOS"; then
    15		echo 1>&2 "GOARCH or GOOS not defined in environment"
    16		exit 1
    17	fi
    18	
    19	# Check that we are using the new build system if we should
    20	if [[ "$GOOS" = "linux" ]] && [[ "$GOLANG_SYS_BUILD" != "docker" ]]; then
    21		echo 1>&2 "In the Docker based build system, mkerrors should not be called directly."
    22		echo 1>&2 "See README.md"
    23		exit 1
    24	fi
    25	
    26	if [[ "$GOOS" = "aix" ]]; then
    27		CC=${CC:-gcc}
    28	else
    29		CC=${CC:-cc}
    30	fi
    31	
    32	if [[ "$GOOS" = "solaris" ]]; then
    33		# Assumes GNU versions of utilities in PATH.
    34		export PATH=/usr/gnu/bin:$PATH
    35	fi
    36	
    37	uname=$(uname)
    38	
    39	includes_AIX='
    40	#include <net/if.h>
    41	#include <net/netopt.h>
    42	#include <netinet/ip_mroute.h>
    43	#include <sys/protosw.h>
    44	#include <sys/stropts.h>
    45	#include <sys/mman.h>
    46	#include <sys/poll.h>
    47	#include <sys/termio.h>
    48	#include <termios.h>
    49	#include <fcntl.h>
    50	
    51	#define AF_LOCAL AF_UNIX
    52	'
    53	
    54	includes_Darwin='
    55	#define _DARWIN_C_SOURCE
    56	#define KERNEL
    57	#define _DARWIN_USE_64_BIT_INODE
    58	#include <stdint.h>
    59	#include <sys/attr.h>
    60	#include <sys/types.h>
    61	#include <sys/event.h>
    62	#include <sys/ptrace.h>
    63	#include <sys/socket.h>
    64	#include <sys/sockio.h>
    65	#include <sys/sysctl.h>
    66	#include <sys/mman.h>
    67	#include <sys/mount.h>
    68	#include <sys/utsname.h>
    69	#include <sys/wait.h>
    70	#include <sys/xattr.h>
    71	#include <net/bpf.h>
    72	#include <net/if.h>
    73	#include <net/if_types.h>
    74	#include <net/route.h>
    75	#include <netinet/in.h>
    76	#include <netinet/ip.h>
    77	#include <termios.h>
    78	'
    79	
    80	includes_DragonFly='
    81	#include <sys/types.h>
    82	#include <sys/event.h>
    83	#include <sys/socket.h>
    84	#include <sys/sockio.h>
    85	#include <sys/stat.h>
    86	#include <sys/sysctl.h>
    87	#include <sys/mman.h>
    88	#include <sys/mount.h>
    89	#include <sys/wait.h>
    90	#include <sys/ioctl.h>
    91	#include <net/bpf.h>
    92	#include <net/if.h>
    93	#include <net/if_types.h>
    94	#include <net/route.h>
    95	#include <netinet/in.h>
    96	#include <termios.h>
    97	#include <netinet/ip.h>
    98	#include <net/ip_mroute/ip_mroute.h>
    99	'
   100	
   101	includes_FreeBSD='
   102	#include <sys/capsicum.h>
   103	#include <sys/param.h>
   104	#include <sys/types.h>
   105	#include <sys/event.h>
   106	#include <sys/socket.h>
   107	#include <sys/sockio.h>
   108	#include <sys/stat.h>
   109	#include <sys/sysctl.h>
   110	#include <sys/mman.h>
   111	#include <sys/mount.h>
   112	#include <sys/wait.h>
   113	#include <sys/ioctl.h>
   114	#include <net/bpf.h>
   115	#include <net/if.h>
   116	#include <net/if_types.h>
   117	#include <net/route.h>
   118	#include <netinet/in.h>
   119	#include <termios.h>
   120	#include <netinet/ip.h>
   121	#include <netinet/ip_mroute.h>
   122	#include <sys/extattr.h>
   123	
   124	#if __FreeBSD__ >= 10
   125	#define IFT_CARP	0xf8	// IFT_CARP is deprecated in FreeBSD 10
   126	#undef SIOCAIFADDR
   127	#define SIOCAIFADDR	_IOW(105, 26, struct oifaliasreq)	// ifaliasreq contains if_data
   128	#undef SIOCSIFPHYADDR
   129	#define SIOCSIFPHYADDR	_IOW(105, 70, struct oifaliasreq)	// ifaliasreq contains if_data
   130	#endif
   131	'
   132	
   133	includes_Linux='
   134	#define _LARGEFILE_SOURCE
   135	#define _LARGEFILE64_SOURCE
   136	#ifndef __LP64__
   137	#define _FILE_OFFSET_BITS 64
   138	#endif
   139	#define _GNU_SOURCE
   140	
   141	// <sys/ioctl.h> is broken on powerpc64, as it fails to include definitions of
   142	// these structures. We just include them copied from <bits/termios.h>.
   143	#if defined(__powerpc__)
   144	struct sgttyb {
   145	        char    sg_ispeed;
   146	        char    sg_ospeed;
   147	        char    sg_erase;
   148	        char    sg_kill;
   149	        short   sg_flags;
   150	};
   151	
   152	struct tchars {
   153	        char    t_intrc;
   154	        char    t_quitc;
   155	        char    t_startc;
   156	        char    t_stopc;
   157	        char    t_eofc;
   158	        char    t_brkc;
   159	};
   160	
   161	struct ltchars {
   162	        char    t_suspc;
   163	        char    t_dsuspc;
   164	        char    t_rprntc;
   165	        char    t_flushc;
   166	        char    t_werasc;
   167	        char    t_lnextc;
   168	};
   169	#endif
   170	
   171	#include <bits/sockaddr.h>
   172	#include <sys/epoll.h>
   173	#include <sys/eventfd.h>
   174	#include <sys/inotify.h>
   175	#include <sys/ioctl.h>
   176	#include <sys/mman.h>
   177	#include <sys/mount.h>
   178	#include <sys/prctl.h>
   179	#include <sys/stat.h>
   180	#include <sys/types.h>
   181	#include <sys/time.h>
   182	#include <sys/signalfd.h>
   183	#include <sys/socket.h>
   184	#include <sys/xattr.h>
   185	#include <linux/errqueue.h>
   186	#include <linux/if.h>
   187	#include <linux/if_alg.h>
   188	#include <linux/if_arp.h>
   189	#include <linux/if_ether.h>
   190	#include <linux/if_ppp.h>
   191	#include <linux/if_tun.h>
   192	#include <linux/if_packet.h>
   193	#include <linux/if_addr.h>
   194	#include <linux/falloc.h>
   195	#include <linux/fanotify.h>
   196	#include <linux/filter.h>
   197	#include <linux/fs.h>
   198	#include <linux/kexec.h>
   199	#include <linux/keyctl.h>
   200	#include <linux/magic.h>
   201	#include <linux/memfd.h>
   202	#include <linux/module.h>
   203	#include <linux/netfilter/nfnetlink.h>
   204	#include <linux/netlink.h>
   205	#include <linux/net_namespace.h>
   206	#include <linux/perf_event.h>
   207	#include <linux/random.h>
   208	#include <linux/reboot.h>
   209	#include <linux/rtnetlink.h>
   210	#include <linux/ptrace.h>
   211	#include <linux/sched.h>
   212	#include <linux/seccomp.h>
   213	#include <linux/sockios.h>
   214	#include <linux/wait.h>
   215	#include <linux/icmpv6.h>
   216	#include <linux/serial.h>
   217	#include <linux/can.h>
   218	#include <linux/vm_sockets.h>
   219	#include <linux/taskstats.h>
   220	#include <linux/genetlink.h>
   221	#include <linux/watchdog.h>
   222	#include <linux/hdreg.h>
   223	#include <linux/rtc.h>
   224	#include <linux/if_xdp.h>
   225	#include <linux/cryptouser.h>
   226	#include <mtd/ubi-user.h>
   227	#include <net/route.h>
   228	
   229	#if defined(__sparc__)
   230	// On sparc{,64}, the kernel defines struct termios2 itself which clashes with the
   231	// definition in glibc. As only the error constants are needed here, include the
   232	// generic termibits.h (which is included by termbits.h on sparc).
   233	#include <asm-generic/termbits.h>
   234	#else
   235	#include <asm/termbits.h>
   236	#endif
   237	
   238	#ifndef MSG_FASTOPEN
   239	#define MSG_FASTOPEN    0x20000000
   240	#endif
   241	
   242	#ifndef PTRACE_GETREGS
   243	#define PTRACE_GETREGS	0xc
   244	#endif
   245	
   246	#ifndef PTRACE_SETREGS
   247	#define PTRACE_SETREGS	0xd
   248	#endif
   249	
   250	#ifndef SOL_NETLINK
   251	#define SOL_NETLINK	270
   252	#endif
   253	
   254	#ifdef SOL_BLUETOOTH
   255	// SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h
   256	// but it is already in bluetooth_linux.go
   257	#undef SOL_BLUETOOTH
   258	#endif
   259	
   260	// Certain constants are missing from the fs/crypto UAPI
   261	#define FS_KEY_DESC_PREFIX              "fscrypt:"
   262	#define FS_KEY_DESC_PREFIX_SIZE         8
   263	#define FS_MAX_KEY_SIZE                 64
   264	'
   265	
   266	includes_NetBSD='
   267	#include <sys/types.h>
   268	#include <sys/param.h>
   269	#include <sys/event.h>
   270	#include <sys/extattr.h>
   271	#include <sys/mman.h>
   272	#include <sys/mount.h>
   273	#include <sys/socket.h>
   274	#include <sys/sockio.h>
   275	#include <sys/sysctl.h>
   276	#include <sys/termios.h>
   277	#include <sys/ttycom.h>
   278	#include <sys/wait.h>
   279	#include <net/bpf.h>
   280	#include <net/if.h>
   281	#include <net/if_types.h>
   282	#include <net/route.h>
   283	#include <netinet/in.h>
   284	#include <netinet/in_systm.h>
   285	#include <netinet/ip.h>
   286	#include <netinet/ip_mroute.h>
   287	#include <netinet/if_ether.h>
   288	
   289	// Needed since <sys/param.h> refers to it...
   290	#define schedppq 1
   291	'
   292	
   293	includes_OpenBSD='
   294	#include <sys/types.h>
   295	#include <sys/param.h>
   296	#include <sys/event.h>
   297	#include <sys/mman.h>
   298	#include <sys/mount.h>
   299	#include <sys/socket.h>
   300	#include <sys/sockio.h>
   301	#include <sys/stat.h>
   302	#include <sys/sysctl.h>
   303	#include <sys/termios.h>
   304	#include <sys/ttycom.h>
   305	#include <sys/unistd.h>
   306	#include <sys/wait.h>
   307	#include <net/bpf.h>
   308	#include <net/if.h>
   309	#include <net/if_types.h>
   310	#include <net/if_var.h>
   311	#include <net/route.h>
   312	#include <netinet/in.h>
   313	#include <netinet/in_systm.h>
   314	#include <netinet/ip.h>
   315	#include <netinet/ip_mroute.h>
   316	#include <netinet/if_ether.h>
   317	#include <net/if_bridge.h>
   318	
   319	// We keep some constants not supported in OpenBSD 5.5 and beyond for
   320	// the promise of compatibility.
   321	#define EMUL_ENABLED		0x1
   322	#define EMUL_NATIVE		0x2
   323	#define IPV6_FAITH		0x1d
   324	#define IPV6_OPTIONS		0x1
   325	#define IPV6_RTHDR_STRICT	0x1
   326	#define IPV6_SOCKOPT_RESERVED1	0x3
   327	#define SIOCGIFGENERIC		0xc020693a
   328	#define SIOCSIFGENERIC		0x80206939
   329	#define WALTSIG			0x4
   330	'
   331	
   332	includes_SunOS='
   333	#include <limits.h>
   334	#include <sys/types.h>
   335	#include <sys/socket.h>
   336	#include <sys/sockio.h>
   337	#include <sys/stat.h>
   338	#include <sys/mman.h>
   339	#include <sys/wait.h>
   340	#include <sys/ioctl.h>
   341	#include <sys/mkdev.h>
   342	#include <net/bpf.h>
   343	#include <net/if.h>
   344	#include <net/if_arp.h>
   345	#include <net/if_types.h>
   346	#include <net/route.h>
   347	#include <netinet/in.h>
   348	#include <termios.h>
   349	#include <netinet/ip.h>
   350	#include <netinet/ip_mroute.h>
   351	'
   352	
   353	
   354	includes='
   355	#include <sys/types.h>
   356	#include <sys/file.h>
   357	#include <fcntl.h>
   358	#include <dirent.h>
   359	#include <sys/socket.h>
   360	#include <netinet/in.h>
   361	#include <netinet/ip.h>
   362	#include <netinet/ip6.h>
   363	#include <netinet/tcp.h>
   364	#include <errno.h>
   365	#include <sys/signal.h>
   366	#include <signal.h>
   367	#include <sys/resource.h>
   368	#include <time.h>
   369	'
   370	ccflags="$@"
   371	
   372	# Write go tool cgo -godefs input.
   373	(
   374		echo package unix
   375		echo
   376		echo '/*'
   377		indirect="includes_$(uname)"
   378		echo "${!indirect} $includes"
   379		echo '*/'
   380		echo 'import "C"'
   381		echo 'import "syscall"'
   382		echo
   383		echo 'const ('
   384	
   385		# The gcc command line prints all the #defines
   386		# it encounters while processing the input
   387		echo "${!indirect} $includes" | $CC -x c - -E -dM $ccflags |
   388		awk '
   389			$1 != "#define" || $2 ~ /\(/ || $3 == "" {next}
   390	
   391			$2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next}  # 386 registers
   392			$2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next}
   393			$2 ~ /^(SCM_SRCRT)$/ {next}
   394			$2 ~ /^(MAP_FAILED)$/ {next}
   395			$2 ~ /^ELF_.*$/ {next}# <asm/elf.h> contains ELF_ARCH, etc.
   396	
   397			$2 ~ /^EXTATTR_NAMESPACE_NAMES/ ||
   398			$2 ~ /^EXTATTR_NAMESPACE_[A-Z]+_STRING/ {next}
   399	
   400			$2 !~ /^ECCAPBITS/ &&
   401			$2 !~ /^ETH_/ &&
   402			$2 !~ /^EPROC_/ &&
   403			$2 !~ /^EQUIV_/ &&
   404			$2 !~ /^EXPR_/ &&
   405			$2 ~ /^E[A-Z0-9_]+$/ ||
   406			$2 ~ /^B[0-9_]+$/ ||
   407			$2 ~ /^(OLD|NEW)DEV$/ ||
   408			$2 == "BOTHER" ||
   409			$2 ~ /^CI?BAUD(EX)?$/ ||
   410			$2 == "IBSHIFT" ||
   411			$2 ~ /^V[A-Z0-9]+$/ ||
   412			$2 ~ /^CS[A-Z0-9]/ ||
   413			$2 ~ /^I(SIG|CANON|CRNL|UCLC|EXTEN|MAXBEL|STRIP|UTF8)$/ ||
   414			$2 ~ /^IGN/ ||
   415			$2 ~ /^IX(ON|ANY|OFF)$/ ||
   416			$2 ~ /^IN(LCR|PCK)$/ ||
   417			$2 !~ "X86_CR3_PCID_NOFLUSH" &&
   418			$2 ~ /(^FLU?SH)|(FLU?SH$)/ ||
   419			$2 ~ /^C(LOCAL|READ|MSPAR|RTSCTS)$/ ||
   420			$2 == "BRKINT" ||
   421			$2 == "HUPCL" ||
   422			$2 == "PENDIN" ||
   423			$2 == "TOSTOP" ||
   424			$2 == "XCASE" ||
   425			$2 == "ALTWERASE" ||
   426			$2 == "NOKERNINFO" ||
   427			$2 ~ /^PAR/ ||
   428			$2 ~ /^SIG[^_]/ ||
   429			$2 ~ /^O[CNPFPL][A-Z]+[^_][A-Z]+$/ ||
   430			$2 ~ /^(NL|CR|TAB|BS|VT|FF)DLY$/ ||
   431			$2 ~ /^(NL|CR|TAB|BS|VT|FF)[0-9]$/ ||
   432			$2 ~ /^O?XTABS$/ ||
   433			$2 ~ /^TC[IO](ON|OFF)$/ ||
   434			$2 ~ /^IN_/ ||
   435			$2 ~ /^LOCK_(SH|EX|NB|UN)$/ ||
   436			$2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ ||
   437			$2 ~ /^TP_STATUS_/ ||
   438			$2 ~ /^FALLOC_/ ||
   439			$2 == "ICMPV6_FILTER" ||
   440			$2 == "SOMAXCONN" ||
   441			$2 == "NAME_MAX" ||
   442			$2 == "IFNAMSIZ" ||
   443			$2 ~ /^CTL_(HW|KERN|MAXNAME|NET|QUERY)$/ ||
   444			$2 ~ /^KERN_(HOSTNAME|OS(RELEASE|TYPE)|VERSION)$/ ||
   445			$2 ~ /^HW_MACHINE$/ ||
   446			$2 ~ /^SYSCTL_VERS/ ||
   447			$2 !~ "MNT_BITS" &&
   448			$2 ~ /^(MS|MNT|UMOUNT)_/ ||
   449			$2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ ||
   450			$2 ~ /^(O|F|[ES]?FD|NAME|S|PTRACE|PT)_/ ||
   451			$2 ~ /^KEXEC_/ ||
   452			$2 ~ /^LINUX_REBOOT_CMD_/ ||
   453			$2 ~ /^LINUX_REBOOT_MAGIC[12]$/ ||
   454			$2 ~ /^MODULE_INIT_/ ||
   455			$2 !~ "NLA_TYPE_MASK" &&
   456			$2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTC|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P|NETNSA)_/ ||
   457			$2 ~ /^SIOC/ ||
   458			$2 ~ /^TIOC/ ||
   459			$2 ~ /^TCGET/ ||
   460			$2 ~ /^TCSET/ ||
   461			$2 ~ /^TC(FLSH|SBRKP?|XONC)$/ ||
   462			$2 !~ "RTF_BITS" &&
   463			$2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ ||
   464			$2 ~ /^BIOC/ ||
   465			$2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ ||
   466			$2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ ||
   467			$2 ~ /^PRIO_(PROCESS|PGRP|USER)/ ||
   468			$2 ~ /^CLONE_[A-Z_]+/ ||
   469			$2 !~ /^(BPF_TIMEVAL)$/ &&
   470			$2 ~ /^(BPF|DLT)_/ ||
   471			$2 ~ /^(CLOCK|TIMER)_/ ||
   472			$2 ~ /^CAN_/ ||
   473			$2 ~ /^CAP_/ ||
   474			$2 ~ /^ALG_/ ||
   475			$2 ~ /^FS_(POLICY_FLAGS|KEY_DESC|ENCRYPTION_MODE|[A-Z0-9_]+_KEY_SIZE|IOC_(GET|SET)_ENCRYPTION)/ ||
   476			$2 ~ /^GRND_/ ||
   477			$2 ~ /^RND/ ||
   478			$2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ ||
   479			$2 ~ /^KEYCTL_/ ||
   480			$2 ~ /^PERF_EVENT_IOC_/ ||
   481			$2 ~ /^SECCOMP_MODE_/ ||
   482			$2 ~ /^SPLICE_/ ||
   483			$2 ~ /^SYNC_FILE_RANGE_/ ||
   484			$2 !~ /^AUDIT_RECORD_MAGIC/ &&
   485			$2 !~ /IOC_MAGIC/ &&
   486			$2 ~ /^[A-Z][A-Z0-9_]+_MAGIC2?$/ ||
   487			$2 ~ /^(VM|VMADDR)_/ ||
   488			$2 ~ /^IOCTL_VM_SOCKETS_/ ||
   489			$2 ~ /^(TASKSTATS|TS)_/ ||
   490			$2 ~ /^CGROUPSTATS_/ ||
   491			$2 ~ /^GENL_/ ||
   492			$2 ~ /^STATX_/ ||
   493			$2 ~ /^RENAME/ ||
   494			$2 ~ /^UBI_IOC[A-Z]/ ||
   495			$2 ~ /^UTIME_/ ||
   496			$2 ~ /^XATTR_(CREATE|REPLACE|NO(DEFAULT|FOLLOW|SECURITY)|SHOWCOMPRESSION)/ ||
   497			$2 ~ /^ATTR_(BIT_MAP_COUNT|(CMN|VOL|FILE)_)/ ||
   498			$2 ~ /^FSOPT_/ ||
   499			$2 ~ /^WDIOC_/ ||
   500			$2 ~ /^NFN/ ||
   501			$2 ~ /^XDP_/ ||
   502			$2 ~ /^(HDIO|WIN|SMART)_/ ||
   503			$2 ~ /^CRYPTO_/ ||
   504			$2 !~ "WMESGLEN" &&
   505			$2 ~ /^W[A-Z0-9]+$/ ||
   506			$2 ~/^PPPIOC/ ||
   507			$2 ~ /^FAN_|FANOTIFY_/ ||
   508			$2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)}
   509			$2 ~ /^__WCOREFLAG$/ {next}
   510			$2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)}
   511	
   512			{next}
   513		' | sort
   514	
   515		echo ')'
   516	) >_const.go
   517	
   518	# Pull out the error names for later.
   519	errors=$(
   520		echo '#include <errno.h>' | $CC -x c - -E -dM $ccflags |
   521		awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' |
   522		sort
   523	)
   524	
   525	# Pull out the signal names for later.
   526	signals=$(
   527		echo '#include <signal.h>' | $CC -x c - -E -dM $ccflags |
   528		awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' |
   529		egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT|SIGMAX64)' |
   530		sort
   531	)
   532	
   533	# Again, writing regexps to a file.
   534	echo '#include <errno.h>' | $CC -x c - -E -dM $ccflags |
   535		awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print "^\t" $2 "[ \t]*=" }' |
   536		sort >_error.grep
   537	echo '#include <signal.h>' | $CC -x c - -E -dM $ccflags |
   538		awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' |
   539		egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT|SIGMAX64)' |
   540		sort >_signal.grep
   541	
   542	echo '// mkerrors.sh' "$@"
   543	echo '// Code generated by the command above; see README.md. DO NOT EDIT.'
   544	echo
   545	echo "// +build ${GOARCH},${GOOS}"
   546	echo
   547	go tool cgo -godefs -- "$@" _const.go >_error.out
   548	cat _error.out | grep -vf _error.grep | grep -vf _signal.grep
   549	echo
   550	echo '// Errors'
   551	echo 'const ('
   552	cat _error.out | grep -f _error.grep | sed 's/=\(.*\)/= syscall.Errno(\1)/'
   553	echo ')'
   554	
   555	echo
   556	echo '// Signals'
   557	echo 'const ('
   558	cat _error.out | grep -f _signal.grep | sed 's/=\(.*\)/= syscall.Signal(\1)/'
   559	echo ')'
   560	
   561	# Run C program to print error and syscall strings.
   562	(
   563		echo -E "
   564	#include <stdio.h>
   565	#include <stdlib.h>
   566	#include <errno.h>
   567	#include <ctype.h>
   568	#include <string.h>
   569	#include <signal.h>
   570	
   571	#define nelem(x) (sizeof(x)/sizeof((x)[0]))
   572	
   573	enum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below
   574	
   575	struct tuple {
   576		int num;
   577		const char *name;
   578	};
   579	
   580	struct tuple errors[] = {
   581	"
   582		for i in $errors
   583		do
   584			echo -E '	{'$i', "'$i'" },'
   585		done
   586	
   587		echo -E "
   588	};
   589	
   590	struct tuple signals[] = {
   591	"
   592		for i in $signals
   593		do
   594			echo -E '	{'$i', "'$i'" },'
   595		done
   596	
   597		# Use -E because on some systems bash builtin interprets \n itself.
   598		echo -E '
   599	};
   600	
   601	static int
   602	tuplecmp(const void *a, const void *b)
   603	{
   604		return ((struct tuple *)a)->num - ((struct tuple *)b)->num;
   605	}
   606	
   607	int
   608	main(void)
   609	{
   610		int i, e;
   611		char buf[1024], *p;
   612	
   613		printf("\n\n// Error table\n");
   614		printf("var errorList = [...]struct {\n");
   615		printf("\tnum  syscall.Errno\n");
   616		printf("\tname string\n");
   617		printf("\tdesc string\n");
   618		printf("} {\n");
   619		qsort(errors, nelem(errors), sizeof errors[0], tuplecmp);
   620		for(i=0; i<nelem(errors); i++) {
   621			e = errors[i].num;
   622			if(i > 0 && errors[i-1].num == e)
   623				continue;
   624			strcpy(buf, strerror(e));
   625			// lowercase first letter: Bad -> bad, but STREAM -> STREAM.
   626			if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z)
   627				buf[0] += a - A;
   628			printf("\t{ %d, \"%s\", \"%s\" },\n", e, errors[i].name, buf);
   629		}
   630		printf("}\n\n");
   631	
   632		printf("\n\n// Signal table\n");
   633		printf("var signalList = [...]struct {\n");
   634		printf("\tnum  syscall.Signal\n");
   635		printf("\tname string\n");
   636		printf("\tdesc string\n");
   637		printf("} {\n");
   638		qsort(signals, nelem(signals), sizeof signals[0], tuplecmp);
   639		for(i=0; i<nelem(signals); i++) {
   640			e = signals[i].num;
   641			if(i > 0 && signals[i-1].num == e)
   642				continue;
   643			strcpy(buf, strsignal(e));
   644			// lowercase first letter: Bad -> bad, but STREAM -> STREAM.
   645			if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z)
   646				buf[0] += a - A;
   647			// cut trailing : number.
   648			p = strrchr(buf, ":"[0]);
   649			if(p)
   650				*p = '\0';
   651			printf("\t{ %d, \"%s\", \"%s\" },\n", e, signals[i].name, buf);
   652		}
   653		printf("}\n\n");
   654	
   655		return 0;
   656	}
   657	
   658	'
   659	) >_errors.c
   660	
   661	$CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out

View as plain text