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:
parent
a3ec3bd0f8
commit
e015d0659f
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user