Albert S
1b4c5477a5
qssb.h was a preliminary name and can't be pronounced smoothly. exile.h is more fitting and it's also short. Something exiled is essentially something isolated, which is pretty much what this library does (isolation from resources such as file system, network and others accessible by system calls).
56 řádky
1.2 KiB
Python
Spustitelný soubor
56 řádky
1.2 KiB
Python
Spustitelný soubor
#!/usr/bin/python
|
|
import sys
|
|
import re
|
|
if len(sys.argv) < 2:
|
|
print("Usage: gengroup groupfile")
|
|
sys.exit(1)
|
|
fd = open(sys.argv[1], "r")
|
|
|
|
lines = fd.read().splitlines()
|
|
|
|
groupnames = set()
|
|
ifndef = dict()
|
|
|
|
def print_ifndefs():
|
|
for name in ifndef:
|
|
print("#ifndef __NR_%s" % name)
|
|
print("#define __NR_%s %s" % (name, ifndef[name]))
|
|
print("#endif")
|
|
|
|
def print_defines(names):
|
|
names = sorted(names)
|
|
i = 0
|
|
for name in names:
|
|
define = "#define %s ((uint64_t)1<<%s)" % (name, i)
|
|
print(define)
|
|
i = i + 1
|
|
|
|
for line in lines:
|
|
if line[0] == '#':
|
|
continue
|
|
|
|
splitted = line.split(' ')
|
|
if len(splitted) < 2:
|
|
print("Misformated line:", line)
|
|
sys.exit(1)
|
|
|
|
currentsyscall = splitted[0]
|
|
currentgroups = splitted[1].split(',')
|
|
|
|
flags = splitted[2] if len(splitted) > 2 else ""
|
|
if any( not s or s.isspace() for s in currentgroups ):
|
|
print("Misformated line (empty values):", line)
|
|
sys.exit(1)
|
|
groupnames.update(currentgroups)
|
|
|
|
genifndef = re.match(r"genifndef\((\d+)*\)", flags)
|
|
if genifndef:
|
|
ifndef[currentsyscall] = genifndef.groups(1)[0]
|
|
|
|
array_line = "{EXILE_SYS(%s), %s}," % (currentsyscall, '|'.join(currentgroups))
|
|
print(array_line)
|
|
|
|
print_ifndefs()
|
|
print_defines(groupnames)
|
|
|