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