Blame scripts/gen-rrtypes.py

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