A tool to quickly ping N number of hosts to determine their reachability
without flooding the network.
This commit is contained in:
form 2000-03-24 11:02:35 +00:00
parent a1eb8868e4
commit 40b57f5443
7 changed files with 231 additions and 0 deletions

35
net/fping/Makefile Normal file
View File

@ -0,0 +1,35 @@
# $FreeBSD: ports/net/fping/Makefile,v 1.8 2000/03/22 00:26:51 obrien Exp $
# $OpenBSD: Makefile,v 1.1.1.1 2000/03/24 11:02:35 form Exp $
DISTNAME= part01
PKGNAME= fping-1.20
CATEGORIES= net
MASTER_SITES= ftp://ftp.uu.net/usenet/comp.sources.unix/volume26/fping/ \
ftp://ftp.digital.com/pub/usenet/comp.sources.unix/volume26/fping/ \
ftp://ftp.wustl.edu/usenet/comp.sources.unix/volume26/fping/ \
ftp://ftp.isnet.is/pub/Usenet/Usenet.src/comp.sources.unix/v26/fping/
EXTRACT_SUFX= .Z
EXTRACT_CMD= zcat
EXTRACT_BEFORE_ARGS=
EXTRACT_AFTER_ARGS= | sed -e '1,/Archive-Name/d' | sh
PERMIT_PACKAGE_CDROM= Yes
PERMIT_PACKAGE_FTP= Yes
PERMIT_DISTFILES_CDROM= Yes
PERMIT_DISTFILES_FTP= Yes
FAKE= Yes
MAINTAINER= form@openbsd.org
DIST_SUBDIR= fping
WRKDIST= ${WRKDIR}
do-install:
${INSTALL_PROGRAM} ${WRKBUILD}/fping ${PREFIX}/sbin
${INSTALL_MAN} ${WRKBUILD}/fping.man ${PREFIX}/man/man8/fping.8
${INSTALL_MAN_DIR} ${PREFIX}/share/doc/fping
${INSTALL_MAN} ${WRKBUILD}/README* ${PREFIX}/share/doc/fping
.include <bsd.port.mk>

3
net/fping/files/md5 Normal file
View File

@ -0,0 +1,3 @@
MD5 (fping/part01.Z) = b472b9936f814051370f5cada5e3ab0a
RMD160 (fping/part01.Z) = 2b8a59054d0e377c35800595cf0e27bd73181cc4
SHA1 (fping/part01.Z) = 5da77db8996539095e4da7b253f0f80b6f3896bc

View File

@ -0,0 +1,119 @@
# $OpenBSD: patch-fping-c,v 1.1.1.1 2000/03/24 11:02:35 form Exp $
--- fping.c.orig Mon Sep 20 13:10:23 1999
+++ fping.c Mon Sep 20 13:15:05 1999
@@ -185,7 +185,9 @@
extern char *optarg;
extern int optind,opterr;
+#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
extern char *sys_errlist[];
+#endif
#ifdef __cplusplus
@@ -234,9 +236,9 @@
int timeout = DEFAULT_TIMEOUT;
int interval = DEFAULT_INTERVAL;
-long max_reply=0;
-long min_reply=10000;
-int total_replies=0;
+long max_reply=0; /* usec */
+long min_reply=10000; /* usec */
+int total_replies=0; /* usec */
double sum_replies=0;
struct timeval timeout_timeval;
@@ -385,6 +387,7 @@
}
if (!ping_file) errno_crash_and_burn("fopen");
while(fgets(line,132,ping_file)) {
+ line[132-1] = '\0';
sscanf(line,"%s",host);
if ((!*host) || (host[0]=='#')) /* magic to avoid comments */
continue;
@@ -411,8 +414,8 @@
cursor=cursor->next;
}
- gettimeofday(&start_time,&tz);
cursor=rrlist;
+ gettimeofday(&start_time,&tz);
while (num_waiting) { /* while pings are outstanding */
if ( (timeval_diff(&current_time,&cursor->last_time)> timeout) ||
cursor->num_packets_sent==0) {
@@ -455,11 +458,11 @@
min_reply=0; max_reply=0; total_replies=1; sum_replies=0;
}
- fprintf(stderr," %8d msec (min round trip time)\n",min_reply);
- fprintf(stderr," %8d msec (avg round trip time)\n",(int)sum_replies/total_replies);
- fprintf(stderr," %8d msec (max round trip time)\n",max_reply);
+ fprintf(stderr," %8.3f msec (min round trip time)\n",min_reply/1000.0);
+ fprintf(stderr," %8.3f msec (avg round trip time)\n",sum_replies/total_replies/1000.0);
+ fprintf(stderr," %8.3f msec (max round trip time)\n",max_reply/1000.0);
fprintf(stderr," %8.3f sec (elapsed real time)\n",
- timeval_diff( &end_time,&start_time)/1000.0);
+ timeval_diff( &end_time,&start_time)/1000000.0);
fprintf(stderr,"\n");
}
@@ -493,8 +496,6 @@
struct icmp *icp = (struct icmp *) buffer;
int n,len;
- gettimeofday(&h->last_time,&tz);
-
icp->icmp_type = ICMP_ECHO;
icp->icmp_code = 0;
icp->icmp_cksum = 0;
@@ -504,12 +505,15 @@
#define SIZE_PACK_SENT (sizeof(h->num_packets_sent))
#define SIZE_LAST_TIME (sizeof(h->last_time))
- bcopy(&h->last_time,&buffer[SIZE_ICMP_HDR],SIZE_LAST_TIME);
bcopy(&h->num_packets_sent,
&buffer[SIZE_ICMP_HDR+SIZE_LAST_TIME], SIZE_PACK_SENT);
len = SIZE_ICMP_HDR+SIZE_LAST_TIME+SIZE_PACK_SENT;
+ /* set the time at the very last possible point */
+ gettimeofday(&h->last_time,&tz);
+ bcopy(&h->last_time,&buffer[SIZE_ICMP_HDR],SIZE_LAST_TIME);
+
icp->icmp_cksum = in_cksum( (u_short *)icp, len );
n = sendto( s, buffer, len, 0, (struct sockaddr *)&h->saddr,
@@ -578,10 +582,12 @@
return 1; /* packet received, don't about it anymore */
}
+ /* get time of receipt as close to the real time as possible */
+ gettimeofday(&current_time,&tz);
+
n=icp->icmp_seq;
h=table[n];
- gettimeofday(&current_time,&tz);
bcopy(&icp->icmp_data[0],&sent_time,sizeof(sent_time));
bcopy(&icp->icmp_data[SIZE_LAST_TIME],&the_index, sizeof(the_index));
this_reply = timeval_diff(&current_time,&sent_time);
@@ -594,7 +600,7 @@
if (dns_flag) printf("%s",get_host_by_address(response_addr.sin_addr));
else printf("%s",h->host);
if (verbose_flag) printf(" is alive");
- if (elapsed_flag) printf(" (%d msec)",this_reply);
+ if (elapsed_flag) printf(" (%.3f msec)",this_reply/1000.0);
printf("\n");
}
num_alive++;
@@ -756,7 +762,7 @@
temp =
(((a->tv_sec*1000000)+ a->tv_usec) -
- ((b->tv_sec*1000000)+ b->tv_usec))/1000;
+ ((b->tv_sec*1000000)+ b->tv_usec));
return (long) temp;

View File

@ -0,0 +1,54 @@
# $OpenBSD: patch-fping-man,v 1.1.1.1 2000/03/24 11:02:35 form Exp $
--- fping.man.orig Sat Jan 22 15:46:58 2000
+++ fping.man Sat Jan 22 15:47:38 2000
@@ -1,4 +1,4 @@
-.TH fping l
+.TH fping 8
.SH NAME
fping \- send ICMP ECHO_REQUEST packets to network hosts
.SH SYNOPSIS
@@ -45,7 +45,7 @@
.IP \fB-f\fR 5
Read list of system from a file.
.IP \fB-i\fIn\fR 5
-The minimum amount of time (in milliseconds) between sending a ping packet to any host (default is 25).
+The minimum amount of time (in microseconds) between sending a ping packet to any host (default is 25).
.IP \fB-q\fR 5
Quiet. Don't show per host results, just set final exit status.
.IP \fB-r\fIn\fR 5
@@ -54,8 +54,8 @@
.IP \fB-s\fR 5
Dump final statistics.
.IP \fB-t\fIn\fR 5
-Individual host timeout in milliseconds (default 2500). This is the
-minimum number of milliseconds between ping packets directed towards a given
+Individual host timeout in microseconds (default 2500). This is the
+minimum number of microseconds between ping packets directed towards a given
host.
.IP \fB-u\fR 5
Show systems that are unreachable.
@@ -70,12 +70,12 @@
example none the less.
.nf
-#!/usr/local/bin/perl
+#!/usr/bin/perl
require 'open2.pl';
$MAILTO = "root";
-$pid = &open2("OUTPUT","INPUT","/usr/local/bin/fping -u");
+$pid = &open2("OUTPUT","INPUT","/usr/local/sbin/fping -u");
@check=("slapshot","foo","foobar");
@@ -96,7 +96,7 @@
that are currently reachable.
.nf
-#!/usr/local/bin/perl
+#!/usr/bin/perl
$hosts_to_backup = `cat /etc/hosts.backup | fping -a`;

1
net/fping/pkg/COMMENT Normal file
View File

@ -0,0 +1 @@
quickly ping N hosts w/o flooding the network

14
net/fping/pkg/DESCR Normal file
View File

@ -0,0 +1,14 @@
A tool to quickly ping N number of hosts to determine their reachability
without flooding the network.
fping is different from ping in that you can specify any number of
hosts on the command line, or specify a file containing the lists
of hosts to ping. Instead of trying one host until it timeouts or
replies, fping will send out a ping packet and move on to the next
host in a round-robin fashion. If a host replies, it is noted and
removed from the list of hosts to check. If a host does not respond
within a certain time limit and/or retry limit it will be considered
unreachable.
Unlike ping, fping is meant to be used in scripts and its
output is easy to parse.

5
net/fping/pkg/PLIST Normal file
View File

@ -0,0 +1,5 @@
man/man8/fping.8
sbin/fping
share/doc/fping/README
share/doc/fping/README.VMS
@dirrm share/doc/fping