diff options
author | Simon Kelley <simon@thekelleys.org.uk> | 2015-03-11 21:36:30 +0000 |
---|---|---|
committer | Simon Kelley <simon@thekelleys.org.uk> | 2015-03-11 21:36:30 +0000 |
commit | ff841ebf5a5d6864ff48571f607c32ce80dbb75a (patch) | |
tree | 027985142b90373268a5aca31c0a74874a1c92cd /src/forward.c | |
parent | 360f2513ab12a9bf1e262d388dd2ea8a566590a3 (diff) | |
download | dnsmasq-ff841ebf5a5d6864ff48571f607c32ce80dbb75a.tar.gz |
Fix boilerplate code for re-running system calls on EINTR and EAGAIN etc.
The nasty code with static variable in retry_send() which
avoids looping forever needs to be called on success of the syscall,
to reset the static variable.
Diffstat (limited to 'src/forward.c')
-rw-r--r-- | src/forward.c | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/src/forward.c b/src/forward.c index 438e9fa..7c0fa8d 100644 --- a/src/forward.c +++ b/src/forward.c @@ -103,15 +103,11 @@ int send_from(int fd, int nowild, char *packet, size_t len, #endif } - while (sendmsg(fd, &msg, 0) == -1) + while (retry_send(sendmsg(fd, &msg, 0))); + + /* If interface is still in DAD, EINVAL results - ignore that. */ + if (errno != 0 && errno != EINVAL) { - if (retry_send()) - continue; - - /* If interface is still in DAD, EINVAL results - ignore that. */ - if (errno == EINVAL) - break; - my_syslog(LOG_ERR, _("failed to send packet: %s"), strerror(errno)); return 0; } @@ -297,9 +293,9 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr, fd = forward->rfd4->fd; } - while (sendto(fd, (char *)header, plen, 0, - &forward->sentto->addr.sa, - sa_len(&forward->sentto->addr)) == -1 && retry_send()); + while (retry_send( sendto(fd, (char *)header, plen, 0, + &forward->sentto->addr.sa, + sa_len(&forward->sentto->addr)))); return 1; } @@ -469,14 +465,12 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr, #endif } - if (sendto(fd, (char *)header, plen, 0, - &start->addr.sa, - sa_len(&start->addr)) == -1) - { - if (retry_send()) - continue; - } - else + if (retry_send(sendto(fd, (char *)header, plen, 0, + &start->addr.sa, + sa_len(&start->addr)))) + continue; + + if (errno == 0) { /* Keep info in case we want to re-send this packet */ daemon->srv_save = start; @@ -932,7 +926,9 @@ void reply_query(int fd, int family, time_t now) if (fd != -1) { - while (sendto(fd, (char *)header, nn, 0, &server->addr.sa, sa_len(&server->addr)) == -1 && retry_send()); + while (retry_send(sendto(fd, (char *)header, nn, 0, + &server->addr.sa, + sa_len(&server->addr)))); server->queries++; } @@ -2228,8 +2224,9 @@ void resend_query() else return; - while(sendto(fd, daemon->packet, daemon->packet_len, 0, - &daemon->srv_save->addr.sa, sa_len(&daemon->srv_save->addr)) == -1 && retry_send()); + while(retry_send(sendto(fd, daemon->packet, daemon->packet_len, 0, + &daemon->srv_save->addr.sa, + sa_len(&daemon->srv_save->addr)))); } } |