Browse Source

[Minor] Connect UDP sockets when send was successful

tags/1.9.2
Vsevolod Stakhov 5 years ago
parent
commit
1a23c43776
3 changed files with 35 additions and 9 deletions
  1. 1
    1
      contrib/librdns/curve.c
  2. 1
    0
      contrib/librdns/dns_private.h
  3. 33
    8
      contrib/librdns/resolver.c

+ 1
- 1
contrib/librdns/curve.c View File

@@ -782,7 +782,7 @@ rdns_curve_recv (struct rdns_io_channel *ioc, void *buf, size_t len, void *plugi
struct rdns_resolver *resolver;

resolver = ctx->resolver;
ret = recvfrom (ioc->sock, buf, len, 0, saddr, &slen);
ret = recv (ioc->sock, buf, len, 0);

if (ret <= 0 || ret < 64) {
/* Definitely not a DNSCurve packet */

+ 1
- 0
contrib/librdns/dns_private.h View File

@@ -108,6 +108,7 @@ struct rdns_io_channel {
socklen_t slen;
int sock; /**< persistent socket */
bool active;
bool connected;
void *async_io; /** async opaque ptr */
struct rdns_request *requests; /**< requests in flight */
uint64_t uses;

+ 33
- 8
contrib/librdns/resolver.c View File

@@ -68,15 +68,28 @@ rdns_send_request (struct rdns_request *req, int fd, bool new_req)
}

if (resolver->curve_plugin == NULL) {
r = sendto (fd, req->packet, req->pos, 0,
req->io->saddr,
req->io->slen);
if (!req->io->connected) {
r = sendto (fd, req->packet, req->pos, 0,
req->io->saddr,
req->io->slen);
}
else {
r = send (fd, req->packet, req->pos, 0);
}
}
else {
r = resolver->curve_plugin->cb.curve_plugin.send_cb (req,
resolver->curve_plugin->data,
req->io->saddr,
req->io->slen);
if (!req->io->connected) {
r = resolver->curve_plugin->cb.curve_plugin.send_cb (req,
resolver->curve_plugin->data,
req->io->saddr,
req->io->slen);
}
else {
r = resolver->curve_plugin->cb.curve_plugin.send_cb (req,
resolver->curve_plugin->data,
NULL,
0);
}
}
if (r == -1) {
if (errno == EAGAIN || errno == EINTR) {
@@ -98,6 +111,18 @@ rdns_send_request (struct rdns_request *req, int fd, bool new_req)
return -1;
}
}
else if (!req->io->connected) {
/* Connect socket */
r = connect (fd, req->io->saddr, req->io->slen);

if (r == -1) {
rdns_err ("cannot connect after sending request: %s for server %s",
strerror (errno), serv->name);
}
else {
req->io->connected = true;
}
}

if (new_req) {
/* Add request to hash table */
@@ -257,7 +282,7 @@ rdns_process_read (int fd, void *arg)

/* First read packet from socket */
if (resolver->curve_plugin == NULL) {
r = recvfrom (fd, in, sizeof (in), 0, ioc->saddr, &ioc->slen);
r = recv (fd, in, sizeof (in), 0);
if (r > (int)(sizeof (struct dns_header) + sizeof (struct dns_query))) {
req = rdns_find_dns_request (in, ioc);
}

Loading…
Cancel
Save