aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorGilbert Ramirez <gram@alumni.rice.edu>2005-05-27 15:13:09 +0000
committerGilbert Ramirez <gram@alumni.rice.edu>2005-05-27 15:13:09 +0000
commitc2454f0260c3bd43d7bd74ce1bb426cd4c0f3b14 (patch)
treec29b61b757089accb477aa4e28052851548693e4 /tools
parent94d8512749b5db5c2c225f156399f2a5c11cf1e2 (diff)
Add a "-G fields3" report which prints the bitmask of the field, and avoids
printing the blurb twice, like fields2 does. Add a script, fsanity.py, to check sanity of FT definitions. Right now the only check is for bitmasks for integer-like fields. svn path=/trunk/; revision=14454
Diffstat (limited to 'tools')
-rwxr-xr-xtools/ftsanity.py97
1 files changed, 97 insertions, 0 deletions
diff --git a/tools/ftsanity.py b/tools/ftsanity.py
new file mode 100755
index 0000000000..4d872d82a7
--- /dev/null
+++ b/tools/ftsanity.py
@@ -0,0 +1,97 @@
+#!/usr/bin/env python
+"""
+Check the sanity of field definitions in Ethereal.
+"""
+import sys
+
+try:
+ from optparse import OptionParser
+except ImportError:
+ sys.exit("Need python 2.3.")
+
+try:
+ import commands
+except ImportError:
+ sys.exit("Need to run on Unix.")
+
+
+errors = 0
+
+class Proto:
+ """Data for a protocol."""
+ def __init__(self, line):
+ data = line.split("\t")
+ assert len(data) == 3
+ assert data[0] == "P"
+ self.name = data[1]
+ self.abbrev = data[2]
+
+class Field:
+ """Data for a field."""
+ def __init__(self, line):
+ data = line.split("\t")
+ assert len(data) == 8
+ assert data[0] == "F"
+ self.name = data[1]
+ self.abbrev = data[2]
+ self.ftype = data[3]
+ self.parent = data[4]
+ self.blurb = data[5]
+ self.base = data[6]
+ self.bitmask = int(data[7])
+
+
+
+def gather_data(tethereal):
+ """Calls tethereal and gathers data."""
+ cmd = "%s -G fields3" % (tethereal,)
+ (status, output) = commands.getstatusoutput(cmd)
+
+ if status != 0:
+ sys.exit("Failed: " + cmd)
+
+ lines = output.split("\n")
+ protos = [Proto(x) for x in lines if x[0] == "P"]
+ fields = [Field(x) for x in lines if x[0] == "F"]
+
+ return protos, fields
+
+
+def check_fields(fields):
+ """Looks for problems in field definitions."""
+ global errors
+ for field in fields:
+ if field.bitmask != 0:
+ if field.ftype.find("FT_UINT") != 0 and \
+ field.ftype.find("FT_INT") != 0 and \
+ field.ftype != "FT_BOOLEAN":
+ print "%s has a bitmask 0x%x but is type %s" % \
+ (field.abbrev, field.bitmask, field.ftype)
+ errors += 1
+
+def run(tethereal):
+ """Run the tests."""
+ global errors
+ protos, fields = gather_data(tethereal)
+
+ check_fields(fields)
+
+ if errors > 0:
+ sys.exit("%d errors found" % (errors,))
+ else:
+ print "Success."
+
+def main():
+ """Parse the command-line."""
+ usage = "%prog tethereal"
+ parser = OptionParser(usage=usage)
+
+ (options, args) = parser.parse_args()
+
+ if len(args) != 1:
+ parser.error("Need location of tethereal.")
+
+ run(args[0])
+
+if __name__ == "__main__":
+ main()