summaryrefslogtreecommitdiffstats
path: root/contrib/librdns/curve.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2019-03-30 10:07:57 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2019-03-30 10:07:57 +0000
commit6dd638eafa3413f1adc77b483c0dc51d2cb86750 (patch)
tree606ca6919c3e03b792d55b505c7ed73adf7110aa /contrib/librdns/curve.c
parent0e725e24bf64bc70a47c73ea8b63231498921a5b (diff)
downloadrspamd-6dd638eafa3413f1adc77b483c0dc51d2cb86750.tar.gz
rspamd-6dd638eafa3413f1adc77b483c0dc51d2cb86750.zip
[Feature] Allow unconnected DNS servers operations
This allows to stop relying on resolvers initialisation and send requests when the resolvers are available.
Diffstat (limited to 'contrib/librdns/curve.c')
-rw-r--r--contrib/librdns/curve.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/contrib/librdns/curve.c b/contrib/librdns/curve.c
index 3976b14a0..0444dd489 100644
--- a/contrib/librdns/curve.c
+++ b/contrib/librdns/curve.c
@@ -448,9 +448,11 @@ rdns_curve_dtor (struct rdns_resolver *resolver, void *plugin_data)
#define crypto_box_ZEROBYTES 32
#define crypto_box_BOXZEROBYTES 16
-ssize_t rdns_curve_send (struct rdns_request *req, void *plugin_data);
+ssize_t rdns_curve_send (struct rdns_request *req, void *plugin_data,
+ struct sockaddr *saddr, socklen_t slen);
ssize_t rdns_curve_recv (struct rdns_io_channel *ioc, void *buf, size_t len,
- void *plugin_data, struct rdns_request **req_out);
+ void *plugin_data, struct rdns_request **req_out,
+ struct sockaddr *saddr, socklen_t slen);
void rdns_curve_finish_request (struct rdns_request *req, void *plugin_data);
void rdns_curve_dtor (struct rdns_resolver *resolver, void *plugin_data);
@@ -683,7 +685,8 @@ rdns_curve_register_plugin (struct rdns_resolver *resolver,
}
ssize_t
-rdns_curve_send (struct rdns_request *req, void *plugin_data)
+rdns_curve_send (struct rdns_request *req, void *plugin_data,
+ struct sockaddr *saddr, socklen_t slen)
{
struct rdns_curve_ctx *ctx = (struct rdns_curve_ctx *)plugin_data;
struct rdns_curve_entry *entry;
@@ -746,12 +749,19 @@ rdns_curve_send (struct rdns_request *req, void *plugin_data)
iov[3].iov_base = m + crypto_box_BOXZEROBYTES;
iov[3].iov_len = boxed_len - crypto_box_BOXZEROBYTES;
- ret = writev (req->io->sock, iov, sizeof (iov) / sizeof (iov[0]));
+ struct msghdr msg;
+
+ memset (&msg, 0, sizeof (msg));
+ msg.msg_namelen = slen;
+ msg.msg_name = saddr;
+ msg.msg_iov = iov;
+ msg.msg_iovlen = sizeof (iov) / sizeof (iov[0]);
+ ret = sendmsg (req->io->sock, &msg, 0);
rspamd_explicit_memzero (m, boxed_len);
free (m);
}
else {
- ret = write (req->io->sock, req->packet, req->pos);
+ ret = sendto (req->io->sock, req->packet, req->pos, 0, saddr, slen);
req->curve_plugin_data = NULL;
}
@@ -760,7 +770,7 @@ rdns_curve_send (struct rdns_request *req, void *plugin_data)
ssize_t
rdns_curve_recv (struct rdns_io_channel *ioc, void *buf, size_t len, void *plugin_data,
- struct rdns_request **req_out)
+ struct rdns_request **req_out, struct sockaddr *saddr, socklen_t slen)
{
struct rdns_curve_ctx *ctx = (struct rdns_curve_ctx *)plugin_data;
ssize_t ret, boxlen;
@@ -771,7 +781,7 @@ rdns_curve_recv (struct rdns_io_channel *ioc, void *buf, size_t len, void *plugi
struct rdns_resolver *resolver;
resolver = ctx->resolver;
- ret = read (ioc->sock, buf, len);
+ ret = recvfrom (ioc->sock, buf, len, 0, saddr, &slen);
if (ret <= 0 || ret < 64) {
/* Definitely not a DNSCurve packet */