djbdnscurve6 45
djbdnscurve6
Loading...
Searching...
No Matches
dns_mx.c
Go to the documentation of this file.
1#include "stralloc.h"
2#include "byte.h"
3#include "uint_t.h"
4#include "dns.h"
5
6static char *q = 0;
7
8int dns_mx_packet(stralloc *out,const char *buf,unsigned int len)
9{
10 unsigned int pos;
11 char header[12];
12 char pref[2];
13 uint16 numanswers;
14 uint16 datalen;
15 int ranswers = 0;
16
17 if (!stralloc_copys(out,"")) return DNS_MEM;
18
19 pos = dns_packet_copy(buf,len,0,header,12); if (!pos) return DNS_ERR;
20 uint16_unpack_big(header + 6,&numanswers);
21 pos = dns_packet_skipname(buf,len,pos); if (!pos) return DNS_ERR;
22 pos += 4;
23
24 while (numanswers--) {
25 pos = dns_packet_skipname(buf,len,pos); if (!pos) return DNS_ERR;
26 pos = dns_packet_copy(buf,len,pos,header,10); if (!pos) return DNS_ERR;
27 uint16_unpack_big(header + 8,&datalen);
28 if (byte_equal(header,2,DNS_T_MX))
29 if (byte_equal(header + 2,2,DNS_C_IN)) {
30 if (!dns_packet_copy(buf,len,pos,pref,2)) return DNS_ERR;
31 if (!dns_packet_getname(buf,len,pos + 2,&q)) return DNS_ERR;
32 if (!stralloc_catb(out,pref,2)) return DNS_MEM;
33 if (dns_domain_todot_cat(out,q) <= 0) return DNS_ERR;
34 if (!stralloc_0(out)) return DNS_MEM;
35 }
36 pos += datalen;
37 ++ranswers;
38 }
39
40 return ranswers;
41}
42
43int dns_mx(stralloc *out,const stralloc *fqdn)
44{
45 int rc = 0;
46
47 if (dns_domain_fromdot(&q,fqdn->s,fqdn->len) <= 0) return DNS_ERR;
48 if (dns_resolve(q,DNS_T_MX) >= 0) {
52 }
53
54 return rc;
55}
uint16 len
Definition: axfrdns.c:319
char buf[MSGSIZE]
Definition: axfrdns.c:318
#define DNS_ERR
Definition: dns.h:32
#define DNS_C_IN
Definition: dns.h:53
#define DNS_MEM
Definition: dns.h:31
#define DNS_T_MX
Definition: dns.h:62
int dns_domain_fromdot(char **out, const char *buf, unsigned int n)
Definition: dns_dfd.c:6
void dns_domain_free(char **out)
Definition: dns_domain.c:17
int dns_domain_todot_cat(stralloc *out, const char *d)
Definition: dns_dtda.c:11
int dns_mx(stralloc *out, const stralloc *fqdn)
Definition: dns_mx.c:43
int dns_mx_packet(stralloc *out, const char *buf, unsigned int len)
Definition: dns_mx.c:8
unsigned int dns_packet_getname(const char *buf, unsigned int len, unsigned int pos, char **d)
Definition: dns_packet.c:35
unsigned int dns_packet_copy(const char *buf, unsigned int len, unsigned int pos, char *out, unsigned int outlen)
Definition: dns_packet.c:8
unsigned int dns_packet_skipname(const char *buf, unsigned int len, unsigned int pos)
Definition: dns_packet.c:18
int dns_resolve(const char *q, const char qtype[2])
Definition: dns_resolve.c:9
struct dns_transmit dns_resolve_tx
Definition: dns_resolve.c:7
void dns_transmit_free(struct dns_transmit *d)
Definition: dns_transmit.c:95
void out(const char *s, unsigned int len)
Definition: generic-conf.c:54
unsigned int packetlen
Definition: dns.h:96
char * packet
Definition: dns.h:95