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