1 #!/usr/bin/env python
2 #
4 import sys, os, string, re
6 def usage():
7 print """\
8 usage: genserv < /etc/services > netbsd/net/services.h
10 this program is used to generate the hard-coded internet service list for the
11 Bionic C library.
12 """
14 re_service = re.compile(r"([\d\w\-_]+)\s+(\d+)/(tcp|udp)(.*)")
15 re_alias = re.compile(r"([\d\w\-_]+)(.*)")
17 class Service:
18 def __init__(self,name,port,proto):
19 self.name = name
20 self.port = port
21 self.proto = proto
22 self.aliases = []
24 def add_alias(self,alias):
25 self.aliases.append(alias)
27 def __str__(self):
28 result = "\\%0o%s" % (len(self.name),self.name)
29 result += "\\%0o\\%0o" % (((self.port >> 8) & 255), self.port & 255)
30 if self.proto == "tcp":
31 result += "t"
32 else:
33 result += "u"
35 result += "\\%0o" % len(self.aliases)
36 for alias in self.aliases:
37 result += "\\%0o%s" % (len(alias), alias)
39 return result
41 def parse(f):
42 result = [] # list of Service objects
43 for line in f.xreadlines():
44 if len(line) > 0 and line[-1] == "\n":
45 line = line[:-1]
46 if len(line) > 0 and line[-1] == "\r":
47 line = line[:-1]
49 line = string.strip(line)
50 if len(line) == 0 or line[0] == "#":
51 continue
53 m = re_service.match(line)
54 if m:
55 service = Service( m.group(1), int(m.group(2)), m.group(3) )
56 rest = string.strip(m.group(4))
58 while 1:
59 m = re_alias.match(rest)
60 if not m:
61 break
62 service.add_alias(m.group(1))
63 rest = string.strip(m.group(2))
65 result.append(service)
67 return result
69 services = parse(sys.stdin)
70 line = '/* generated by genserv.py - do not edit */\nstatic const char _services[] = "\\\n'
71 for s in services:
72 line += str(s)+"\\\n"
73 line += '\\0";\n'
74 print line