|  | #!/usr/bin/env python3 | 
|  | # | 
|  |  | 
|  | import sys, os, string, re | 
|  |  | 
|  | def usage(): | 
|  | print """\ | 
|  | usage:  genserv < /etc/services > libc/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 |