freebsd-nq/usr.bin/kdump/mkioctls
Dag-Erling Smørgrav c04743dac1 It turns out that truss also used kdump's mkioctls script, and expected
ioctlname() to return a pointer to the name rather than print it.  This did
not show up in testing because truss had its own prototype for ioctlname(),
so it would build fine and run fine as long as the program being traced did
not issue an ioctl.

Teach mkioctls to generate different versions of ioctlname() based on its
first command-line argument.

Pointed out by:	Garrett Cooper <yanegomi@gmail.com>
2011-10-21 11:08:25 +00:00

114 lines
2.5 KiB
Bash

#!/bin/sh
#
# $FreeBSD$
#
# When editing this script, keep in mind that truss also uses it.
#
set -e
if [ $# -ne 2 -o \( $1 != "print" -a $1 != "return" \) ]; then
echo "usage: sh $0 print|return include-dir"
exit 1
fi
style="$1"
includedir="$2"
LC_ALL=C; export LC_ALL
# Build a list of headers that have ioctls in them.
# XXX should we use an ANSI cpp?
ioctl_includes=$(
cd $includedir
find -H -s * -name '*.h' | grep -v '.*disk.*\.h' | \
xargs egrep -l \
'^#[ ]*define[ ]+[A-Za-z_][A-Za-z0-9_]*[ ]+_IO[^a-z0-9_]' |
awk '{printf("#include <%s>\\n", $1)}'
)
: ${MACHINE=$(uname -m)}
case "${MACHINE}" in
*pc98*)
ioctl_includes="$ioctl_includes#include <sys/diskpc98.h>\\n"
;;
*)
ioctl_includes="$ioctl_includes#include <sys/diskmbr.h>\\n"
;;
esac
awk -v x="$ioctl_includes" 'BEGIN {print x}' |
gcc -E -I$1 -dM -DCOMPAT_43TTY - |
awk -v ioctl_includes="$ioctl_includes" -v style="$style" '
BEGIN {
print "/* XXX obnoxious prerequisites. */"
print "#define COMPAT_43"
print "#define COMPAT_43TTY"
print "#include <sys/param.h>"
print "#include <sys/devicestat.h>"
print "#include <sys/disklabel.h>"
print "#include <sys/socket.h>"
print "#include <sys/time.h>"
print "#include <sys/tty.h>"
print "#include <bsm/audit.h>"
print "#include <net/ethernet.h>"
print "#include <net/if.h>"
print "#include <net/if_var.h>"
print "#include <net/pfvar.h>"
print "#include <net/route.h>"
print "#include <netinet/in.h>"
print "#include <netinet/ip_mroute.h>"
print "#include <netinet6/in6_var.h>"
print "#include <netinet6/nd6.h>"
print "#include <netinet6/ip6_mroute.h>"
print "#include <stdio.h>"
print "#include <cam/cam.h>"
print ""
print ioctl_includes
print ""
if (style == "print") {
print "void ioctlname(unsigned long val, int decimal);"
print ""
print "void"
print "ioctlname(unsigned long val, int decimal)"
} else {
print "const char *ioctlname(unsigned long val);"
print ""
print "const char *"
print "ioctlname(unsigned long val)"
}
print "{"
print "\tconst char *str = NULL;"
print ""
}
/^#[ ]*define[ ]+[A-Za-z_][A-Za-z0-9_]*[ ]+_IO/ {
# find where the name starts
for (i = 1; i <= NF; i++)
if ($i ~ /define/)
break;
++i;
#
printf("\t");
if (n++ > 0)
printf("else ");
printf("if (val == %s)\n", $i);
printf("\t\tstr = \"%s\";\n", $i);
}
END {
print ""
if (style == "print") {
print "\tif (str != NULL)"
print "\t\tprintf(\"%s\", str);"
print "\telse if (decimal)"
print "\t\tprintf(\"%lu\", val);"
print "\telse"
print "\t\tprintf(\"%#lx\", val);"
} else {
print "\treturn (str);"
}
print "}"
}
'