diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-03-30 10:07:57 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-03-30 10:07:57 +0000 |
commit | 6dd638eafa3413f1adc77b483c0dc51d2cb86750 (patch) | |
tree | 606ca6919c3e03b792d55b505c7ed73adf7110aa /contrib/librdns/curve.c | |
parent | 0e725e24bf64bc70a47c73ea8b63231498921a5b (diff) | |
download | rspamd-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.c | 24 |
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 */ |