Gitweb:
http://git.exim.org/exim.git/commitdiff/f9d04f08f7ca18e099843180edea967dd831df91
Commit: f9d04f08f7ca18e099843180edea967dd831df91
Parent: 83712b3900eb045eb14df258fd092ad54314e990
Author: Jeremy Harris <jgh146exb@???>
AuthorDate: Sun May 12 22:31:36 2013 +0100
Committer: Jeremy Harris <jgh146exb@???>
CommitDate: Sun May 12 22:34:48 2013 +0100
Add compile-time checks for various tables being in alphabetical order.
This is gross hackery and somewhat fragile. A better method would
actuallyt compile the 'C' involved and check programmatically.
---
src/Makefile | 5 +++-
src/scripts/source_checks | 50 +++++++++++++++++++++++++++++++++++++++++++++
src/src/acl.c | 9 ++++++-
3 files changed, 61 insertions(+), 3 deletions(-)
diff --git a/src/Makefile b/src/Makefile
index a18c3d7..ec573b5 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -45,12 +45,15 @@ build-directory:
$(SHELL) -c "test -d $$builddir -a -r $$builddir/version.c || \
(mkdir $$builddir; cd $$builddir; $(SHELL) ../scripts/MakeLinks)";
+checks:
+ $(SHELL) scripts/source_checks
+
# The "configure" target ensures that the build directory exists, then arranges
# to build the main makefile from inside the build directory, by calling the
# Configure-Makefile script. This does its own dependency checking because of
# the optional files.
-configure: build-directory
+configure: checks build-directory
@cd build-$(buildname); \
build=$(build) $(SHELL) ../scripts/Configure-Makefile
diff --git a/src/scripts/source_checks b/src/scripts/source_checks
new file mode 100644
index 0000000..79f9c35
--- /dev/null
+++ b/src/scripts/source_checks
@@ -0,0 +1,50 @@
+#!/bin/sh
+
+cd src;
+
+# Tables with struct items
+while read file table
+do
+ : $file $table
+ < $file \
+ perl -e '$/= undef; while (<>) { print $1 if /(?<='$table'\[\])\s*=\s*{\n(([^}].*\n)+)/m }' \
+ | awk '/{ (US)?"/ {print $2}' \
+ | awk -F\" '{print $2}' \
+ | LANG=C sort -c \
+ || exit 1
+done <<-END
+ readconf.c optionlist_config
+ globals.c optionlist_auths
+ globals.c debug_options
+ globals.c header_names
+ globals.c log_options
+ expand.c item_table
+ transport.c optionlist_transports
+ route.c optionlist_routers
+ transports/appendfile.c appendfile_transport_options
+ transports/autoreply.c autoreply_transport_options
+ transports/lmtp.c lmtp_transport_options
+ transports/pipe.c pipe_transport_options
+ transports/smtp.c smtp_transport_options
+ expand.c var_table
+END
+
+# Tables with just string items
+while read file table
+do
+ : $file $table
+ < $file \
+ perl -e '$/= undef; while (<>) { print $1 if /(?<='$table'\[\])\s*=\s*{\s?(([^}]*)+)}/m }' \
+ | awk -F\" '/"/ {print $2}' \
+ | LANG=C sort -c \
+ || exit 1
+
+done <<-END
+ expand.c item_table
+ expand.c op_table_underscore
+ expand.c op_table_main
+ expand.c cond_table
+ acl.c verbs
+ acl.c conditions
+END
+
diff --git a/src/src/acl.c b/src/src/acl.c
index 1d5e059..4f64e0a 100644
--- a/src/src/acl.c
+++ b/src/src/acl.c
@@ -21,8 +21,13 @@ enum { ACL_ACCEPT, ACL_DEFER, ACL_DENY, ACL_DISCARD, ACL_DROP, ACL_REQUIRE,
/* ACL verbs */
-static uschar *verbs[] =
- { US"accept", US"defer", US"deny", US"discard", US"drop", US"require",
+static uschar *verbs[] = {
+ US"accept",
+ US"defer",
+ US"deny",
+ US"discard",
+ US"drop",
+ US"require",
US"warn" };
/* For each verb, the conditions for which "message" or "log_message" are used