Home | History | Annotate | Download | only in tools
      1 #!/usr/bin/env python
      2 #
      3 
      4 import sys, os, string, re
      5 
      6 def usage():
      7     print """\
      8   usage:  genserv < /etc/services > libc/netbsd/net/services.h
      9 
     10   this program is used to generate the hard-coded internet service list for the
     11   Bionic C library.
     12 """
     13 
     14 re_service = re.compile(r"([\d\w\-_]+)\s+(\d+)/(tcp|udp)(.*)")
     15 re_alias   = re.compile(r"([\d\w\-_]+)(.*)")
     16 
     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 = []
     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 
     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]
     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 
     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
     75