1265e5898SJohn Baldwin#!/bin/sh 2265e5898SJohn Baldwin# 3265e5898SJohn Baldwin# $FreeBSD$ 4265e5898SJohn Baldwin 5265e5898SJohn Baldwinset -e 6265e5898SJohn Baldwin 7265e5898SJohn Baldwinif [ $# -ne 1 ]; then 8265e5898SJohn Baldwin echo "usage: sh $0 include-dir" 9265e5898SJohn Baldwin exit 1 10265e5898SJohn Baldwinfi 11265e5898SJohn Baldwin 12265e5898SJohn Baldwinincludedir="$1" 13265e5898SJohn Baldwin 14265e5898SJohn BaldwinLC_ALL=C; export LC_ALL 15265e5898SJohn Baldwin 16265e5898SJohn Baldwin# Build a list of headers that have ioctls in them. 17265e5898SJohn Baldwin# XXX should we use an ANSI cpp? 18265e5898SJohn Baldwinioctl_includes=$( 19265e5898SJohn Baldwin cd $includedir 20ec45ce62SAlex Richardson set -e 21ec45ce62SAlex Richardson # if /bin/sh is bash this will avoid further errors due to missing commands 22ec45ce62SAlex Richardson if set -o | grep -q pipefail; then 23ec45ce62SAlex Richardson set -o pipefail 24a342f435SKristof Provost fi 25a342f435SKristof Provost 26ec45ce62SAlex Richardson filter='tee' 27ec45ce62SAlex Richardson if [ "${MK_PF}" = "no" ]; then 28ec45ce62SAlex Richardson filter='egrep -v (net/pfvar|net/if_pfsync)\.h' 29ec45ce62SAlex Richardson fi 30ec45ce62SAlex Richardson # find -s would avoid the need to invoke sort but it is non-portable 31ec45ce62SAlex Richardson find -L ./* -type f -name '*.h' | \ 32ec45ce62SAlex Richardson LC_ALL=C sort | \ 33a342f435SKristof Provost $filter | \ 34265e5898SJohn Baldwin xargs egrep -l \ 35265e5898SJohn Baldwin'^#[ ]*define[ ]+[A-Za-z_][A-Za-z0-9_]*[ ]+_IO[^a-z0-9_]' | 36265e5898SJohn Baldwin awk '{printf("#include <%s>\\n", $1)}' 37265e5898SJohn Baldwin) 38265e5898SJohn Baldwin 39ec45ce62SAlex Richardsonif [ -z "$ioctl_includes" ]; then 40ec45ce62SAlex Richardson echo "Failed to build list of ioctl headers" 41ec45ce62SAlex Richardson exit 1 42ec45ce62SAlex Richardsonfi 43ec45ce62SAlex Richardson 44265e5898SJohn Baldwinawk -v x="$ioctl_includes" 'BEGIN {print x}' | 45265e5898SJohn Baldwin $CPP -nostdinc -I$includedir -dM -DCOMPAT_43TTY - | 46265e5898SJohn Baldwin awk -v ioctl_includes="$ioctl_includes" ' 47265e5898SJohn BaldwinBEGIN { 48265e5898SJohn Baldwin print "/* XXX obnoxious prerequisites. */" 49265e5898SJohn Baldwin print "#define COMPAT_43" 50265e5898SJohn Baldwin print "#define COMPAT_43TTY" 51265e5898SJohn Baldwin print "#include <sys/param.h>" 52265e5898SJohn Baldwin print "#include <sys/devicestat.h>" 53265e5898SJohn Baldwin print "#include <sys/disklabel.h>" 541352798dSKonstantin Belousov print "#include <sys/mman.h>" 55265e5898SJohn Baldwin print "#include <sys/socket.h>" 56265e5898SJohn Baldwin print "#include <sys/time.h>" 57265e5898SJohn Baldwin print "#include <sys/tty.h>" 58265e5898SJohn Baldwin print "#include <bsm/audit.h>" 59265e5898SJohn Baldwin print "#include <net/ethernet.h>" 60265e5898SJohn Baldwin print "#include <net/if.h>" 61265e5898SJohn Baldwin print "#ifdef PF" 62265e5898SJohn Baldwin print "#include <net/pfvar.h>" 63265e5898SJohn Baldwin print "#include <net/if_pfsync.h>" 64265e5898SJohn Baldwin print "#endif" 65265e5898SJohn Baldwin print "#include <net/route.h>" 66265e5898SJohn Baldwin print "#include <netinet/in.h>" 67265e5898SJohn Baldwin print "#include <netinet/ip_mroute.h>" 68265e5898SJohn Baldwin print "#include <netinet6/in6_var.h>" 69265e5898SJohn Baldwin print "#include <netinet6/nd6.h>" 70265e5898SJohn Baldwin print "#include <netinet6/ip6_mroute.h>" 71265e5898SJohn Baldwin print "#include <stdio.h>" 72265e5898SJohn Baldwin print "#include <cam/cam.h>" 73*ec014502SMark Johnston print "#include <cam/scsi/scsi_pass.h>" 749289f547SJohn Baldwin print "#include <stdbool.h>" 75265e5898SJohn Baldwin print "#include <stddef.h>" 76265e5898SJohn Baldwin print "#include <stdint.h>" 77265e5898SJohn Baldwin print "#include <sysdecode.h>" 78265e5898SJohn Baldwin print "" 79265e5898SJohn Baldwin print ioctl_includes 80265e5898SJohn Baldwin print "" 81265e5898SJohn Baldwin print "const char *" 82265e5898SJohn Baldwin print "sysdecode_ioctlname(unsigned long val)" 83265e5898SJohn Baldwin print "{" 84265e5898SJohn Baldwin print "\tconst char *str = NULL;" 85265e5898SJohn Baldwin print "" 86265e5898SJohn Baldwin} 87265e5898SJohn Baldwin 88265e5898SJohn Baldwin/^#[ ]*define[ ]+[A-Za-z_][A-Za-z0-9_]*[ ]+_IO/ { 89265e5898SJohn Baldwin 90265e5898SJohn Baldwin # find where the name starts 91265e5898SJohn Baldwin for (i = 1; i <= NF; i++) 92265e5898SJohn Baldwin if ($i ~ /define/) 93265e5898SJohn Baldwin break; 94265e5898SJohn Baldwin ++i; 95265e5898SJohn Baldwin # 96265e5898SJohn Baldwin printf("\t"); 97265e5898SJohn Baldwin if (n++ > 0) 98265e5898SJohn Baldwin printf("else "); 99265e5898SJohn Baldwin printf("if (val == %s)\n", $i); 100265e5898SJohn Baldwin printf("\t\tstr = \"%s\";\n", $i); 101265e5898SJohn Baldwin} 102265e5898SJohn BaldwinEND { 103265e5898SJohn Baldwin print "" 104265e5898SJohn Baldwin print "\treturn (str);" 105265e5898SJohn Baldwin print "}" 106265e5898SJohn Baldwin} 107265e5898SJohn Baldwin' 108