s/qmail 4.2.29a
Next generation secure email transport
Loading...
Searching...
No Matches
dnsmxip.c
Go to the documentation of this file.
1#include <sys/types.h>
2#include <sys/socket.h>
3#include <unistd.h>
4#include "buffer.h"
5#include "stralloc.h"
6#include "fmt.h"
7#include "dnsresolv.h"
8#include "ip.h"
9#include "now.h"
10#include "exit.h"
11#include "dns.h"
12#include "logmsg.h"
13#include "str.h"
14
15#define WHO "dnsmxip"
16
17static stralloc sa = {0};
18static stralloc ia = {0};
19static stralloc out = {0};
20static stralloc ipaddr = {0};
21
22int dns_ia(stralloc *ip,char *s)
23{
24 int i;
25 int j = 0;
26 int r = 0;
27 char ip4str[IP4_FMT];
28 char ip6str[IP6_FMT];
29
30 if (!stralloc_copys(&sa,s)) return -1;
31 if (sa.s[sa.len-1] != '.')
32 if (!stralloc_append(&sa,".")) return -1;
33 if (!stralloc_copys(ip,"")) return -1;
34
36 if (dns_ip6(&ia,&sa) > 0) {
37 for (i = 0; i + 16 <= ia.len; i += 16) {
38 if (ip6_isv4mapped(ia.s + i)) continue;
39 j = ip6_fmt(ip6str,ia.s + i);
40 r += j;
41 if (!stralloc_catb(ip,ip6str,j)) return -1;
42 if (!stralloc_cats(ip," ")) return -1;
43 r++;
44 }
45 }
46
47 if (dns_ip4(&ia,&sa) > 0) {
48 for (i = 0; i + 4 <= ia.len; i += 4) {
49 j = ip4_fmt(ip4str,ia.s + i);
50 r += j;
51 if (!stralloc_catb(ip,ip4str,j)) return -1;
52 if (!stralloc_cats(ip," ")) return -1;
53 r++;
54 }
55 }
56 if (!stralloc_0(ip)) return -1;
57
58 return r?r-1:0;
59}
60
61int main(int argc,char **argv)
62{
63 int j, k, r;
64 uint16 u;
65 int len;
66 char num[FMT_ULONG];
67
68 if (!argv[1])
69 logmsg(WHO,100,USAGE,"dnsmx fqdn");
70 if (!stralloc_copys(&sa,argv[1]))
71 logmsg(WHO,111,FATAL,"out of memory");
72
74 if ((r = dns_mx(&out,&sa)) < 0) _exit(1);
75 if (r > 0) {
76 j = len = 0;
77 do {
78 j = str_chr(out.s + len + 2,'\0');
79 k = dns_ia(&ipaddr,out.s + len + 2); /* IP */
80 if (k) {
81 buffer_put(buffer_1,out.s + len + 2,j); /* MX */
82 buffer_puts(buffer_1,": ");
83 out.s[len + 3] = '\0';
84 uint16_unpack_big(out.s + len,&u);
85 buffer_put(buffer_1,num,fmt_ulong(num,u)) ;
86 buffer_puts(buffer_1," [");
87 buffer_put(buffer_1,ipaddr.s,k);
88 buffer_puts(buffer_1,"]");
89 }
90 buffer_putsflush(buffer_1,"\n");
91 len += j + 3;
92 } while (len < out.len);
93 } else { /* A/AAAA */
94 k = dns_ia(&ipaddr,argv[1]); /* IP */
95 if (k) {
96 buffer_puts(buffer_1,argv[1]);
97 buffer_puts(buffer_1,": -");
98 buffer_puts(buffer_1," [");
99 buffer_put(buffer_1,ipaddr.s,k);
100 buffer_puts(buffer_1,"]");
101 buffer_putsflush(buffer_1,"\n");
102 }
103 }
104
105 _exit(0);
106}
int main()
Definition: chkshsgr.c:6
char num[FMT_ULONG]
Definition: chkspawn.c:8
int stralloc_copys(stralloc *, char const *)
#define DNS_INIT
Definition: dns.h:12
stralloc out
Definition: dnscname.c:12
stralloc sa
Definition: dnscname.c:11
stralloc ia
Definition: dnsfq.c:17
int dns_ia(stralloc *ip, char *s)
Definition: dnsmxip.c:22
#define WHO
Definition: dnsmxip.c:15
void _exit()
int j
Definition: qmail-send.c:920
uint32_t k[64]
Definition: sha256.c:26