mkioctls revision 191936
1175936Sdes#!/bin/sh
2175936Sdes#
3175936Sdes# $FreeBSD: head/usr.bin/kdump/mkioctls 191936 2009-05-09 15:09:40Z ed $
4175936Sdes
540455Sbdeset -e
640455Sbde
754081Smarcelif [ "x$1" = "x-s" ]; then
854081Smarcel	use_switch=1
954081Smarcel	shift
1054081Smarcelelse
1154081Smarcel	use_switch=0
1254081Smarcelfi
1354081Smarcel
1454081Smarcelif [ -z "$1" ]; then
1554081Smarcel	echo "usage: sh $0 [-s] include-dir"
1654081Smarcel	exit 1
1754081Smarcelfi
1854081Smarcel
1975261SruLC_ALL=C; export LC_ALL
2075261Sru
21188978Sthompsa# include subdirs to exclude from the search
22188978Sthompsaexclude="^legacy/.*"
23188978Sthompsa
2440455Sbde# Build a list of headers that have ioctls in them.
2516631Sbde# XXX should we use an ANSI cpp?
2640455Sbdeioctl_includes=`
2754081Smarcel	cd $1
28188978Sthompsa	find -H -s * -name '*.h' \! -regex $exclude |
2940455Sbde		xargs egrep -l \
3064099Sru'^#[ 	]*define[ 	]+[A-Za-z_][A-Za-z0-9_]*[ 	]+_IO[^a-z0-9_]' |
3185796Sobrien		awk '{printf("#include <%s>\\\\n", $1)}'
3240455Sbde`
3340455Sbde
3485796Sobrienawk -v x="$ioctl_includes" 'BEGIN {print x}' |
3554081Smarcel	gcc -E -I$1 -dM - |
3685796Sobrien	awk -v ioctl_includes="$ioctl_includes" -v use_switch="$use_switch" '
371590SrgrimesBEGIN {
3840455Sbde	print "/* XXX obnoxious prerequisites. */"
3940455Sbde	print "#define COMPAT_43"
40191936Sed	print "#define COMPAT_43TTY"
411590Srgrimes	print "#include <sys/param.h>"
4240455Sbde	print "#include <sys/devicestat.h>"
4340455Sbde	print "#include <sys/disklabel.h>"
441590Srgrimes	print "#include <sys/socket.h>"
4520287Swollman	print "#include <sys/time.h>"
4640455Sbde	print "#include <sys/tty.h>"
47159247Srwatson	print "#include <bsm/audit.h>"
4864121Sru	print "#include <net/ethernet.h>"
4940455Sbde	print "#include <net/if.h>"
5040455Sbde	print "#include <net/if_var.h>"
51130617Smlaier	print "#include <net/pfvar.h>"
521590Srgrimes	print "#include <net/route.h>"
5316631Sbde	print "#include <netinet/in.h>"
5452130Speter	print "#include <netinet/ip_mroute.h>"
5562585Sitojun	print "#include <netinet6/in6_var.h>"
5662585Sitojun	print "#include <netinet6/nd6.h>"
5762585Sitojun	print "#include <netinet6/ip6_mroute.h>"
5874840Sken	print "#include <stdio.h>"
5940455Sbde	print "#include <cam/cam.h>"
601590Srgrimes	print ""
6198767Smarkm	print "const char *ioctlname(u_long val);"
6293522Sdwmalone	print ""
6340455Sbde	print ioctl_includes
6440455Sbde	print ""
6593522Sdwmalone	print "const char *"
6698767Smarkm	print "ioctlname(u_long val)"
671590Srgrimes	print "{"
681590Srgrimes	print ""
6954081Smarcel	if (use_switch)
7040455Sbde		print "\tswitch(val) {"
711590Srgrimes}
721590Srgrimes
7340455Sbde/^#[ 	]*define[ 	]+[A-Za-z_][A-Za-z0-9_]*[ 	]+_IO/ {
74175936Sdes
751590Srgrimes	# find where the name starts
761590Srgrimes	for (i = 1; i <= NF; i++)
771590Srgrimes		if ($i ~ /define/)
781590Srgrimes			break;
791590Srgrimes	++i;
80175936Sdes	#
8154081Smarcel	if (use_switch)
8240455Sbde		printf("\tcase %s:\n\t\treturn(\"%s\");\n", $i, $i);
8340455Sbde	else
8498767Smarkm		printf("\tif (val ==  %s)\n\t\treturn(\"%s\");\n", $i, $i);
851590Srgrimes
861590Srgrimes}
871590SrgrimesEND {
8854081Smarcel	if (use_switch)
8940455Sbde		print "\t}"
901590Srgrimes	print "\n\treturn(NULL);"
911590Srgrimes	print "}"
921590Srgrimes}
9316631Sbde'
94