blob: 84a139d25104823df71da7feffb7c4433ca49c62 [file] [log] [blame]
The Android Open Source Project1dc9e472009-03-03 19:28:35 -08001#!/usr/bin/env python
2#
3
4import sys, os, string, re
5
6def usage():
7 print """\
Elliott Hughese6ddfc52013-03-25 14:09:52 -07008 usage: genserv < /etc/services > libc/netbsd/net/services.h
The Android Open Source Project1dc9e472009-03-03 19:28:35 -08009
10 this program is used to generate the hard-coded internet service list for the
11 Bionic C library.
12"""
13
14re_service = re.compile(r"([\d\w\-_]+)\s+(\d+)/(tcp|udp)(.*)")
15re_alias = re.compile(r"([\d\w\-_]+)(.*)")
16
17class Service:
18 def __init__(self,name,port,proto):
19 self.name = name
20 self.port = port
21 self.proto = proto
22 self.aliases = []
23
24 def add_alias(self,alias):
25 self.aliases.append(alias)
26
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"
34
35 result += "\\%0o" % len(self.aliases)
36 for alias in self.aliases:
37 result += "\\%0o%s" % (len(alias), alias)
38
39 return result
40
41def 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]
48
49 line = string.strip(line)
50 if len(line) == 0 or line[0] == "#":
51 continue
52
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))
57
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))
64
65 result.append(service)
66
67 return result
68
69services = parse(sys.stdin)
70line = '/* generated by genserv.py - do not edit */\nstatic const char _services[] = "\\\n'
71for s in services:
72 line += str(s)+"\\\n"
73line += '\\0";\n'
74print line