mkioctls revision 195751
113546Sjulian#!/bin/sh
213546Sjulian#
313546Sjulian# $FreeBSD: head/usr.bin/kdump/mkioctls 195751 2009-07-18 10:36:18Z bz $
413546Sjulian
513546Sjulianset -e
613546Sjulian
713546Sjulianif [ "x$1" = "x-s" ]; then
813546Sjulian	use_switch=1
913546Sjulian	shift
1013546Sjulianelse
1113546Sjulian	use_switch=0
1213546Sjulianfi
13165967Simp
1413546Sjulianif [ -z "$1" ]; then
1513546Sjulian	echo "usage: sh $0 [-s] include-dir"
1613546Sjulian	exit 1
1713546Sjulianfi
1813546Sjulian
1913546SjulianLC_ALL=C; export LC_ALL
2044963Sjb
2113546Sjulian# Build a list of headers that have ioctls in them.
2213546Sjulian# XXX should we use an ANSI cpp?
2313546Sjulianioctl_includes=`
2413546Sjulian	cd $1
2513546Sjulian	find -H -s * -name '*.h' |
2613546Sjulian		xargs egrep -l \
2713546Sjulian'^#[ 	]*define[ 	]+[A-Za-z_][A-Za-z0-9_]*[ 	]+_IO[^a-z0-9_]' |
2813546Sjulian		awk '{printf("#include <%s>\\\\n", $1)}'
2950476Speter`
3013546Sjulian
31174112Sdeischenawk -v x="$ioctl_includes" 'BEGIN {print x}' |
32174112Sdeischen	gcc -E -I$1 -dM -DCOMPAT_43TTY - |
3313546Sjulian	awk -v ioctl_includes="$ioctl_includes" -v use_switch="$use_switch" '
3413546SjulianBEGIN {
3536830Sjb	print "/* XXX obnoxious prerequisites. */"
3613546Sjulian	print "#define COMPAT_43"
37174112Sdeischen	print "#define COMPAT_43TTY"
38103388Smini	print "#include <sys/param.h>"
3913546Sjulian	print "#include <sys/devicestat.h>"
40113658Sdeischen	print "#include <sys/disklabel.h>"
41113658Sdeischen	print "#include <sys/socket.h>"
42113658Sdeischen	print "#include <sys/time.h>"
43113658Sdeischen	print "#include <sys/tty.h>"
4444963Sjb	print "#include <bsm/audit.h>"
4544963Sjb	print "#include <net/ethernet.h>"
4644963Sjb	print "#include <net/if.h>"
47113658Sdeischen	print "#include <net/if_var.h>"
48113658Sdeischen	print "#include <net/pfvar.h>"
49113658Sdeischen	print "#include <net/route.h>"
50139023Sdeischen	print "#include <netinet/in.h>"
51139023Sdeischen	print "#include <netinet/ip_mroute.h>"
52139023Sdeischen	print "#include <netinet6/in6_var.h>"
5344963Sjb	print "#include <netinet6/nd6.h>"
54174112Sdeischen	print "#include <netinet6/ip6_mroute.h>"
55174112Sdeischen	print "#include <stdio.h>"
56174112Sdeischen	print "#include <cam/cam.h>"
57174112Sdeischen	print ""
58115173Sdeischen	print "const char *ioctlname(u_long val);"
59115173Sdeischen	print ""
60115173Sdeischen	print ioctl_includes
61115173Sdeischen	print ""
62115173Sdeischen	print "const char *"
63115173Sdeischen	print "ioctlname(u_long val)"
64115173Sdeischen	print "{"
65115173Sdeischen	print ""
6675369Sdeischen	if (use_switch)
6775369Sdeischen		print "\tswitch(val) {"
6875369Sdeischen}
6975369Sdeischen
7071581Sdeischen/^#[ 	]*define[ 	]+[A-Za-z_][A-Za-z0-9_]*[ 	]+_IO/ {
7171581Sdeischen
7248046Sjb	# find where the name starts
7371581Sdeischen	for (i = 1; i <= NF; i++)
7413546Sjulian		if ($i ~ /define/)
7513546Sjulian			break;
7617706Sjulian	++i;
77113658Sdeischen	#
7813546Sjulian	if (use_switch)
7913546Sjulian		printf("\tcase %s:\n\t\treturn(\"%s\");\n", $i, $i);
8035509Sjb	else
8131402Salex		printf("\tif (val ==  %s)\n\t\treturn(\"%s\");\n", $i, $i);
8235509Sjb
8317706Sjulian}
8424827SjbEND {
8524827Sjb	if (use_switch)
8617706Sjulian		print "\t}"
8717706Sjulian	print "\n\treturn(NULL);"
8817706Sjulian	print "}"
8917706Sjulian}
90113658Sdeischen'
9117706Sjulian