Merge "Filter out redundant ioctl entries early"
diff --git a/Makefile.am b/Makefile.am
index 703f4da..fa6e73e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -127,7 +127,6 @@
 	linux/ia64/syscallent.h		\
 	linux/inet_diag.h		\
 	linux/inotify.h			\
-	linux/ioctlent-filter.awk	\
 	linux/ioctlent.h.in		\
 	linux/ioctlent.sh		\
 	linux/ioctlsort.c		\
@@ -316,5 +315,4 @@
 	$(MKDIR_P) $(builddir)/$(OS)
 	cat $(ioctlent_h_deps) | \
 		$(COMPILE) -E -P - | \
-		LC_ALL=C sort -u -k3,3 -k2,2 | \
-		awk -f $(srcdir)/linux/ioctlent-filter.awk > $@
+		LC_ALL=C sort -u -k3,3 -k2,2 > $@
diff --git a/linux/ioctlent-filter.awk b/linux/ioctlent-filter.awk
deleted file mode 100644
index 181c4bf..0000000
--- a/linux/ioctlent-filter.awk
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/awk -f
-# Filter out redundant "*32" symbols.
-
-BEGIN {
-	s=""
-	c=""
-}
-
-NF == 3 && $2 ~ /^"[^",]*",$/ {
-	if ($2 == s && $3 == c)
-		next
-	s = $2
-	sub(/",$/, "32\",", s)
-	c = $3
-}
-
-{
-	print
-}
diff --git a/linux/ioctlsort.c b/linux/ioctlsort.c
index dab30f1..393b534 100644
--- a/linux/ioctlsort.c
+++ b/linux/ioctlsort.c
@@ -30,6 +30,14 @@
 	return (code1 > code2) ? 1 : (code1 < code2) ? -1 : strcmp(name1, name2);
 }
 
+static int is_not_prefix(const char *s1, const char *s2) {
+	size_t len = strlen(s1);
+
+	if (len > strlen(s2))
+		return 1;
+	return memcmp(s1, s2, len);
+}
+
 int main(int argc, char** argv) {
 	int i;
 
@@ -41,8 +49,8 @@
 	qsort(ioctls, nioctls, sizeof(ioctls[0]), compare);
 	puts("\t/* Generated by ioctlsort */");
 	for (i = 0; i < nioctls; i++)
-		if (i == 0 || ioctls[i].code != ioctls[i-1].code ||
-		    strcmp(ioctls[i].name, ioctls[i-1].name))
+		if (i == 0 || ioctls[i-1].code != ioctls[i].code ||
+		    is_not_prefix(ioctls[i-1].name, ioctls[i].name))
 			printf("\t{\"%s\",\t\"%s\",\t%#06lx},\n",
 				ioctls[i].header, ioctls[i].name, ioctls[i].code);