]>
jfr.im git - solanum.git/blob - authd/dns.c
1 /* authd/dns.h - header for authd DNS functions
2 * Copyright (c) 2016 William Pitcock <nenolod@dereferenced.org>
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice is present in all copies.
8 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
9 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
10 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
11 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
12 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
13 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
14 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
15 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
16 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
17 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
18 * POSSIBILITY OF SUCH DAMAGE.
26 format_address(struct rb_sockaddr_storage
*addr
, char *buffer
, size_t length
)
28 if(GET_SS_FAMILY(addr
) == AF_INET
)
30 rb_inet_ntop_sock((struct sockaddr
*)addr
, buffer
, length
);
33 else if(GET_SS_FAMILY(addr
) == AF_INET6
)
37 rb_inet_ntop_sock((struct sockaddr
*)addr
, tmpbuf
, length
);
41 rb_strlcpy(buffer
, "0", length
);
42 rb_strlcat(buffer
, tmpbuf
, length
);
45 rb_strlcpy(buffer
, tmpbuf
, length
);
51 sockcmp(struct rb_sockaddr_storage
*addr
, struct rb_sockaddr_storage
*addr2
, int family
)
55 struct sockaddr_in
*ip
, *ip2
;
56 ip
= (struct sockaddr_in
*)addr
;
57 ip2
= (struct sockaddr_in
*)addr2
;
59 return ip
->sin_addr
.s_addr
== ip2
->sin_addr
.s_addr
;
62 else if(family
== AF_INET6
)
64 struct sockaddr_in6
*ip
, *ip2
;
65 ip
= (struct sockaddr_in6
*) addr
;
66 ip2
= (struct sockaddr_in6
*) addr2
;
68 return(memcmp(&ip
->sin6_addr
, &ip2
->sin6_addr
, sizeof(struct in6_addr
)) == 0);
76 submit_dns_answer(void *userdata
, struct DNSReply
*reply
)
78 struct dns_request
*req
= userdata
;
79 char response
[64] = "*";
85 rb_helper_write(authd_helper
, "E %s E %c *", req
->reqid
, req
->type
);
94 format_address(&reply
->addr
, response
, sizeof(response
));
102 if(sockcmp(&req
->addr
, &reply
->addr
, family
) && strlen(reply
->h_name
) < 63)
104 rb_strlcpy(response
, reply
->h_name
, sizeof(response
));
112 rb_helper_write(authd_helper
, "E %s %c %c %s", req
->reqid
, status
, req
->type
, response
);
118 resolve_dns(int parc
, char *parv
[])
120 struct dns_request
*req
;
121 char *requestid
= parv
[1];
122 char *qtype
= parv
[2];
126 req
= rb_malloc(sizeof(*req
));
127 rb_strlcpy(req
->reqid
, requestid
, sizeof(req
->reqid
));
140 if(!rb_inet_pton_sock(rec
, (struct sockaddr
*) &req
->addr
))
146 req
->query
.ptr
= req
;
147 req
->query
.callback
= submit_dns_answer
;
150 gethost_byname_type(rec
, &req
->query
, type
);
152 gethost_byaddr(&req
->addr
, &req
->query
);
156 enumerate_nameservers(const char *rid
, const char letter
)
158 char buf
[40 * IRCD_MAXNS
]; /* Plenty */
164 /* Shouldn't happen */
165 rb_helper_write(authd_helper
, "X %s %c NONAMESERVERS", rid
, letter
);
169 for(i
= 0; i
< irc_nscount
; i
++)
174 rb_inet_ntop_sock((struct sockaddr
*)&irc_nsaddr_list
[i
], addr
, sizeof(addr
));
178 /* Shouldn't happen */
179 rb_helper_write(authd_helper
, "X %s %c INVALIDNAMESERVER", rid
, letter
);
183 ret
= snprintf(c
, 40, "%s ", addr
);
189 rb_helper_write(authd_helper
, "Y %s %c %s", rid
, letter
, buf
);
193 reload_nameservers(const char letter
)
195 /* Not a whole lot to it */