arping: fix the case when inherited signal mask masks out ALRM

function                                             old     new   delta
arping_main                                         1629    1635      +6

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-02-11 13:48:52 +01:00
parent a3ec3bd0f8
commit e015d0659f

View File

@ -413,28 +413,37 @@ int arping_main(int argc UNUSED_PARAM, char **argv)
printf(" from %s %s\n", inet_ntoa(src), device); printf(" from %s %s\n", inet_ntoa(src), device);
} }
packet = xmalloc(4096);
signal_SA_RESTART_empty_mask(SIGINT, (void (*)(int))finish); signal_SA_RESTART_empty_mask(SIGINT, (void (*)(int))finish);
signal_SA_RESTART_empty_mask(SIGALRM, (void (*)(int))catcher); signal_SA_RESTART_empty_mask(SIGALRM, (void (*)(int))catcher);
/* Send the first packet, arm ALRM */
catcher(); catcher();
packet = xmalloc(4096);
while (1) { while (1) {
sigset_t sset, osset; sigset_t sset;
struct sockaddr_ll from; struct sockaddr_ll from;
socklen_t alen = sizeof(from); socklen_t alen = sizeof(from);
int cc; int cc;
sigemptyset(&sset);
sigaddset(&sset, SIGALRM);
sigaddset(&sset, SIGINT);
/* Unblock SIGALRM so that the previously called alarm()
* can prevent recvfrom from blocking forever in case the
* inherited procmask is blocking SIGALRM.
*/
sigprocmask(SIG_UNBLOCK, &sset, NULL);
cc = recvfrom(sock_fd, packet, 4096, 0, (struct sockaddr *) &from, &alen); cc = recvfrom(sock_fd, packet, 4096, 0, (struct sockaddr *) &from, &alen);
/* Don't allow SIGALRMs while we process the reply */
sigprocmask(SIG_BLOCK, &sset, NULL);
if (cc < 0) { if (cc < 0) {
bb_perror_msg("recvfrom"); bb_perror_msg("recvfrom");
continue; continue;
} }
sigemptyset(&sset);
sigaddset(&sset, SIGALRM);
sigaddset(&sset, SIGINT);
sigprocmask(SIG_BLOCK, &sset, &osset);
recv_pack(packet, cc, &from); recv_pack(packet, cc, &from);
sigprocmask(SIG_SETMASK, &osset, NULL);
} }
} }