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 sor
1.2 KiB
Python
Executable File
56 sor
1.2 KiB
Python
Executable File
#!/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)
|
|
|