1175936Sdes#!/bin/sh
2175936Sdes#
3175936Sdes# $FreeBSD$
4258442Sjhb#
5258442Sjhb# When editing this script, keep in mind that truss also uses it.
6258442Sjhb#
7175936Sdes
840455Sbdeset -e
940455Sbde
10258442Sjhbif [ $# -ne 2 -o \( $1 != "print" -a $1 != "return" \) ]; then
11258442Sjhb	echo "usage: sh $0 print|return include-dir"
1254081Smarcel	exit 1
1354081Smarcelfi
1454081Smarcel
15258442Sjhbstyle="$1"
16258442Sjhbincludedir="$2"
17258442Sjhb
1875261SruLC_ALL=C; export LC_ALL
1975261Sru
2040455Sbde# Build a list of headers that have ioctls in them.
2116631Sbde# XXX should we use an ANSI cpp?
22258442Sjhbioctl_includes=$(
23258442Sjhb	cd $includedir
24258442Sjhb	find -H -s * -name '*.h' | grep -v '.*disk.*\.h' | \
2540455Sbde		xargs egrep -l \
2664099Sru'^#[ 	]*define[ 	]+[A-Za-z_][A-Za-z0-9_]*[ 	]+_IO[^a-z0-9_]' |
27258442Sjhb		awk '{printf("#include <%s>\\n", $1)}'
28258442Sjhb)
2940455Sbde
30258442Sjhb: ${MACHINE=$(uname -m)}
31258442Sjhbcase "${MACHINE}" in
32258442Sjhb*pc98*)
33258442Sjhb	ioctl_includes="$ioctl_includes#include <sys/diskpc98.h>\\n"
34258442Sjhb	;;
35258442Sjhb*)
36258442Sjhb	ioctl_includes="$ioctl_includes#include <sys/diskmbr.h>\\n"
37258442Sjhb	;;
38258442Sjhbesac
39258442Sjhb
4085796Sobrienawk -v x="$ioctl_includes" 'BEGIN {print x}' |
41234444Sdim	$CPP -I$1 -dM -DCOMPAT_43TTY - |
42258442Sjhb	awk -v ioctl_includes="$ioctl_includes" -v style="$style" '
431590SrgrimesBEGIN {
4440455Sbde	print "/* XXX obnoxious prerequisites. */"
4540455Sbde	print "#define COMPAT_43"
46191936Sed	print "#define COMPAT_43TTY"
471590Srgrimes	print "#include <sys/param.h>"
4840455Sbde	print "#include <sys/devicestat.h>"
4940455Sbde	print "#include <sys/disklabel.h>"
501590Srgrimes	print "#include <sys/socket.h>"
5120287Swollman	print "#include <sys/time.h>"
5240455Sbde	print "#include <sys/tty.h>"
53159247Srwatson	print "#include <bsm/audit.h>"
5464121Sru	print "#include <net/ethernet.h>"
5540455Sbde	print "#include <net/if.h>"
5640455Sbde	print "#include <net/if_var.h>"
57130617Smlaier	print "#include <net/pfvar.h>"
581590Srgrimes	print "#include <net/route.h>"
5916631Sbde	print "#include <netinet/in.h>"
6052130Speter	print "#include <netinet/ip_mroute.h>"
6162585Sitojun	print "#include <netinet6/in6_var.h>"
6262585Sitojun	print "#include <netinet6/nd6.h>"
6362585Sitojun	print "#include <netinet6/ip6_mroute.h>"
6474840Sken	print "#include <stdio.h>"
6540455Sbde	print "#include <cam/cam.h>"
66246437Smav	print "#include <stddef.h>"
67246437Smav	print "#include <stdint.h>"
681590Srgrimes	print ""
6940455Sbde	print ioctl_includes
7040455Sbde	print ""
71258442Sjhb	if (style == "print") {
72258442Sjhb		print "void ioctlname(unsigned long val, int decimal);"
73258442Sjhb		print ""
74258442Sjhb		print "void"
75258442Sjhb		print "ioctlname(unsigned long val, int decimal)"
76258442Sjhb	} else {
77258442Sjhb		print "const char *ioctlname(unsigned long val);"
78258442Sjhb		print ""
79258442Sjhb		print "const char *"
80258442Sjhb		print "ioctlname(unsigned long val)"
81258442Sjhb	}
821590Srgrimes	print "{"
83258442Sjhb	print "\tconst char *str = NULL;"
841590Srgrimes	print ""
851590Srgrimes}
861590Srgrimes
8740455Sbde/^#[ 	]*define[ 	]+[A-Za-z_][A-Za-z0-9_]*[ 	]+_IO/ {
88175936Sdes
891590Srgrimes	# find where the name starts
901590Srgrimes	for (i = 1; i <= NF; i++)
911590Srgrimes		if ($i ~ /define/)
921590Srgrimes			break;
931590Srgrimes	++i;
94175936Sdes	#
95258442Sjhb	printf("\t");
96258442Sjhb	if (n++ > 0)
97258442Sjhb		printf("else ");
98258442Sjhb	printf("if (val == %s)\n", $i);
99258442Sjhb	printf("\t\tstr = \"%s\";\n", $i);
1001590Srgrimes}
1011590SrgrimesEND {
102258442Sjhb	print ""
103258442Sjhb	if (style == "print") {
104258442Sjhb		print "\tif (str != NULL)"
105258442Sjhb		print "\t\tprintf(\"%s\", str);"
106258442Sjhb		print "\telse if (decimal)"
107258442Sjhb		print "\t\tprintf(\"%lu\", val);"
108258442Sjhb		print "\telse"
109258442Sjhb		print "\t\tprintf(\"%#lx\", val);"
110258442Sjhb	} else {
111258442Sjhb		print "\treturn (str);"
112258442Sjhb	}
1131590Srgrimes	print "}"
1141590Srgrimes}
11516631Sbde'
116