mirror of https://github.com/OISF/suricata
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.1 KiB
Python
122 lines
3.1 KiB
Python
#!/usr/bin/env python
|
|
import re
|
|
import sys
|
|
import os
|
|
from string import Template
|
|
|
|
if len(sys.argv) == 2:
|
|
SRC_DIR = sys.argv[1]
|
|
else:
|
|
SRC_DIR = "../../src/"
|
|
|
|
|
|
class Structure:
|
|
def __init__(self, string):
|
|
(self.struct, self.flags, self.values) = string.split(":")
|
|
|
|
class SetterGetter:
|
|
def __init__(self, string):
|
|
(function, params, self.value) = string.split(":")
|
|
self.function = function.strip("()")
|
|
self.params = [int(a) for a in params.split(",")]
|
|
|
|
|
|
cmd = "grep -h coccinelle ../../src/*[ch] | sed -e 's/.*coccinelle: \(.*\) \*\//\1/'"
|
|
|
|
struct_list = []
|
|
setter_getter_list = []
|
|
|
|
dirList = os.listdir(SRC_DIR)
|
|
for fname in dirList:
|
|
if re.search("\.[ch]$", fname):
|
|
for line in open(os.path.join(SRC_DIR, fname)):
|
|
if "coccinelle:" in line:
|
|
m = re.search("coccinelle: (.*) \*\/", line)
|
|
if "()" not in m.group(1):
|
|
struct = Structure(m.group(1))
|
|
struct_list.append(struct)
|
|
else:
|
|
function = SetterGetter(m.group(1))
|
|
setter_getter_list.append(function)
|
|
|
|
header = "@flags@"
|
|
body = []
|
|
|
|
# Handle setter and getter
|
|
setter_getter = [x.function for x in setter_getter_list]
|
|
if len(setter_getter):
|
|
header += "\nidentifier NotSetterGetter !~ \"^(%s)$\";" % ("|".join(setter_getter))
|
|
|
|
i = 0
|
|
for struct in struct_list:
|
|
header += """
|
|
%s *struct%d;
|
|
identifier struct_flags%d =~ "^(?!%s).+";""" % (struct.struct, i, i, struct.values)
|
|
|
|
body.append("""
|
|
struct%d->%s@p1 |= struct_flags%d
|
|
|
|
|
struct%d->%s@p1 & struct_flags%d
|
|
|
|
|
struct%d->%s@p1 &= ~struct_flags%d
|
|
""" % (i, struct.flags, i, i, struct.flags, i, i, struct.flags, i))
|
|
|
|
i += 1
|
|
|
|
print(header)
|
|
print("position p1;")
|
|
print("@@")
|
|
print("")
|
|
print("""
|
|
NotSetterGetter(...)
|
|
{
|
|
<...
|
|
""")
|
|
print("")
|
|
print("(" + "|".join(body) + ")")
|
|
print("")
|
|
print("""
|
|
...>
|
|
}
|
|
|
|
@script:python@
|
|
p1 << flags.p1;
|
|
@@
|
|
|
|
print "Invalid usage of flags field at %s:%s, flags value is incorrect (wrong family)." % (p1[0].file, p1[0].line)
|
|
import sys
|
|
sys.exit(1)""")
|
|
|
|
i = 1
|
|
setter_template = """
|
|
@settergetter${i}@
|
|
identifier SetterGetter =~ "${function}";
|
|
identifier f_flags =~ "^(?!${value}).+";
|
|
identifier ${params_line};
|
|
position p1;
|
|
@@
|
|
|
|
SetterGetter@p1(${prefix_param}f_flags${suffix_param})
|
|
|
|
@script:python@
|
|
p1 << settergetter${i}.p1;
|
|
@@
|
|
print "Invalid usage of ${function} at %s:%s, flags value is incorrect (wrong family)." % (p1[0].file, p1[0].line)
|
|
import sys
|
|
sys.exit(1)
|
|
"""
|
|
|
|
for sg in setter_getter_list:
|
|
prefix_param = ""
|
|
for index in list(range(1, sg.params[1])):
|
|
prefix_param += "param%d, " % (index)
|
|
if sg.params[1] < sg.params[0]:
|
|
suffix_param = ", " + ", ".join(["param%d" % (index + 1) for index in list(range(sg.params[1], sg.params[0]))])
|
|
else:
|
|
suffix_param = ""
|
|
params_elts = list(range(1, sg.params[1])) + list(range(sg.params[1] + 1, sg.params[0] + 1))
|
|
params_line = ", ".join(["param%d" % (x) for x in params_elts])
|
|
print(Template(setter_template).substitute(i=i, function=sg.function, value=sg.value,
|
|
prefix_param=prefix_param, suffix_param=suffix_param, params_line=params_line))
|
|
i += 1
|