~ubuntu-branches/ubuntu/raring/postfix/raring

« back to all changes in this revision

Viewing changes to src/dns/dns_sa_to_rr.c

Tags: upstream-2.2.6
ImportĀ upstreamĀ versionĀ 2.2.6

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*++
 
2
/* NAME
 
3
/*      dns_sa_to_rr 3
 
4
/* SUMMARY
 
5
/*      socket address to resource record
 
6
/* SYNOPSIS
 
7
/*      #include <dns.h>
 
8
/*
 
9
/*      DNS_RR  *dns_sa_to_rr(hostname, pref, sa)
 
10
/*      const char *hostname;
 
11
/*      unsigned pref;
 
12
/*      struct sockaddr *sa;
 
13
/* DESCRIPTION
 
14
/*      dns_sa_to_rr() converts a socket address into a DNS resource record.
 
15
/*
 
16
/*      Arguments:
 
17
/* .IP hostname
 
18
/*      The resource record host name.
 
19
/* .IP pref
 
20
/*      The resource record MX host preference, if applicable.
 
21
/* .IP sa
 
22
/*      Binary address.
 
23
/* DIAGNOSTICS
 
24
/*      The result is a null pointer in case of problems, with the
 
25
/*      errno variable set to indicate the problem type.
 
26
/* LICENSE
 
27
/* .ad
 
28
/* .fi
 
29
/*      The Secure Mailer license must be distributed with this software.
 
30
/* AUTHOR(S)
 
31
/*      Wietse Venema
 
32
/*      IBM T.J. Watson Research
 
33
/*      P.O. Box 704
 
34
/*      Yorktown Heights, NY 10598, USA
 
35
/*--*/
 
36
 
 
37
/* System libraries. */
 
38
 
 
39
#include <sys_defs.h>
 
40
#include <errno.h>
 
41
 
 
42
/* Utility library. */
 
43
 
 
44
#include <msg.h>
 
45
 
 
46
/* DNS library. */
 
47
 
 
48
#include <dns.h>
 
49
 
 
50
/* dns_sa_to_rr - socket address to resource record */
 
51
 
 
52
DNS_RR *dns_sa_to_rr(const char *hostname, unsigned pref, struct sockaddr * sa)
 
53
{
 
54
#define DUMMY_TTL       0
 
55
 
 
56
    if (sa->sa_family == AF_INET) {
 
57
        return (dns_rr_create(hostname, T_A, C_IN, DUMMY_TTL, pref,
 
58
                              (char *) &SOCK_ADDR_IN_ADDR(sa),
 
59
                              sizeof(SOCK_ADDR_IN_ADDR(sa))));
 
60
#ifdef HAS_IPV6
 
61
    } else if (sa->sa_family == AF_INET6) {
 
62
        return (dns_rr_create(hostname, T_AAAA, C_IN, DUMMY_TTL, pref,
 
63
                              (char *) &SOCK_ADDR_IN6_ADDR(sa),
 
64
                              sizeof(SOCK_ADDR_IN6_ADDR(sa))));
 
65
#endif
 
66
    } else {
 
67
        errno = EAFNOSUPPORT;
 
68
        return (0);
 
69
    }
 
70
}
 
71
 
 
72
 /*
 
73
  * Stand-alone test program.
 
74
  */
 
75
#ifdef TEST
 
76
#include <vstream.h>
 
77
#include <myaddrinfo.h>
 
78
#include <inet_proto.h>
 
79
 
 
80
static const char *myname;
 
81
 
 
82
static NORETURN usage(void)
 
83
{
 
84
    msg_fatal("usage: %s hostname", myname);
 
85
}
 
86
 
 
87
int     main(int argc, char **argv)
 
88
{
 
89
    MAI_HOSTADDR_STR hostaddr;
 
90
    struct addrinfo *res0;
 
91
    struct addrinfo *res;
 
92
    DNS_RR *rr;
 
93
    int     aierr;
 
94
 
 
95
    myname = argv[0];
 
96
    if (argc < 2)
 
97
        usage();
 
98
 
 
99
    inet_proto_init(argv[0], INET_PROTO_NAME_ALL);
 
100
 
 
101
    while (*++argv) {
 
102
        if ((aierr = hostname_to_sockaddr(argv[0], (char *) 0, 0, &res0)) != 0)
 
103
            msg_fatal("%s: %s", argv[0], MAI_STRERROR(aierr));
 
104
        for (res = res0; res != 0; res = res->ai_next) {
 
105
            if ((rr = dns_sa_to_rr(argv[0], 0, res->ai_addr)) == 0)
 
106
                msg_fatal("dns_sa_to_rr: %m");
 
107
            if (dns_rr_to_pa(rr, &hostaddr) == 0)
 
108
                msg_fatal("dns_rr_to_pa: %m");
 
109
            vstream_printf("%s -> %s\n", argv[0], hostaddr.buf);
 
110
            vstream_fflush(VSTREAM_OUT);
 
111
            dns_rr_free(rr);
 
112
        }
 
113
        freeaddrinfo(res0);
 
114
    }
 
115
    return (0);
 
116
}
 
117
 
 
118
#endif