summaryrefslogtreecommitdiffstats
path: root/usr.bin/kdump
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2011-10-21 11:08:25 +0000
committerdes <des@FreeBSD.org>2011-10-21 11:08:25 +0000
commit6c6abb3ddc0d7b2572a91949e5eaf448f0a392af (patch)
tree762720b203c8a69ddb88af3b29c52f2a2c9d5302 /usr.bin/kdump
parent28e8dea25892d12660b01d59590e5a8e70ae3880 (diff)
downloadFreeBSD-src-6c6abb3ddc0d7b2572a91949e5eaf448f0a392af.zip
FreeBSD-src-6c6abb3ddc0d7b2572a91949e5eaf448f0a392af.tar.gz
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>
Diffstat (limited to 'usr.bin/kdump')
-rw-r--r--usr.bin/kdump/Makefile2
-rw-r--r--usr.bin/kdump/mkioctls51
2 files changed, 35 insertions, 18 deletions
diff --git a/usr.bin/kdump/Makefile b/usr.bin/kdump/Makefile
index 0af84cc..afa94bb 100644
--- a/usr.bin/kdump/Makefile
+++ b/usr.bin/kdump/Makefile
@@ -22,7 +22,7 @@ CLEANFILES= ioctl.c kdump_subr.c kdump_subr.h linux_syscalls.c
ioctl.c: mkioctls
env MACHINE=${MACHINE} \
- sh ${.CURDIR}/mkioctls ${DESTDIR}/usr/include > ${.TARGET}
+ sh ${.CURDIR}/mkioctls print ${DESTDIR}/usr/include > ${.TARGET}
kdump_subr.h: mksubr
sh ${.CURDIR}/mksubr ${DESTDIR}/usr/include | \
diff --git a/usr.bin/kdump/mkioctls b/usr.bin/kdump/mkioctls
index 7ef2865..22ca268 100644
--- a/usr.bin/kdump/mkioctls
+++ b/usr.bin/kdump/mkioctls
@@ -1,20 +1,26 @@
#!/bin/sh
#
# $FreeBSD$
+#
+# When editing this script, keep in mind that truss also uses it.
+#
set -e
-if [ -z "$1" ]; then
- echo "usage: sh $0 include-dir"
+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 $1
+ 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_]' |
@@ -33,7 +39,7 @@ esac
awk -v x="$ioctl_includes" 'BEGIN {print x}' |
gcc -E -I$1 -dM -DCOMPAT_43TTY - |
- awk -v ioctl_includes="$ioctl_includes" '
+ awk -v ioctl_includes="$ioctl_includes" -v style="$style" '
BEGIN {
print "/* XXX obnoxious prerequisites. */"
print "#define COMPAT_43"
@@ -58,12 +64,19 @@ BEGIN {
print "#include <stdio.h>"
print "#include <cam/cam.h>"
print ""
- print "void ioctlname(unsigned long val, int decimal);"
- print ""
print ioctl_includes
print ""
- print "void"
- print "ioctlname(unsigned long val, int decimal)"
+ 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 ""
@@ -77,20 +90,24 @@ BEGIN {
break;
++i;
#
- print("\t");
+ printf("\t");
if (n++ > 0)
- print("else ");
+ printf("else ");
printf("if (val == %s)\n", $i);
printf("\t\tstr = \"%s\";\n", $i);
}
END {
- print "\n"
- print "\tif (str != NULL)\n"
- print "\t\tprintf(\"%s\", str);\n"
- print "\telse if (decimal)\n"
- print "\t\tprintf(\"%lu\", val);\n"
- print "\telse\n"
- print "\t\tprintf(\"%#lx\", val);\n"
+ 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 "}"
}
'
OpenPOWER on IntegriCloud