| #!/usr/bin/python3 |
| # Generate DNS RR type constants for resolv header files. |
| # Copyright (C) 2016-2018 Free Software Foundation, Inc. |
| # This file is part of the GNU C Library. |
| # |
| # The GNU C Library is free software; you can redistribute it and/or |
| # modify it under the terms of the GNU Lesser General Public |
| # License as published by the Free Software Foundation; either |
| # version 2.1 of the License, or (at your option) any later version. |
| # |
| # The GNU C Library is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| # Lesser General Public License for more details. |
| # |
| # You should have received a copy of the GNU Lesser General Public |
| # License along with the GNU C Library; if not, see |
| # <http://www.gnu.org/licenses/>. |
| |
| """Generate DNS RR type constants for resolv header files. |
| |
| resolv/arpa/nameser.h and resolv/arpa/nameser_compat.h contain lists |
| of RR type constants. This script downloads the current definitions |
| from the IANA DNS Parameters protocol registry and translates it into |
| the two different lists. |
| |
| Two lists are written to standard output. The first one contains enum |
| constants for resolv/arpa/nameser.h. The second one lists the |
| preprocessor macros for resolv/arpa/nameser_compat.h. |
| |
| """ |
| |
| # URL of the IANA registry. |
| source = "http://www.iana.org/assignments/dns-parameters/dns-parameters-4.csv" |
| |
| import collections |
| import csv |
| import io |
| import urllib.request |
| |
| Type = collections.namedtuple("Type", "name number comment") |
| |
| def get_types(source): |
| for row in csv.reader(io.TextIOWrapper(urllib.request.urlopen(source))): |
| if row[0] in ('TYPE', 'Unassigned', 'Private use', 'Reserved'): |
| continue |
| name, number, comment = row[:3] |
| if name == '*': |
| name = 'ANY' |
| comment = 'request for all cached records' |
| number = int(number) |
| yield Type(name, number, comment) |
| |
| types = list(get_types(source)) |
| |
| print("// enum constants for resolv/arpa/nameser.h") |
| print() |
| for typ in types: |
| name = typ.name.replace("-", "_").lower() |
| print(" ns_t_{0} = {1.number},".format(name, typ)) |
| print() |
| |
| print("// macro aliases resolv/arpa/nameser_compat.h") |
| print() |
| for typ in types: |
| name = typ.name.replace("-", "_") |
| print("#define T_{0} ns_t_{1}".format(name.upper(), name.lower())) |
| print() |