Compare commits

93 Commits
Author SHA1 Message Date
David Schweikert 0f36dddffd really release 3.10 2014-05-04 22:32:14 +02:00
David Schweikert e042466b9a Release 3.10 2014-05-04 22:25:15 +02:00
David Schweikert 3aed2604bb prepare v3.10 2014-05-04 22:25:06 +02:00
David Schweikert 609f4f17c4 Better document -B backoff-factor and when it can be used (#33, Oleksiy Zagorskyi), fixes #33 2014-05-04 22:22:53 +02:00
David Schweikert 4d6861c2c3 more tests 2014-05-04 22:09:48 +02:00
David Schweikert 314b8debd9 more tests 2014-05-04 22:04:10 +02:00
David Schweikert fe12f0dbab more tests 2014-05-04 21:54:59 +02:00
David Schweikert a07e244a57 more tests 2014-05-04 21:41:31 +02:00
David Schweikert 7b8899043d more tests 2014-05-04 21:36:37 +02:00
David Schweikert c4c3068bbb more tests 2014-05-04 21:22:28 +02:00
David Schweikert 2b5d9ef795 remove support for NIS groups, do not retry twice DNS lookup on DNS lookup problem 2014-05-04 21:16:11 +02:00
David Schweikert e79444f09a more tests 2014-05-03 00:06:07 +02:00
David Schweikert b779e14db6 test fix 2014-05-02 23:51:49 +02:00
David Schweikert 3aa530c2ff more tests 2014-05-02 23:41:54 +02:00
David Schweikert c9f276b3cd more tests 2014-05-02 23:39:39 +02:00
David Schweikert 1d576326ba more tests 2014-05-02 23:26:16 +02:00
David Schweikert f35f4a8cc4 more tests 2014-05-02 23:19:09 +02:00
David Schweikert 75101dd843 more tests 2014-05-02 23:10:46 +02:00
David Schweikert c1fe95f7b7 more tests 2014-05-02 23:02:01 +02:00
David Schweikert bdca2c4b07 test fixes 2014-05-02 14:43:42 +02:00
David Schweikert ea026f3ba4 test fixes 2014-05-02 14:37:20 +02:00
David Schweikert 3ec68c8a3f test fixes 2014-05-01 15:22:21 +02:00
David Schweikert 9a5c6589b2 re-order options in usage information 2014-05-01 15:21:45 +02:00
David Schweikert a7f351fb8e re-order options in usage information 2014-05-01 15:21:35 +02:00
David Schweikert 51cc41a2c1 more tests 2014-05-01 15:16:34 +02:00
David Schweikert d35f7072b5 more tests 2014-05-01 15:03:33 +02:00
David Schweikert ab006a5113 more tests 2014-04-30 22:56:21 +02:00
David Schweikert c524813889 Add test for -f option 2014-04-28 19:28:29 +02:00
David Schweikert 86f0b1e380 Allow option '-f' also for non-root (since setuid privileges are dropped) 2014-04-28 19:24:36 +02:00
David Schweikert d4e0a6c89b build all branches with travis-ci 2014-04-04 22:29:33 +02:00
David Schweikert 3cf9a8a3cd Fix confusing error message with -g and IPv6 addresses (fixes #58) 2014-04-04 22:23:32 +02:00
David Schweikert f65d335ecf More tests 2014-04-04 22:22:48 +02:00
David Schweikert c6f37022a4 Release 3.9 2014-03-08 21:01:59 +01:00
David Schweikert c786c34334 more tests 2014-03-07 16:02:52 +01:00
David Schweikert cd21d0bb91 more tests 2014-03-07 15:57:47 +01:00
David Schweikert b359c0e7a3 force travis rebuild 2014-03-07 09:42:19 +01:00
David Schweikert 9d71f4e809 more tests 2014-03-06 22:50:58 +01:00
David Schweikert af0446b046 more tests 2014-03-06 22:43:35 +01:00
David Schweikert 930af0fc54 fix typo in ChangeLog 2014-03-05 16:23:53 +01:00
David Schweikert 00e3384d5c Fix complication problem on FreeBSD (#57) 2014-03-05 16:12:26 +01:00
David Schweikert 6fa8c4c175 add test for issue #56 2014-03-05 10:09:45 +01:00
David Schweikert 8cda80898e add test for issue #56 2014-03-05 09:59:34 +01:00
David Schweikert 56c431df13 add travis-ci / coveralls to ChangeLog 2014-03-05 09:50:05 +01:00
David Schweikert def79d3590 fix coveralls.io 2014-03-05 09:38:27 +01:00
David Schweikert 0990bf1c61 travis-ci tuning 2014-03-05 09:02:31 +01:00
David Schweikert a6721ac2d2 travis-ci tuning 2014-03-05 08:56:26 +01:00
David Schweikert 49f24acda6 travis-ci tuning 2014-03-05 08:54:31 +01:00
David Schweikert 37158fe9fe travis-ci tuning 2014-03-05 08:40:39 +01:00
David Schweikert 86ecd82263 travis-ci tuning 2014-03-05 08:38:05 +01:00
David Schweikert 382ab64e5c fix travis 2014-03-05 08:23:10 +01:00
David Schweikert 3f37397c58 fix travis 2014-03-05 08:19:54 +01:00
David Schweikert 8bd200905d some more tests 2014-03-05 08:16:35 +01:00
David Schweikert 91130ebd28 coveralls.io 2014-03-05 00:05:14 +01:00
David Schweikert 358ac75c21 coveralls.io 2014-03-04 23:59:40 +01:00
David Schweikert c5e7e911b0 coveralls.io 2014-03-04 23:52:45 +01:00
David Schweikert e2705a01c1 coveralls.io 2014-03-04 23:39:40 +01:00
David Schweikert d9506b335f coveralls.io 2014-03-04 23:38:25 +01:00
David Schweikert 782524e489 coveralls.io 2014-03-04 23:37:41 +01:00
David Schweikert 956b851d47 fix setcap 2014-03-04 23:11:19 +01:00
David Schweikert e27fd71935 coveralls.io 2014-03-04 23:05:43 +01:00
David Schweikert 4989d94eb7 add coveralls.io 2014-03-04 22:53:49 +01:00
David Schweikert ff44de71b1 add coveralls.io 2014-03-04 22:51:00 +01:00
David Schweikert e7ace04516 travis tuning 2014-03-02 23:45:40 +01:00
David Schweikert 18aa33e13a travis tuning 2014-03-02 23:43:48 +01:00
David Schweikert 71bf72527b travis tuning 2014-03-02 23:42:59 +01:00
David Schweikert e07a6e9dfc travis tuning 2014-03-02 23:39:05 +01:00
David Schweikert 71616ec77e travis tuning 2014-03-02 23:34:08 +01:00
David Schweikert 42574667d6 test bintray deployment 2014-03-02 23:09:26 +01:00
David Schweikert 2604b40743 test bintray deployment 2014-03-02 23:05:31 +01:00
David Schweikert e39e24e933 test bintray deployment 2014-03-02 22:59:04 +01:00
David Schweikert bd768a44f8 test bintray deployment 2014-03-02 22:56:56 +01:00
David Schweikert e9daacdf81 test bintray deployment 2014-03-02 22:50:50 +01:00
David Schweikert 2f9cd95bbd test bintray deployment 2014-03-02 22:35:51 +01:00
David Schweikert 219dbd893d test bintray deployment 2014-03-02 22:31:44 +01:00
David Schweikert 7dd45384e4 test bintray deployment 2014-03-02 22:28:26 +01:00
David Schweikert f9c68a6dc7 travis tuning 2014-03-01 00:00:04 +01:00
David Schweikert 540057dfd9 travis tuning 2014-02-28 23:46:49 +01:00
David Schweikert fdddda1c22 travis tuning 2014-02-28 23:43:52 +01:00
David Schweikert a2ac03c210 travis tuning 2014-02-28 23:36:44 +01:00
David Schweikert 3eccad8ee1 travis tuning 2014-02-28 23:09:06 +01:00
David Schweikert c6d311a7d4 travis tuning 2014-02-28 23:07:59 +01:00
David Schweikert 5851422798 travis tuning 2014-02-28 23:04:04 +01:00
David Schweikert 57595638ec travis tuning 2014-02-28 23:00:10 +01:00
David Schweikert 801051eeec travis tuning 2014-02-28 00:35:09 +01:00
David Schweikert 806ad042b8 travis tuning 2014-02-28 00:30:20 +01:00
David Schweikert 5dc8afb265 travis tuning 2014-02-28 00:28:24 +01:00
David Schweikert f27a89d40d travis tuning 2014-02-28 00:26:32 +01:00
David Schweikert b973451021 initial travis-ci config 2014-02-27 23:26:35 +01:00
David Schweikert 63c73e0697 the next release should be 3.9-rc1 2014-02-27 23:06:51 +01:00
David Schweikert 5dd8c5de50 release 3.8-rc1 2014-02-27 23:00:53 +01:00
David Schweikert 0decb829d8 silence clang warning 2014-02-27 23:00:28 +01:00
David Schweikert 3e8eb6c613 Fix random output on socket error (reported by Aleksandrs Saveljevs, #56) 2014-02-27 22:56:17 +01:00
David Schweikert 85abf34b0a Clarify COPYING 2013-12-18 10:35:45 +01:00
31 changed files with 871 additions and 122 deletions
+5
View File
@@ -1,11 +1,15 @@
.*.swp
*.tar.gz
*~
src/*.gcno
src/*.gcda
src/*.gcov
.deps
Makefile
Makefile.in
aclocal.m4
autom4te.cache
compile
config.guess
config.h
config.h.in
@@ -22,3 +26,4 @@ src/fping6
stamp-h1
doc/fping.8
doc/fping6.8
ci/build
+20
View File
@@ -0,0 +1,20 @@
# travis-ci.org configuration
language: c
env:
global:
- secure: "CoI8hwHH1yfQoQxIfWGRS0WfTyScox+5aJn0fDDgz2uKrrIxmBvIw/WKX8wcSiV6fLmLuwgNkKqSM3hdO4qaG+JxfWcuEiZZHm+kxSGMkWbGb/fvAI+gHg8ldKyYttcIX71O5rlZiC2QpNKQi2v18S6pI5p8eqnx7DYx4YrmguQ="
compiler:
- gcc
before_install:
- sudo apt-get install libcap2-bin
install:
- ci/build-1-autotools.sh
- curl -L http://cpanmin.us | perl - --sudo App::cpanminus
- cpanm --sudo Test::Command
script:
- ci/build-2-install.sh
- env PATH=`pwd`/src:$PATH prove ci/test-*.pl
- ci/test-tarball.sh
after_success:
- ci/coveralls.sh
- ci/deploy-bintray.sh
+6 -4
View File
@@ -1,5 +1,9 @@
/*
* Original author: Roland Schemers <schemers@stanford.edu>
* IPv6 Support: Jeroen Massar <jeroen@unfix.org / jeroen@ipng.nl>
* Improved main loop: David Schweikert <david@schweikert.ch>
* Debian Merge, TOS settings: Tobi Oetiker <tobi@oetiker.ch>
* Bugfixes, byte order & senseful seq.-numbers: Stephan Fuhrmann (stephan.fuhrmann AT 1und1.de)
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
@@ -11,5 +15,3 @@
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
+18
View File
@@ -1,3 +1,21 @@
2014-05-03 David Schweikert <david@schweikert.ch>
* Version 3.10
* Fix confusing error message with -g and IPv6 addresses (#58, reported by Axel Beckert)
* Allow option '-f' also for non-root (since setuid privileges are dropped)
* Do not retry twice DNS lookup on DNS lookup problem
* Remove support for NIS groups
* Better document -B backoff-factor and when it can be used (#33, Oleksiy Zagorskyi)
* More tests added
2014-03-08 David Schweikert <david@schweikert.ch>
* Version 3.9
* Fix random output on socket error (reported by Aleksandrs Saveljevs, #56)
* Support ppc64le architecture by including alpha libtool version
(reported by Amit Kumar Gupta and Aravinda B Thunug)
* Fix compilation problem on FreeBSD (#57)
* Initial test suite and continous intergration (with travis-ci.org / coveralls.io)
* Don't output usage information on error
2013-11-08 David Schweikert <david@schweikert.ch>
* Version 3.8
* Fix segmentation fault introduced in version 3.7 with loop mode (reported
+3
View File
@@ -19,3 +19,6 @@ rm -f stamp-h1
rm -f doc/Makefile.in
rm -f src/Makefile.in
rm -f doc/fping.8
rm -f src/*.gcda
rm -f src/*.gcno
rm -f src/*.gcov
+54
View File
@@ -0,0 +1,54 @@
#!/bin/bash -e
AUTOCONF=http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
AUTOMAKE=http://ftp.gnu.org/gnu/automake/automake-1.14.1.tar.gz
LIBTOOL=http://alpha.gnu.org/gnu/libtool/libtool-2.4.2.418.tar.gz
PREFIX=$(pwd)/ci/build
PATH=$(pwd)/ci/build/bin:$PATH
if [ ! -d ci ]; then
echo "you must run this in the root fping directory" >&2
exit 1
fi
# remove standard versions
sudo apt-get remove -qq autoconf automake autotools-dev libtool
# prepare build environment
cd ci
rm -rf build
mkdir -p build/src
cd build/src
# autoconf
(
AUTOCONF_FILE=$(basename $AUTOCONF)
AUTOCONF_DIR=$(echo $AUTOCONF_FILE | sed -e 's/\.tar.*//')
wget $AUTOCONF
tar xf $AUTOCONF_FILE
cd $AUTOCONF_DIR
./configure --prefix=$PREFIX
make install
)
# automake
(
AUTOMAKE_FILE=$(basename $AUTOMAKE)
AUTOMAKE_DIR=$(echo $AUTOMAKE_FILE | sed -e 's/\.tar.*//')
wget $AUTOMAKE
tar xf $AUTOMAKE_FILE
cd $AUTOMAKE_DIR
./configure --prefix=$PREFIX
make install
)
# libtool
(
LIBTOOL_FILE=$(basename $LIBTOOL)
LIBTOOL_DIR=$(echo $LIBTOOL_FILE | sed -e 's/\.tar.*//')
wget $LIBTOOL
tar xf $LIBTOOL_FILE
cd $LIBTOOL_DIR
./configure --prefix=$PREFIX
make install
)
+14
View File
@@ -0,0 +1,14 @@
#!/bin/bash -e
PATH=$(pwd)/ci/build/bin:$PATH
if [ ! -d ci ]; then
echo "you must run this in the root fping directory" >&2
exit 1
fi
autoreconf -i
./configure --enable-ipv4 --enable-ipv6 --prefix=/opt/fping
make CFLAGS="-g -fprofile-arcs -ftest-coverage"
sudo setcap cap_net_raw+ep src/fping
sudo setcap cap_net_raw+ep src/fping6
+13
View File
@@ -0,0 +1,13 @@
#!/bin/sh
set -x
sudo pip install cpp-coveralls --use-mirrors
cd src
ls -l
gcov *.o
cd ..
coveralls --exclude ci --no-gcov
+26
View File
@@ -0,0 +1,26 @@
#!/bin/bash
# upload to bintray.com/schweikert
set -e
# do this only for the gcc run
if [ "$CC" != "gcc" ]; then
echo "skipped upload because $CC != gcc"
exit 0
fi
# do this only for the master branch
if [ "$TRAVIS_BRANCH" != "master" ]; then
echo "skipped upload branch $TRAVIS_BRANCH isn't master"
exit 0
fi
VERSION=$(ls fping-*.tar.gz | sed -e 's/^fping-//' | sed -e 's/\.tar\.gz$//')
if [[ "$VERSION" =~ ^[0-9]+\.[0-9]+$ ]]; then
REPO=release
else
REPO=beta
fi
curl -T fping-$VERSION.tar.gz -uschweikert:$BINTRAY_API_KEY https://api.bintray.com/content/schweikert/$REPO/fping/$VERSION/fping-$VERSION.tar.gz
echo
+24
View File
@@ -0,0 +1,24 @@
#!/usr/bin/perl -w
use Test::Command tests => 9;
# ping 127.0.0.1
my $cmd1 = Test::Command->new(cmd => "fping 127.0.0.1");
$cmd1->exit_is_num(0);
$cmd1->stdout_is_eq("127.0.0.1 is alive\n");
$cmd1->stderr_is_eq("");
# ping ::1
my $cmd2 = Test::Command->new(cmd => "fping6 ::1");
$cmd2->exit_is_num(0);
$cmd2->stdout_is_eq("::1 is alive\n");
$cmd2->stderr_is_eq("");
# ping 3 times 127.0.0.1
my $cmd3 = Test::Command->new(cmd => "fping -p 100 -C3 127.0.0.1");
$cmd3->exit_is_num(0);
$cmd3->stdout_like(qr{127\.0\.0\.1 : \[0\], 84 bytes, 0\.\d+ ms \(0\.\d+ avg, 0% loss\)
127\.0\.0\.1 : \[1\], 84 bytes, 0\.\d+ ms \(0.\d+ avg, 0% loss\)
127\.0\.0\.1 : \[2\], 84 bytes, 0\.\d+ ms \(0.\d+ avg, 0% loss\)
});
$cmd3->stderr_like(qr{127\.0\.0\.1 : 0\.\d+ 0\.\d+ 0\.\d+\n});
+24
View File
@@ -0,0 +1,24 @@
#!/usr/bin/perl -w
use Test::Command tests => 6;
# -u show targets that are unreachable
# -v show version
# fping -u
{
my $cmd = Test::Command->new(cmd => "fping -r0 -u 8.8.0.0 127.0.0.1");
$cmd->exit_is_num(1);
$cmd->stdout_is_eq("8.8.0.0\n");
$cmd->stderr_is_eq("");
}
# fping -v
{
my $cmd = Test::Command->new(cmd => "fping -v");
$cmd->exit_is_num(0);
$cmd->stdout_like(qr{ping: Version 3\.\d+
fping: comments to david\@schweikert\.ch
});
$cmd->stderr_is_eq("");
}
+25
View File
@@ -0,0 +1,25 @@
#!/usr/bin/perl -w
use Test::Command tests => 6;
# run without privileges
my $fping_bin = `which fping`; chomp $fping_bin;
my $fping6_bin = `which fping6`; chomp $fping6_bin;
system("cp $fping_bin /tmp/fping.copy; chmod +x /tmp/fping.copy");
system("cp $fping6_bin /tmp/fping6.copy; chmod +x /tmp/fping6.copy");
# fping
{
my $cmd = Test::Command->new(cmd => "/tmp/fping.copy 127.0.0.1");
$cmd->exit_is_num(4);
$cmd->stdout_is_eq("");
$cmd->stderr_like(qr{\(null\): can't create socket \(must run as root\?\) : .*\n});
}
# fping6
{
my $cmd = Test::Command->new(cmd => "/tmp/fping6.copy ::1");
$cmd->exit_is_num(4);
$cmd->stdout_is_eq("");
$cmd->stderr_like(qr{\(null\): can't create raw socket \(must run as root\?\) : .*\n});
}
+10
View File
@@ -0,0 +1,10 @@
#!/usr/bin/perl -w
use Test::Command tests => 36;
for my $arg (qw(i b B c C H i O p Q r t)) {
my $cmd = Test::Command->new(cmd => "fping -$arg xxx");
$cmd->exit_is_num(1);
$cmd->stdout_is_eq("");
$cmd->stderr_like(qr{Usage:});
}
+19
View File
@@ -0,0 +1,19 @@
#!/usr/bin/perl -w
use Test::Command tests => 6;
# fping
{
my $cmd = Test::Command->new(cmd => "fping nosuchname.example.com");
$cmd->exit_is_num(1);
$cmd->stdout_is_eq("");
$cmd->stderr_is_eq("nosuchname.example.com address not found\n");
}
# fping6
{
my $cmd = Test::Command->new(cmd => "fping6 nosuchname.example.com");
$cmd->exit_is_num(1);
$cmd->stdout_is_eq("");
$cmd->stderr_is_eq("nosuchname.example.com: Name or service not known\n");
}
+17
View File
@@ -0,0 +1,17 @@
#!/usr/bin/perl -w
use Test::Command tests => 3;
my $re_num = qr{\d+(?:\.\d+)?};
# fping
{
my $cmd = Test::Command->new(cmd => "fping -q -i 10 -p 20 -c 3 -t200 8.8.8.8 4.2.2.5 www.france-telecom.fr www.google.com");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("");
$cmd->stderr_like(qr{8\.8\.8\.8\s*: xmt/rcv/%loss = [123]/3/\d+%, min/avg/max = $re_num/$re_num/$re_num
4\.2\.2\.5\s*: xmt/rcv/%loss = [123]/3/\d+%, min/avg/max = $re_num/$re_num/$re_num
www\.france-telecom\.fr\s*: xmt/rcv/%loss = [123]/3/\d+%, min/avg/max = $re_num/$re_num/$re_num
www\.google\.com\s*: xmt/rcv/%loss = [123]/3/\d+%, min/avg/max = $re_num/$re_num/$re_num
});
}
+58
View File
@@ -0,0 +1,58 @@
#!/usr/bin/perl -w
use Test::Command tests => 9;
# fping -h
my $cmd1 = Test::Command->new(cmd => "fping -h");
$cmd1->exit_is_num(0);
$cmd1->stdout_is_eq(<<END);
Usage: fping [options] [targets...]
-a show targets that are alive
-A show targets by address
-b n amount of ping data to send, in bytes (default 56)
-B f set exponential backoff factor to f
-c n count of pings to send to each target (default 1)
-C n same as -c, report results in verbose format
-D print timestamp before each output line
-e show elapsed time on return packets
-f file read list of targets from a file ( - means stdin) (only if no -g specified)
-g generate target list (only if no -f specified)
(specify the start and end IP in the target list, or supply a IP netmask)
(ex. fping -g 192.168.1.0 192.168.1.255 or fping -g 192.168.1.0/24)
-H n Set the IP TTL value (Time To Live hops)
-i n interval between sending ping packets (in millisec) (default 25)
-I if bind to a particular interface
-l loop sending pings forever
-m ping multiple interfaces on target host
-n show targets by name (-d is equivalent)
-O n set the type of service (tos) flag on the ICMP packets
-p n interval between ping packets to one target (in millisec)
(in looping and counting modes, default 1000)
-q quiet (don't show per-target/per-ping results)
-Q n same as -q, but show summary every n seconds
-r n number of retries (default 3)
-s print final stats
-S addr set source address
-t n individual target initial timeout (in millisec) (default 500)
-T n ignored (for compatibility with fping 2.4)
-u show targets that are unreachable
-v show version
targets list of targets to check (if no -f specified)
END
$cmd1->stderr_is_eq("");
# fping -v
my $cmd2 = Test::Command->new(cmd => "fping -v");
$cmd2->exit_is_num(0);
$cmd2->stdout_like(qr{fping: Version \S+
fping: comments to david\@schweikert\.ch\n});
$cmd2->stderr_is_eq("");
# fping with unknown option
my $cmd3 = Test::Command->new(cmd => "fping -Z");
$cmd3->exit_is_num(1);
$cmd3->stdout_is_eq("");
$cmd3->stderr_is_eq("fping: invalid option -- 'Z'
see 'fping -h' for usage information\n");
+82
View File
@@ -0,0 +1,82 @@
#!/usr/bin/perl -w
use Test::Command tests => 33;
# fping -i 9
my $cmd1 = Test::Command->new(cmd => "fping -i 9 -T10 -g 127.0.0.1/29");
$cmd1->exit_is_num(1);
$cmd1->stdout_is_eq("");
$cmd1->stderr_is_eq(<<END);
fping: these options are too risky for mere mortals.
fping: You need i >= 10, p >= 20, r < 20, and t >= 50
END
# fping -p 15
my $cmd2 = Test::Command->new(cmd => "fping -c3 -p 15 127.0.0.1");
$cmd2->exit_is_num(1);
$cmd2->stdout_is_eq("");
$cmd2->stderr_is_eq(<<END);
fping: these options are too risky for mere mortals.
fping: You need i >= 10, p >= 20, r < 20, and t >= 50
END
# fping -r 30
my $cmd3 = Test::Command->new(cmd => "fping -r 30 127.0.0.1");
$cmd3->exit_is_num(1);
$cmd3->stdout_is_eq("");
$cmd3->stderr_is_eq(<<END);
fping: these options are too risky for mere mortals.
fping: You need i >= 10, p >= 20, r < 20, and t >= 50
END
# fping -t 40
my $cmd4 = Test::Command->new(cmd => "fping -t 40 127.0.0.1");
$cmd4->exit_is_num(1);
$cmd4->stdout_is_eq("");
$cmd4->stderr_is_eq(<<END);
fping: these options are too risky for mere mortals.
fping: You need i >= 10, p >= 20, r < 20, and t >= 50
END
# fping -H 300
my $cmd5 = Test::Command->new(cmd => "fping -H 300 127.0.0.1");
$cmd5->exit_is_num(1);
$cmd5->stdout_is_eq("");
$cmd5->stderr_is_eq("ttl 300 out of range\n");
# fping -a -u
my $cmd6 = Test::Command->new(cmd => "fping -a -u 127.0.0.1");
$cmd6->exit_is_num(1);
$cmd6->stdout_is_eq("");
$cmd6->stderr_is_eq("fping: specify only one of a, u\n");
# fping -c -l
my $cmd7 = Test::Command->new(cmd => "fping -c3 -l 127.0.0.1");
$cmd7->exit_is_num(1);
$cmd7->stdout_is_eq("");
$cmd7->stderr_is_eq("fping: specify only one of c, l\n");
# fping -b 65509
my $cmd8 = Test::Command->new(cmd => "fping -b 65509 127.0.0.1");
$cmd8->exit_is_num(1);
$cmd8->stdout_is_eq("");
$cmd8->stderr_is_eq("fping: data size 65509 not valid, must be between 0 and 65508\n");
# fping -B 0.9
my $cmd9 = Test::Command->new(cmd => "fping -B 0.9 127.0.0.1");
$cmd9->exit_is_num(1);
$cmd9->stdout_is_eq("");
$cmd9->stderr_is_eq("fping: backoff factor 0.9 not valid, must be between 1.0 and 5.0\n");
# fping -B 0.9
my $cmd10 = Test::Command->new(cmd => "fping -B 5.1 127.0.0.1");
$cmd10->exit_is_num(1);
$cmd10->stdout_is_eq("");
$cmd10->stderr_is_eq("fping: backoff factor 5.1 not valid, must be between 1.0 and 5.0\n");
# fping -C 11000
my $cmd11 = Test::Command->new(cmd => "fping -C 11000 127.0.0.1");
$cmd11->exit_is_num(1);
$cmd11->stdout_is_eq("");
$cmd11->stderr_is_eq("fping: count 11000 not valid, must be less than 10000\n");
+63
View File
@@ -0,0 +1,63 @@
#!/usr/bin/perl -w
use Test::Command tests => 20;
use Test::More;
use Time::HiRes qw(gettimeofday tv_interval);
# -a show targets that are alive
# -A show targets by address
# -b n amount of ping data to send, in bytes (default 56)
# -B f set exponential backoff factor to f
# fping -a
{
my $cmd = Test::Command->new(cmd => "fping -a 127.0.0.1 127.0.0.2");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("127.0.0.1\n127.0.0.2\n");
$cmd->stderr_is_eq("");
}
# fping -A
{
my $cmd = Test::Command->new(cmd => "fping -A localhost");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("127.0.0.1 is alive\n");
$cmd->stderr_is_eq("");
}
# fping -A -n
{
my $cmd = Test::Command->new(cmd => "fping -A -n localhost");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("localhost (127.0.0.1) is alive\n");
$cmd->stderr_is_eq("");
}
# fping6 -A -n
{
my $cmd = Test::Command->new(cmd => "fping6 -n -A 2001:4860:4860::8888");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("google-public-dns-a.google.com (2001:4860:4860::8888) is alive\n");
$cmd->stderr_is_eq("");
}
# fping -b
{
my $cmd = Test::Command->new(cmd => "fping -b 1000 127.0.0.1");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("127.0.0.1 is alive\n");
$cmd->stderr_is_eq("");
}
# fping -B
{
my $t0 = [gettimeofday];
my $cmd = Test::Command->new(cmd => "fping -t 100 -r 3 -B 2 8.8.8.7");
$cmd->exit_is_num(1);
$cmd->stdout_is_eq("8.8.8.7 is unreachable\n");
$cmd->stderr_is_eq("");
my $elapsed = tv_interval($t0);
# 0.1 + 0.2 + 0.4 + 0.8 = 1.5
cmp_ok($elapsed, '>=', 1.5);
cmp_ok($elapsed, '<', 1.7);
}
+60
View File
@@ -0,0 +1,60 @@
#!/usr/bin/perl -w
use Test::Command tests => 12;
# -c n count of pings to send to each target (default 1)
# -C n same as -c, report results in verbose format
# -D print timestamp before each output line
# -e show elapsed time on return packets
# fping -c n
{
my $cmd = Test::Command->new(cmd => "fping -c 2 -p 100 localhost 127.0.0.1");
$cmd->exit_is_num(0);
$cmd->stdout_like(qr{localhost : \[0\], 84 bytes, 0\.\d+ ms \(0\.\d+ avg, 0% loss\)
127\.0\.0\.1 : \[0\], 84 bytes, 0\.\d+ ms \(0.\d+ avg, 0% loss\)
localhost : \[1\], 84 bytes, 0\.\d+ ms \(0\.\d+ avg, 0% loss\)
127\.0\.0\.1 : \[1\], 84 bytes, 0\.\d+ ms \(0\.\d+ avg, 0% loss\)
});
$cmd->stderr_like(qr{localhost : xmt/rcv/%loss = 2/2/0%, min/avg/max = 0\.\d+/0\.\d+/0\.\d+
127\.0\.0\.1 : xmt/rcv/%loss = 2/2/0%, min/avg/max = 0\.\d+/0\.\d+/0\.\d+
});
}
# fping -C n
{
my $cmd = Test::Command->new(cmd => "fping -C 2 -p 100 localhost 127.0.0.1");
$cmd->exit_is_num(0);
$cmd->stdout_like(qr{localhost : \[0\], 84 bytes, 0\.\d+ ms \(0\.\d+ avg, 0% loss\)
127\.0\.0\.1 : \[0\], 84 bytes, 0\.\d+ ms \(0.\d+ avg, 0% loss\)
localhost : \[1\], 84 bytes, 0\.\d+ ms \(0\.\d+ avg, 0% loss\)
127\.0\.0\.1 : \[1\], 84 bytes, 0\.\d+ ms \(0\.\d+ avg, 0% loss\)
});
$cmd->stderr_like(qr{localhost : 0\.\d+ 0\.\d+
127\.0\.0\.1 : 0\.\d+ 0\.\d+
});
}
# fping -D
{
my $cmd = Test::Command->new(cmd => "fping -D -c 2 -p 100 127.0.0.1");
$cmd->exit_is_num(0);
$cmd->stdout_like(qr{\[\d{10}\.\d+\] 127\.0\.0\.1 : \[0\], 84 bytes, 0\.\d+ ms \(0.\d+ avg, 0% loss\)
\[\d{10}\.\d+\] 127\.0\.0\.1 : \[1\], 84 bytes, 0\.\d+ ms \(0\.\d+ avg, 0% loss\)
});
$cmd->stderr_like(qr{127\.0\.0\.1 : xmt/rcv/%loss = 2/2/0%, min/avg/max = 0\.\d+/0\.\d+/0\.\d+
});
}
# fping -e
{
my $cmd = Test::Command->new(cmd => "fping -e 127.0.0.1");
$cmd->exit_is_num(0);
$cmd->stdout_like(qr{127\.0\.0\.1 is alive \(0\.\d+ ms\)
});
$cmd->stderr_is_eq("");
}
+62
View File
@@ -0,0 +1,62 @@
#!/usr/bin/perl -w
use Test::Command tests => 18;
use File::Temp;
# -f file read list of targets from a file ( - means stdin) (only if no -g specified)
# -g generate target list (only if no -f specified)
# (specify the start and end IP in the target list, or supply a IP netmask)
# (ex. ../src/fping -g 192.168.1.0 192.168.1.255 or ../src/fping -g 192.168.1.0/24)
# -H n Set the IP TTL value (Time To Live hops)
my $tmpfile = File::Temp->new();
print $tmpfile "127.0.0.1\n127.0.0.2\n";
close($tmpfile);
# fping without option (-> equivalent to 'fping -f -')
{
my $cmd = Test::Command->new(cmd => "cat ".$tmpfile->filename." | fping");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("127.0.0.1 is alive\n127.0.0.2 is alive\n");
$cmd->stderr_is_eq("");
}
# fping -f -
{
my $cmd = Test::Command->new(cmd => "cat ".$tmpfile->filename." | fping -f -");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("127.0.0.1 is alive\n127.0.0.2 is alive\n");
$cmd->stderr_is_eq("");
}
# fping -f file
{
my $cmd = Test::Command->new(cmd => "fping -f ".$tmpfile->filename);
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("127.0.0.1 is alive\n127.0.0.2 is alive\n");
$cmd->stderr_is_eq("");
}
# fping -g (range)
{
my $cmd = Test::Command->new(cmd => "fping -g 127.0.0.1 127.0.0.5");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("127.0.0.1 is alive\n127.0.0.2 is alive\n127.0.0.3 is alive\n127.0.0.4 is alive\n127.0.0.5 is alive\n");
$cmd->stderr_is_eq("");
}
# fping -g (cidr)
{
my $cmd = Test::Command->new(cmd => "fping -g 127.0.0.1/30");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("127.0.0.1 is alive\n127.0.0.2 is alive\n");
$cmd->stderr_is_eq("");
}
# fping -H
{
my $cmd = Test::Command->new(cmd => "fping -H 1 127.0.0.1");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("127.0.0.1 is alive\n");
$cmd->stderr_is_eq("");
}
+31
View File
@@ -0,0 +1,31 @@
#!/usr/bin/perl -w
use Test::Command tests => 7;
# -i n interval between sending ping packets (in millisec) (default 25)
# -l loop sending pings forever
# -m ping multiple interfaces on target host
# fping -i n
{
my $cmd = Test::Command->new(cmd => "fping -i 100 127.0.0.1 127.0.0.2");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("127.0.0.1 is alive\n127.0.0.2 is alive\n");
$cmd->stderr_is_eq("");
}
# fping -l
{
my $cmd = Test::Command->new(cmd => '(sleep 2; pkill fping)& fping -p 900 -l 127.0.0.1');
$cmd->stdout_like(qr{127\.0\.0\.1 : \[0\], 84 bytes, 0\.\d+ ms \(0.\d+ avg, 0% loss\)
127\.0\.0\.1 : \[1\], 84 bytes, 0\.\d+ ms \(0\.\d+ avg, 0% loss\)
});
}
# fping -m
{
my $cmd = Test::Command->new(cmd => "fping -m google-public-dns-a.google.com");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("google-public-dns-a.google.com is alive\n");
$cmd->stderr_is_eq("");
}
+48
View File
@@ -0,0 +1,48 @@
#!/usr/bin/perl -w
use Test::Command tests => 12;
# -n show targets by name (-d is equivalent)
# -O n set the type of service (tos) flag on the ICMP packets
# -p n interval between ping packets to one target (in millisec)
# (in looping and counting modes, default 1000)
# -q quiet (don't show per-target/per-ping results)
# -Q n same as -q, but show summary every n seconds
# fping -n
{
my $cmd = Test::Command->new(cmd => "fping -n 8.8.8.8");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("google-public-dns-a.google.com is alive\n");
$cmd->stderr_is_eq("");
}
# fping -O
{
my $cmd = Test::Command->new(cmd => "fping -O 2 127.0.0.1");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("127.0.0.1 is alive\n");
$cmd->stderr_is_eq("");
}
# fping -q
{
my $cmd = Test::Command->new(cmd => "fping -q -p 100 -c 3 127.0.0.1");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("");
$cmd->stderr_like(qr{127\.0\.0\.1 : xmt/rcv/%loss = 3/3/0%, min/avg/max = 0\.\d+/0\.\d+/0\.\d+
});
}
# fping -Q
{
my $cmd = Test::Command->new(cmd => "fping -Q 1 -p 400 -c 4 127.0.0.1");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("");
$cmd->stderr_like(qr{\[\d+:\d+:\d+\]
127\.0\.0\.1 : xmt/rcv/%loss = 3/3/0%, min/avg/max = 0\.\d+/0\.\d+/0\.\d+
127\.0\.0\.1 : xmt/rcv/%loss = 4/4/0%, min/avg/max = 0\.\d+/0\.\d+/0\.\d+
});
}
+75
View File
@@ -0,0 +1,75 @@
#!/usr/bin/perl -w
use Test::Command tests => 12;
# -r n number of retries (default 3)
# -s print final stats
# -S addr set source address
# -t n individual target initial timeout (in millisec) (default 500)
# -T n ignored (for compatibility with fping 2.4)
# fping -r tested in test-4-options-a-b.pl
# fping -s
{
my $cmd = Test::Command->new(cmd => "fping -s 127.0.0.1");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("127.0.0.1 is alive\n");
$cmd->stderr_like(qr{\s*
\s*1 targets
\s*1 alive
\s*0 unreachable
\s*0 unknown addresses
\s*
\s*0 timeouts \(waiting for response\)
\s*1 ICMP Echos sent
\s*1 ICMP Echo Replies received
\s*0 other ICMP received
\s*0.\d+ ms \(min round trip time\)
\s*0.\d+ ms \(avg round trip time\)
\s*0.\d+ ms \(max round trip time\)
\s*0.\d+ sec \(elapsed real time\)
});
}
# fping -s (no host reachable)
{
my $cmd = Test::Command->new(cmd => "fping -r0 -t100 -s 8.8.0.0");
$cmd->exit_is_num(1);
$cmd->stdout_is_eq("8.8.0.0 is unreachable\n");
$cmd->stderr_like(qr{\s*
\s*1 targets
\s*0 alive
\s*1 unreachable
\s*0 unknown addresses
\s*
\s*1 timeouts \(waiting for response\)
\s*1 ICMP Echos sent
\s*0 ICMP Echo Replies received
\s*0 other ICMP received
\s*0.\d+ ms \(min round trip time\)
\s*0.\d+ ms \(avg round trip time\)
\s*0.\d+ ms \(max round trip time\)
\s*0.\d+ sec \(elapsed real time\)
});
}
# fping -S
{
my $cmd = Test::Command->new(cmd => "fping -S 127.0.0.1 127.0.0.1");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("127.0.0.1 is alive\n");
$cmd->stderr_is_eq("");
}
# fping6 -S
{
my $cmd = Test::Command->new(cmd => "fping6 -S ::1 ::1");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("::1 is alive\n");
$cmd->stderr_is_eq("");
}
# fping -t tested in test-4-options-a-b.pl
+10
View File
@@ -0,0 +1,10 @@
#!/usr/bin/perl -w
# regression testing for github issue #56
use Test::Command tests => 3;
my $cmd1 = Test::Command->new(cmd => "fping -t100 -p100 -C3 255.255.255.255");
$cmd1->exit_is_num(1);
$cmd1->stdout_is_eq("");
$cmd1->stderr_is_eq("\n255.255.255.255 : - - -\n");
+10
View File
@@ -0,0 +1,10 @@
#!/usr/bin/perl -w
# regression testing for github issue #58
use Test::Command tests => 3;
my $cmd1 = Test::Command->new(cmd => "fping -a -g 2001:db8:120:4161::4/64");
$cmd1->exit_is_num(1);
$cmd1->stdout_is_eq("");
$cmd1->stderr_is_eq("Error: -g works only with IPv4 addresses\n");
+26
View File
@@ -0,0 +1,26 @@
#!/bin/bash
# make sure that the .tar.gz file contains everything necessary
# to build fping
set -e
set -x
make dist
VERSION=$(ls fping-*.tar.gz | sed -e 's/^fping-//' | sed -e 's/\.tar\.gz$//')
if [ -z "$VERSION" ]; then
echo "tar.gz file not found." >&2
exit 1
fi
# unarchive
TMPDIR=$(mktemp -d --tmpdir=ci)
cd $TMPDIR
tar xf ../../fping-$VERSION.tar.gz
DIRNAME=$(ls)
# build
cd $DIRNAME
./configure --enable-ipv4 --enable-ipv6 --prefix=/opt/fping
make
sudo make install
+1 -1
View File
@@ -3,7 +3,7 @@ dnl Process this file with autoconf to produce a configure script.
dnl Minimum Autoconf version required.
AC_PREREQ(2.59)
AC_INIT([fping],[3.7])
AC_INIT([fping],[3.10])
dnl make ipv4 and ipv6 options
AC_ARG_ENABLE([ipv4],
+8 -5
View File
@@ -49,10 +49,11 @@ number.
=item B<-B> I<n>
In the default mode, B<fping> sends several requests to a target before giving
up, waiting longer for a reply on each successive request. This parameter is
the value by which the wait time is multiplied on each successive request; it
must be entered as a floating-point number (x.y). The default is 1.5.
Backoff factor. In the default mode, B<fping> sends several requests to a
target before giving up, waiting longer for a reply on each successive request.
This parameter is the value by which the wait time (B<-t>) is multiplied on each
successive request; it must be entered as a floating-point number (x.y). The
default is 1.5.
=item B<-c> I<n>
@@ -165,7 +166,9 @@ Set the interface (requires SO_BINDTODEVICE support)
Initial target timeout in milliseconds (default 500). In the default mode, this
is the amount of time that B<fping> waits for a response to its first request.
Successive timeouts are multiplied by the backoff factor.
Successive timeouts are multiplied by the backoff factor specified with B<-B>.
Note that this option has no effect looping or counting modes (B<-l>, B<-c>, or
B<-C>).
=item B<-T> I<n>
+58 -109
View File
@@ -136,6 +136,7 @@ extern int h_errno;
/* response time array flags */
#define RESP_WAITING -1
#define RESP_UNUSED -2
#define RESP_ERROR -3
/* debugging flags */
#if defined( DEBUG ) || defined( _DEBUG )
@@ -367,8 +368,9 @@ int main( int argc, char **argv )
s = open_ping_socket();
if(uid = getuid()) {
seteuid( getuid() );
if((uid = getuid())) {
/* drop privileges */
setuid( getuid() );
}
prog = argv[0];
@@ -390,7 +392,8 @@ int main( int argc, char **argv )
break;
case 'r':
retry = ( unsigned int )atoi( optarg );
if (!sscanf(optarg,"%i",&retry))
usage(1);
break;
case 'i':
@@ -421,9 +424,7 @@ int main( int argc, char **argv )
break;
case 'b':
errno = 0;
ping_data_size = (unsigned int) strtol(optarg, (char **)NULL, 10);
if( errno )
if (!sscanf(optarg,"%i",&ping_data_size))
usage(1);
break;
@@ -508,27 +509,8 @@ int main( int argc, char **argv )
exit( 0 );
case 'f':
#ifdef ENABLE_F_OPTION
filename = optarg;
generate_flag = 0;
break;
#else
if( getuid() )
{
printf( "%s: this option can only be used by root.\n", argv[0] );
printf( "%s: fping will read from stdin by default.\n", argv[0] );
exit( 3 );
}/* IF */
else
{
filename = optarg;
generate_flag = 0;
}/* ELSE */
break;
#endif /* ENABLE_F_OPTION */
case 'g':
/* use IP list generation */
@@ -567,9 +549,13 @@ int main( int argc, char **argv )
perror("setting type of service octet IP_TOS");
}
}
else {
usage(1);
}
break;
default:
usage(1);
fprintf(stderr, "see 'fping -h' for usage information\n");
exit(1);
break;
}/* SWITCH */
@@ -578,21 +564,21 @@ int main( int argc, char **argv )
/* validate various option settings */
if (ttl > 255) {
fprintf(stderr, "ping: ttl %u out of range\n", ttl);
usage(1);
fprintf(stderr, "ttl %u out of range\n", ttl);
exit(1);
}
if( unreachable_flag && alive_flag )
{
fprintf( stderr, "%s: specify only one of a, u\n", argv[0] );
usage(1);
exit(1);
}/* IF */
if( count_flag && loop_flag )
{
fprintf( stderr, "%s: specify only one of c, l\n", argv[0] );
usage(1);
exit(1);
}/* IF */
@@ -605,15 +591,14 @@ int main( int argc, char **argv )
fprintf( stderr, "%s: these options are too risky for mere mortals.\n", prog );
fprintf( stderr, "%s: You need i >= %u, p >= %u, r < %u, and t >= %u\n",
prog, MIN_INTERVAL, MIN_PERHOST_INTERVAL, MAX_RETRY, MIN_TIMEOUT );
usage(1);
exit(1);
}/* IF */
if( ( ping_data_size > MAX_PING_DATA ) || ( ping_data_size < MIN_PING_DATA ) )
{
fprintf( stderr, "%s: data size %u not valid, must be between %u and %u\n",
prog, ping_data_size, (unsigned int) MIN_PING_DATA, (unsigned int) MAX_PING_DATA );
usage(1);
exit(1);
}/* IF */
@@ -621,7 +606,7 @@ int main( int argc, char **argv )
{
fprintf( stderr, "%s: backoff factor %.1f not valid, must be between %.1f and %.1f\n",
prog, backoff, MIN_BACKOFF_FACTOR, MAX_BACKOFF_FACTOR );
usage(1);
exit(1);
}/* IF */
@@ -629,7 +614,7 @@ int main( int argc, char **argv )
{
fprintf( stderr, "%s: count %u not valid, must be less than %u\n",
prog, count, MAX_COUNT );
usage(1);
exit(1);
}/* IF */
@@ -793,7 +778,7 @@ int main( int argc, char **argv )
}
if( !num_hosts )
exit( 2 );
exit(1);
if(src_addr_present) {
socket_set_src_addr(s, src_addr);
@@ -879,10 +864,6 @@ void add_cidr(char *addr)
*addr_end = '\0';
mask_str = addr_end + 1;
mask = atoi(mask_str);
if(mask < 1 || mask > 30) {
fprintf(stderr, "Error: netmask must be between 1 and 30 (is: %s)\n", mask_str);
exit(2);
}
/* parse address (IPv4 only) */
memset(&addr_hints, 0, sizeof(struct addrinfo));
@@ -891,14 +872,20 @@ void add_cidr(char *addr)
ret = getaddrinfo(addr, NULL, &addr_hints, &addr_res);
if(ret) {
fprintf(stderr, "Error: can't parse address %s: %s\n", addr, gai_strerror(ret));
exit(2);
exit(1);
}
if(addr_res->ai_family != AF_INET) {
fprintf(stderr, "Error: -g works only with IPv4 addresses\n");
exit(2);
exit(1);
}
net_addr = ntohl(((struct sockaddr_in *) addr_res->ai_addr)->sin_addr.s_addr);
/* check mask */
if(mask < 1 || mask > 30) {
fprintf(stderr, "Error: netmask must be between 1 and 30 (is: %s)\n", mask_str);
exit(1);
}
/* convert mask integer from 1 to 32 to a bitmask */
bitmask = ((unsigned long) 0xFFFFFFFF) << (32-mask);
@@ -933,11 +920,11 @@ void add_range(char *start, char *end)
ret = getaddrinfo(start, NULL, &addr_hints, &addr_res);
if(ret) {
fprintf(stderr, "Error: can't parse address %s: %s\n", start, gai_strerror(ret));
exit(2);
exit(1);
}
if(addr_res->ai_family != AF_INET) {
fprintf(stderr, "Error: -g works only with IPv4 addresses\n");
exit(2);
exit(1);
}
start_long = ntohl(((struct sockaddr_in *) addr_res->ai_addr)->sin_addr.s_addr);
@@ -948,11 +935,11 @@ void add_range(char *start, char *end)
ret = getaddrinfo(end, NULL, &addr_hints, &addr_res);
if(ret) {
fprintf(stderr, "Error: can't parse address %s: %s\n", end, gai_strerror(ret));
exit(2);
exit(1);
}
if(addr_res->ai_family != AF_INET) {
fprintf(stderr, "Error: -g works only with IPv4 addresses\n");
exit(2);
exit(1);
}
end_long = ntohl(((struct sockaddr_in *) addr_res->ai_addr)->sin_addr.s_addr);
@@ -991,7 +978,7 @@ void main_loop()
/* Send the ping */
/*printf("Sending ping after %d ms\n", lt/100); */
if(!send_ping(s, h)) goto wait_for_reply;
send_ping(s, h);
/* Check what needs to be done next */
if(!loop_flag && !count_flag) {
@@ -1410,7 +1397,8 @@ int send_ping( int s, HOST_ENTRY *h )
char *buffer;
FPING_ICMPHDR *icp;
int n;
int myseq;
int myseq;
int ret = 1;
buffer = ( char* )malloc( ( size_t )ping_pkt_size );
if( !buffer )
@@ -1452,42 +1440,38 @@ int send_ping( int s, HOST_ENTRY *h )
&& errno != EHOSTDOWN
#endif
) {
if( verbose_flag || unreachable_flag )
{
if( verbose_flag || unreachable_flag ) {
printf( "%s", h->host );
if( verbose_flag )
printf( " error while sending ping: %s\n", strerror( errno ) );
printf( "\n" );
}/* IF */
}
h->num_sent++;
h->num_sent_i++;
h->waiting++;
num_pingsent++;
last_send_time = h->last_send_time;
free( buffer );
return(1);
}
if( !loop_flag )
h->resp_times[h->num_sent] = RESP_ERROR;
/* mark this trial as outstanding */
if( !loop_flag )
h->resp_times[h->num_sent] = RESP_WAITING;
ret = 0;
}
else {
/* mark this trial as outstanding */
if( !loop_flag )
h->resp_times[h->num_sent] = RESP_WAITING;
#if defined( DEBUG ) || defined( _DEBUG )
if( sent_times_flag )
h->sent_times[h->num_sent] = timeval_diff( &h->last_send_time, &start_time );
#endif /* DEBUG || _DEBUG */
if( sent_times_flag )
h->sent_times[h->num_sent] = timeval_diff( &h->last_send_time, &start_time );
#endif
}
h->num_sent++;
h->num_sent_i++;
h->waiting++;
num_pingsent++;
last_send_time = h->last_send_time;
free( buffer );
return(1);
return(ret);
}
@@ -1637,7 +1621,7 @@ int wait_for_reply(long wait_time)
{
if( ( this_count >= 0 ) && ( this_count < trials ) )
{
if( h->resp_times[this_count] != RESP_WAITING )
if( h->resp_times[this_count] >= 0 )
{
if( !per_recv_flag )
{
@@ -2002,45 +1986,10 @@ void add_name( char *name )
host_ent = gethostbyname( name );
if( host_ent == NULL )
{
if( h_errno == TRY_AGAIN )
{
u_sleep( DNS_TIMEOUT );
host_ent = gethostbyname( name );
}/* IF */
if( host_ent == NULL )
{
#ifdef NIS_GROUPS
/* maybe it's the name of a NIS netgroup */
char *machine, *user_ignored, *domain_ignored;
setnetgrent( name );
if( getnetgrent( &machine, &user_ignored, &domain_ignored ) == 0 )
{
endnetgrent();
print_warning("%s address not found\n", name );
num_noaddress++;
return;
}/* IF */
else
add_name(machine);
while( getnetgrent( &machine, &user_ignored, &domain_ignored ) )
add_name(machine);
endnetgrent();
return;
#else
print_warning("%s address not found\n", name );
num_noaddress++;
return ;
#endif /* NIS_GROUPS */
}/* IF */
}/* IF */
}
if(host_ent->h_addrtype != AF_INET) {
print_warning("%s: IPv6 address returned by gethostbyname (options inet6 in resolv.conf?)\n", name );
@@ -2705,23 +2654,23 @@ void usage(int is_error)
fprintf(out, " (ex. %s -g 192.168.1.0 192.168.1.255 or %s -g 192.168.1.0/24)\n", prog, prog );
fprintf(out, " -H n Set the IP TTL value (Time To Live hops)\n");
fprintf(out, " -i n interval between sending ping packets (in millisec) (default %d)\n", interval / 100 );
#ifdef SO_BINDTODEVICE
fprintf(out, " -I if bind to a particular interface\n");
#endif
fprintf(out, " -l loop sending pings forever\n" );
fprintf(out, " -m ping multiple interfaces on target host\n" );
fprintf(out, " -n show targets by name (-d is equivalent)\n" );
fprintf(out, " -O n set the type of service (tos) flag on the ICMP packets\n" );
fprintf(out, " -p n interval between ping packets to one target (in millisec)\n" );
fprintf(out, " (in looping and counting modes, default %d)\n", perhost_interval / 100 );
fprintf(out, " -q quiet (don't show per-target/per-ping results)\n" );
fprintf(out, " -Q n same as -q, but show summary every n seconds\n" );
fprintf(out, " -r n number of retries (default %d)\n", DEFAULT_RETRY );
fprintf(out, " -s print final stats\n" );
#ifdef SO_BINDTODEVICE
fprintf(out, " -I if bind to a particular interface\n");
#endif
fprintf(out, " -S addr set source address\n" );
fprintf(out, " -t n individual target initial timeout (in millisec) (default %d)\n", timeout / 100 );
fprintf(out, " -T n ignored (for compatibility with fping 2.4)\n");
fprintf(out, " -u show targets that are unreachable\n" );
fprintf(out, " -O n set the type of service (tos) flag on the ICMP packets\n" );
fprintf(out, " -v show version\n" );
fprintf(out, " targets list of targets to check (if no -f specified)\n" );
fprintf(out, "\n");
+1
View File
@@ -4,6 +4,7 @@
#define __APPLE_USE_RFC_3542 1
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#ifndef IPV6
-3
View File
@@ -49,6 +49,3 @@
#ifndef DNS_TIMEOUT
#define DNS_TIMEOUT 1000 /* time in micro_sec for dns retry */
#endif
/* NIS_GROUPS allows input name to be an NIS netgroup name */
/* #define NIS_GROUPS=1 */