ping called printf() from a signal handler..
this is a NO-NO re-arange to just set a "please die immediatly" flag in the signal handler and handle this in the normal thread. also handle ping -f better on slow links by backing off a bit when we get a ENOBUFFS from the sendto().
This commit is contained in:
parent
7ed3c9e661
commit
515dd2fa3f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=27299
@ -45,7 +45,7 @@ static const char copyright[] =
|
|||||||
static char sccsid[] = "@(#)ping.c 8.1 (Berkeley) 6/5/93";
|
static char sccsid[] = "@(#)ping.c 8.1 (Berkeley) 6/5/93";
|
||||||
*/
|
*/
|
||||||
static const char rcsid[] =
|
static const char rcsid[] =
|
||||||
"$Id: ping.c,v 1.20 1997/03/03 09:50:21 imp Exp $";
|
"$Id: ping.c,v 1.21 1997/03/04 22:05:49 imp Exp $";
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -97,6 +97,8 @@ static const char rcsid[] =
|
|||||||
#define MAXPACKET (65536 - 60 - 8)/* max packet size */
|
#define MAXPACKET (65536 - 60 - 8)/* max packet size */
|
||||||
#define MAXWAIT 10 /* max seconds to wait for response */
|
#define MAXWAIT 10 /* max seconds to wait for response */
|
||||||
#define NROUTES 9 /* number of record route slots */
|
#define NROUTES 9 /* number of record route slots */
|
||||||
|
#define FLOOD_BACKOFF 20000 /* usecs to back off if flooding */
|
||||||
|
/* reports we are out of buffer space */
|
||||||
|
|
||||||
#define A(bit) rcvd_tbl[(bit)>>3] /* identify byte in array */
|
#define A(bit) rcvd_tbl[(bit)>>3] /* identify byte in array */
|
||||||
#define B(bit) (1 << ((bit) & 0x07)) /* identify bit in byte */
|
#define B(bit) (1 << ((bit) & 0x07)) /* identify bit in byte */
|
||||||
@ -146,6 +148,7 @@ long nreceived; /* # of packets we got back */
|
|||||||
long nrepeats; /* number of duplicates */
|
long nrepeats; /* number of duplicates */
|
||||||
long ntransmitted; /* sequence # for outbound packets = #sent */
|
long ntransmitted; /* sequence # for outbound packets = #sent */
|
||||||
int interval = 1; /* interval between packets */
|
int interval = 1; /* interval between packets */
|
||||||
|
int finish_up = 0; /* We've been told to finish up */
|
||||||
|
|
||||||
/* timing */
|
/* timing */
|
||||||
int timing; /* flag to do timing */
|
int timing; /* flag to do timing */
|
||||||
@ -160,6 +163,7 @@ static void fill(char *, char *);
|
|||||||
static u_short in_cksum(u_short *, int);
|
static u_short in_cksum(u_short *, int);
|
||||||
static void catcher(int sig);
|
static void catcher(int sig);
|
||||||
static void check_status(void);
|
static void check_status(void);
|
||||||
|
static void stopit(int);
|
||||||
static void finish(int) __dead2;
|
static void finish(int) __dead2;
|
||||||
static void pinger(void);
|
static void pinger(void);
|
||||||
static char *pr_addr(struct in_addr);
|
static char *pr_addr(struct in_addr);
|
||||||
@ -419,7 +423,7 @@ main(argc, argv)
|
|||||||
else
|
else
|
||||||
(void)printf("PING %s: %d data bytes\n", hostname, datalen);
|
(void)printf("PING %s: %d data bytes\n", hostname, datalen);
|
||||||
|
|
||||||
(void)signal(SIGINT, finish);
|
(void)signal(SIGINT, stopit);
|
||||||
(void)signal(SIGALRM, catcher);
|
(void)signal(SIGALRM, catcher);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -445,7 +449,7 @@ main(argc, argv)
|
|||||||
if ((options & F_FLOOD) == 0)
|
if ((options & F_FLOOD) == 0)
|
||||||
catcher(0); /* start things going */
|
catcher(0); /* start things going */
|
||||||
|
|
||||||
for (;;) {
|
while (finish_up == 0) {
|
||||||
struct sockaddr_in from;
|
struct sockaddr_in from;
|
||||||
register int cc;
|
register int cc;
|
||||||
int fromlen;
|
int fromlen;
|
||||||
@ -477,6 +481,19 @@ main(argc, argv)
|
|||||||
exit(0); /* Make the compiler happy */
|
exit(0); /* Make the compiler happy */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Stopit --
|
||||||
|
*
|
||||||
|
* set the global bit that cause everything to quit..
|
||||||
|
* do rNOT quit and exit from the signal handler!
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
stopit(int ignored)
|
||||||
|
{
|
||||||
|
finish_up = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* catcher --
|
* catcher --
|
||||||
* This routine causes another PING to be transmitted, and then
|
* This routine causes another PING to be transmitted, and then
|
||||||
@ -503,7 +520,7 @@ catcher(int sig)
|
|||||||
waittime = 1;
|
waittime = 1;
|
||||||
} else
|
} else
|
||||||
waittime = MAXWAIT;
|
waittime = MAXWAIT;
|
||||||
(void)signal(SIGALRM, finish);
|
(void)signal(SIGALRM, stopit);
|
||||||
(void)alarm((u_int)waittime);
|
(void)alarm((u_int)waittime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -546,6 +563,10 @@ pinger(void)
|
|||||||
|
|
||||||
if (i < 0 || i != cc) {
|
if (i < 0 || i != cc) {
|
||||||
if (i < 0) {
|
if (i < 0) {
|
||||||
|
if ((options & F_FLOOD) && (errno == ENOBUFS)) {
|
||||||
|
usleep(FLOOD_BACKOFF);
|
||||||
|
return;
|
||||||
|
}
|
||||||
warn("sendto");
|
warn("sendto");
|
||||||
} else {
|
} else {
|
||||||
warn("%s: partial write: %d of %d bytes",
|
warn("%s: partial write: %d of %d bytes",
|
||||||
@ -577,7 +598,7 @@ pr_pack(buf, cc, from)
|
|||||||
static char old_rr[MAX_IPOPTLEN];
|
static char old_rr[MAX_IPOPTLEN];
|
||||||
struct ip *ip;
|
struct ip *ip;
|
||||||
struct timeval tv, *tp;
|
struct timeval tv, *tp;
|
||||||
double triptime;
|
double triptime = 0.0;
|
||||||
int hlen, dupflag;
|
int hlen, dupflag;
|
||||||
|
|
||||||
(void)gettimeofday(&tv, (struct timezone *)NULL);
|
(void)gettimeofday(&tv, (struct timezone *)NULL);
|
||||||
|
Loading…
Reference in New Issue
Block a user