-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathsyscallinfo.py
86 lines (57 loc) · 2.05 KB
/
syscallinfo.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/env python
import collections
import os
class SyscallTable:
def __init__(self, filename):
self.source = filename
self.entries = collections.OrderedDict()
self.parse_table(filename)
def get_entry_dict(self, parts, identifiers):
entry = collections.OrderedDict()
for i in range(len(parts)):
if identifiers[i] == "Definition":
parts[i] = parts[i].split(":")[0]
entry[identifiers[i]] = parts[i]
return entry
def parse_table(self, filename):
lines = []
with open(filename) as f:
lines = f.readlines()
# retrieve identifiers from first line
identifiers = lines[0].strip().split("\t")
for line in lines[1:]:
parts = line.split("\t")
self.entries[parts[1]] = self.get_entry_dict(
line.split("\t"), identifiers)
def get_entry_by_id(self, idx):
for entry in self.entries:
if self.entries[entry]["#"] == str(idx):
return self.entries[entry]
return None
def get_entry_by_name(self, name):
return self.entries.get(name)
def get_info_message(self, entry):
if entry:
msg = ""
for part in entry:
msg += "{0:15} : {1}\n".format(part, entry[part])
return msg
return None
def get_info_message_by_id(self, idx):
entry = self.get_entry_by_id(idx)
return self.get_info_message(entry)
def get_info_message_by_name(self, name):
entry = self.get_entry_by_name(name)
return self.get_info_message(entry)
class SyscallInfo:
def __init__(self, basedir):
self.tables = {}
for table in os.listdir(basedir):
filename = os.path.join(basedir, table)
self.tables[table] = SyscallTable(filename)
def get_available_architectures(self):
return self.tables.keys()
def get_arch(self, arch):
if arch in self.tables:
return self.tables[arch]
return None