#!/usr/bin/env python3
# getai -- perform getaddrinfo() queries
import argparse
import socket

consts = {
    "SOCK": {
        1: "STREAM",
        2: "DGRAM",
        3: "RAW",
        4: "RDM",
        5: "SEQPACKET",
        6: "DCCP",
        10: "PACKET",
    },
}

def name(const, prefix):
    suffix = consts.get(prefix, {}).get(const, "<%s>" % const)
    return getattr(const, "name", "%s_%s" % (prefix, suffix))

parser = argparse.ArgumentParser()
parser.add_argument("hostname", nargs="*")
args = parser.parse_args()
# We don't handle '-4' and '-6' as options because we want the last one to take
# priority. Fortunately, argparse will already treat '-4' and '-6' as
# non-options by default, so we don't have to do anything special for that.

service = "discard"
flags = socket.AI_CANONNAME
want_af = socket.AF_UNSPEC

for host in args.hostname:
    if host == "-4":
        want_af = socket.AF_INET
        continue
    if host == "-6":
        want_af = socket.AF_INET6
        continue

    r = socket.getaddrinfo(host, service, want_af, socket.SOCK_DGRAM, flags=flags)
    for r_af, r_type, r_proto, r_cname, r_addr in r:
        if r_cname:
            print("Canonical name:", r_cname)

        if r_af == socket.AF_INET:
            addr_str = "{host: %r, port: %r}" % r_addr
        elif r_af == socket.AF_INET6:
            addr_str = "{host: %r, port: %r, flow: %r, scope: %r}" % r_addr
        else:
            addr_str = repr(r_addr)

        print(name(r_af, "AF"), addr_str)
