summaryrefslogtreecommitdiffstats
path: root/libc/tools/genserv.py
diff options
context:
space:
mode:
Diffstat (limited to 'libc/tools/genserv.py')
-rwxr-xr-xlibc/tools/genserv.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/libc/tools/genserv.py b/libc/tools/genserv.py
new file mode 100755
index 0000000..e37d28f
--- /dev/null
+++ b/libc/tools/genserv.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+#
+
+import sys, os, string, re
+
+def usage():
+ print """\
+ usage: genserv < /etc/services > netbsd/net/services.h
+
+ this program is used to generate the hard-coded internet service list for the
+ Bionic C library.
+"""
+
+re_service = re.compile(r"([\d\w\-_]+)\s+(\d+)/(tcp|udp)(.*)")
+re_alias = re.compile(r"([\d\w\-_]+)(.*)")
+
+class Service:
+ def __init__(self,name,port,proto):
+ self.name = name
+ self.port = port
+ self.proto = proto
+ self.aliases = []
+
+ def add_alias(self,alias):
+ self.aliases.append(alias)
+
+ def __str__(self):
+ result = "\\%0o%s" % (len(self.name),self.name)
+ result += "\\%0o\\%0o" % (((self.port >> 8) & 255), self.port & 255)
+ if self.proto == "tcp":
+ result += "t"
+ else:
+ result += "u"
+
+ result += "\\%0o" % len(self.aliases)
+ for alias in self.aliases:
+ result += "\\%0o%s" % (len(alias), alias)
+
+ return result
+
+def parse(f):
+ result = [] # list of Service objects
+ for line in f.xreadlines():
+ if len(line) > 0 and line[-1] == "\n":
+ line = line[:-1]
+ if len(line) > 0 and line[-1] == "\r":
+ line = line[:-1]
+
+ line = string.strip(line)
+ if len(line) == 0 or line[0] == "#":
+ continue
+
+ m = re_service.match(line)
+ if m:
+ service = Service( m.group(1), int(m.group(2)), m.group(3) )
+ rest = string.strip(m.group(4))
+
+ while 1:
+ m = re_alias.match(rest)
+ if not m:
+ break
+ service.add_alias(m.group(1))
+ rest = string.strip(m.group(2))
+
+ result.append(service)
+
+ return result
+
+services = parse(sys.stdin)
+line = '/* generated by genserv.py - do not edit */\nstatic const char _services[] = "\\\n'
+for s in services:
+ line += str(s)+"\\\n"
+line += '\\0";\n'
+print line
+
+