Compare commits

108 Commits
Author SHA1 Message Date
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
David Schweikert bda0744d2c Give due credit 2013-11-08 11:17:05 +01:00
David Schweikert d6808efd81 Fix segmentation fault introduced in version 3.7 with loop mode (#55) 2013-11-08 11:13:11 +01:00
David Schweikert 3a714b275f prepare release 2013-11-04 23:13:07 +01:00
David Schweikert d141744adb Fix fping hanging forever on permanent sendto failure (Shawn Chu, #52) 2013-11-04 23:08:19 +01:00
David Schweikert e1cdf8e1d3 Fix again compatibility issue with FreeBSD (Shawn Chu) 2013-11-04 23:04:00 +01:00
David Schweikert d862dd962b release preparations 2013-11-01 16:11:07 +01:00
David Schweikert 5c68d6f338 don't consider duplicate pings as successful replies (#53) 2013-11-01 15:01:11 +01:00
David Schweikert a2ac5d0fae Remove unnecessary IPv6 socket options 2013-10-15 09:21:14 +02:00
David Schweikert b01f282727 merge latest changes 2013-10-14 20:28:11 +02:00
David Schweikert 0ab66f80de Refactor socket handling, allow running as non-root on Mac OS X by using non-privileged ICMP (#7) 2013-10-13 12:42:37 +02:00
David Schweikert 741236e576 Release version 3.6 2013-10-10 22:05:45 +02:00
David Schweikert 9fca2a141b Fix wrong min RTT value with -Q option (reported by Alexander Ivanov, #51) 2013-10-10 21:58:13 +02:00
David Schweikert 9ee22bd46a prepare 3.6-rc2 2013-07-25 22:34:31 +02:00
David Schweikert f55397336b increase SEQMAP_MAX to 65355 2013-07-25 22:29:56 +02:00
David Schweikert 82722a31fe update README file 2013-07-25 22:29:44 +02:00
David Schweikert 4aad0b2c14 fix compilation issue 2013-07-25 22:29:33 +02:00
David Schweikert fb5f5779cc Merge seqmap branch, fixes #12 2013-07-24 21:38:41 +02:00
David Schweikert a0252f6e79 Removed setsockopt IPV6_CHECKSUM, which shouldn't be set and breaks compiling on Solaris (reported by Juergen Arndt) 2013-07-24 21:36:02 +02:00
David Schweikert 3dee903b41 3.5 is released 2013-07-23 23:54:27 +02:00
David Schweikert 7e55f0b073 Fix loop issue after 65536 pings (reported by Peter Folk and GBert, #12), Minimum ping data size is now 0 2013-07-23 23:40:17 +02:00
David Schweikert 8daad08e1d work on seqmap 2013-07-23 23:24:04 +02:00
David Schweikert b7343ed256 start work on seqmap 2013-07-23 00:25:53 +02:00
David Schweikert ecba31b2dd Release 3.5 2013-05-22 08:56:44 +02:00
David Schweikert 28eea9c273 Re-create configure script with autoconf 2.69 for aarch64 support (Chuck Anderson, #45) 2013-05-22 08:48:08 +02:00
David Schweikert 121bea1d24 Fix compatibility issue with FreeBSD (Alexandre Raynaud, Jason Harris, #39) 2013-05-21 22:02:39 +02:00
David Schweikert 5d6db6f08d document new -D flag 2013-05-21 21:47:33 +02:00
David Schweikert 543d22122d Merge pull request #42 from tohojo/master
Add -D flag to print timestamp in front of output lines.
2013-05-21 12:43:02 -07:00
David Schweikert 70a29a11af fix sprint_tm buffer size crash (reported by Japheth Cleaver) 2013-05-21 21:36:36 +02:00
David Schweikert b0e09ce6fe Coverity: remove pointless expression 2013-04-23 21:59:32 +02:00
David Schweikert 6400ffb339 Merge branch 'master' of github.com:schweikert/fping 2013-04-23 21:26:02 +02:00
David Schweikert 98d44d02bb Merge pull request #47 from dlad/fix-warning
fix clang warning: comparison of unsigned expression < 0 is always false
2013-04-23 12:12:20 -07:00
Dipen Lad 69fff78ca4 fix clang warning: comparison of unsigned expression < 0 is always false 2013-04-20 21:50:22 +01:00
Toke Høiland-Jørgensen 5b6784a4ea Fix formatting of usec part of timestamp output. 2013-03-17 16:33:52 +01:00
Toke Høiland-Jørgensen 25dc120355 Add -D flag to print timestamps before output lines (like Linux ping). 2013-03-11 09:29:58 -04:00
David Schweikert f906225fbd update changelog 2013-02-17 23:09:58 +01:00
David Schweikert 3e29f0631c Merge pull request #35 from ghost/patch-1
Fixes failing fping6 build on OS X 10.8
2013-02-17 14:08:46 -08:00
David Schweikert 10d0a54c07 remove version information from man-page (#31) 2013-02-17 23:06:27 +01:00
David Schweikert ad4ca1609d Update ChangeLog 2013-02-17 23:05:38 +01:00
David Schweikert e0edbf28fc Merge pull request #34 from mv/fix-spec-file
Fix setuid permissions. Provides fping6.
2013-02-17 14:04:04 -08:00
Simon Hitzemann 1c85a422c1 Fixes failing fping6 build on OS X 10.8 2012-12-28 16:52:25 +01:00
Marcus Vinicius Ferreira 86cfc7cf74 Fix setuid permissions. Provides fping6. 2012-12-24 12:51:34 -02:00
David Schweikert fd020977b5 Prepare 3.4 2012-09-04 09:32:09 +02:00
David Schweikert 81c96c0807 Revert "Output statistics to stdout instead of stderr (suggested by Simon Leinen, #9)"
This reverts commit b4d0a93b70.
2012-09-04 09:27:52 +02:00
David Schweikert aff259bbd0 release 3.3 2012-08-19 23:06:18 +02:00
David Schweikert 4cab2f8598 Fix -n flag in fping6 (#28) 2012-08-16 13:59:42 +02:00
David Schweikert aa5f849c5d Fix error message on DNS error for IPv6 hosts (#27) 2012-08-16 11:26:16 +02:00
David Schweikert 1bb43dc07f fix wrong use of pointer (causing segfault) 2012-08-16 11:24:02 +02:00
28 changed files with 1077 additions and 348 deletions
+6
View File
@@ -1,10 +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
@@ -21,3 +26,4 @@ src/fping6
stamp-h1
doc/fping.8
doc/fping6.8
ci/build
+23
View File
@@ -0,0 +1,23 @@
# travis-ci.org configuration
language: c
env:
global:
- secure: "CoI8hwHH1yfQoQxIfWGRS0WfTyScox+5aJn0fDDgz2uKrrIxmBvIw/WKX8wcSiV6fLmLuwgNkKqSM3hdO4qaG+JxfWcuEiZZHm+kxSGMkWbGb/fvAI+gHg8ldKyYttcIX71O5rlZiC2QpNKQi2v18S6pI5p8eqnx7DYx4YrmguQ="
compiler:
- gcc
branches:
only:
- master
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.
*/
+49 -2
View File
@@ -1,5 +1,50 @@
UNRELEAESD David Schweikert <david@schweikert.ch>
* Version 3.3-rc1
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
by Vlad Glagolev, #55)
2013-11-04 David Schweikert <david@schweikert.ch>
* Version 3.7
* Allow running as non-root on Mac OS X by using non-privileged ICMP (#7)
* Remove unnecessary IPv6 socket options
* Fix again compatibility issue with FreeBSD (Shawn Chu)
* Fix fping hanging forever on permanent sendto failure (Shawn Chu)
* Fix duplicate echo reply packets causing early stop in count mode
(reported by Ramon Schwammberger, #53)
2013-10-10 David Schweikert <david@schweikert.ch>
* Version 3.6
* Fix loop issue after 65536 pings (reported by Peter Folk and GBert, #12)
* Minimum ping data size is now 0
* Removed setsockopt IPV6_CHECKSUM, which shouldn't be set and breaks
compiling on Solaris (reported by Juergen Arndt)
* Fix wrong min RTT value with -Q option (reported by Alexander Ivanov, #51)
2013-05-22 David Schweikert <david@schweikert.ch>
* Version 3.5
* Fix sprint_tm buffer size crash (reported by Japheth Cleaver)
* Addded -D flag to print timestamps (Toke Høiland-Jørgensen)
* Fix fping6 build on OS X 10.8 (unknown contributor)
* Fix compatibility issue with FreeBSD (Alexandre Raynaud, Jason Harris, #39)
* Fping.spec: fix setuid permissions and provides fping6 (Marcus Vinicius Ferreira)
* Re-create configure script with autoconf 2.69 for aarch64 support (Chuck Anderson, #45)
2012-09-04 David Schweikert <david@schweikert.ch>
* Version 3.4
* Revert "Output statistics to stdout instead of stderr", because it breaks
tools assuming the output goes to stderr
2012-08-19 David Schweikert <david@schweikert.ch>
* Version 3.3
* Do not output icmp errors with -q (#1)
* Add --enable-ipv4 and --enable-ipv6 options to configure (Niclas Zeising)
* Fix removing of unreachable hosts when doing loop (Thomas Liske, #13 #23)
@@ -9,6 +54,8 @@ UNRELEAESD David Schweikert <david@schweikert.ch>
* Set default data size to 56 bytes on all architectures (#18)
* Added contrib/fping.spec (Stephen Schaefer, #24)
* Convert man-page source to POD for easier maintenance
* Fix error message on DNS error for IPv6 hosts (#27)
* Fix -n flag in fping6 (#28)
* Man-page fix: TOS option typo (Thomas Liske, #23)
* Man-page fix: inconsistency in regards to numeric arguments (Robert Henney)
* Man-page fix: better description of option -q (#15)
+7 -1
View File
@@ -9,7 +9,11 @@ Current maintainer:
David Schweikert <david@schweikert.ch>
Website:
http://www.fping.org/
http://fping.org/
Mailing-list:
https://groups.google.com/group/fping-users
Installation
------------
@@ -27,6 +31,7 @@ If you want to install fping from source, proceed as follows:
4. Have a look at the fping(8) manual for usage help
(fping -h will also give a minimal help output)
IPv6 support
------------
You can can compile fping with support for IPv6 addresses. A separate binary
@@ -38,6 +43,7 @@ is used for that, called fping6. To build it, use ./configure --enable-ipv6
# make install
# sudo setcap cap_net_raw+ep /usr/local/bin/fping*
Credits
-------
Original author: Roland Schemers (schemers@stanford.edu)
+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
+20
View File
@@ -0,0 +1,20 @@
#!/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
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});
+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)
-l loop sending pings forever
-m ping multiple interfaces on target host
-n show targets by name (-d is equivalent)
-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
-I if bind to a particular interface
-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
-O n set the type of service (tos) flag on the ICMP packets
-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");
+39
View File
@@ -0,0 +1,39 @@
#!/usr/bin/perl -w
use Test::Command tests => 14;
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 $cmd1 = Test::Command->new(cmd => "fping -a 127.0.0.1 127.0.0.2");
$cmd1->exit_is_num(0);
$cmd1->stdout_is_eq("127.0.0.1\n127.0.0.2\n");
$cmd1->stderr_is_eq("");
# fping -A
my $cmd2 = Test::Command->new(cmd => "fping -A 127.0.0.1");
$cmd2->exit_is_num(0);
$cmd2->stdout_is_eq("127.0.0.1 is alive\n");
$cmd2->stderr_is_eq("");
# fping -b
my $cmd3 = Test::Command->new(cmd => "fping -b 1000 127.0.0.1");
$cmd3->exit_is_num(0);
$cmd3->stdout_is_eq("127.0.0.1 is alive\n");
$cmd3->stderr_is_eq("");
# fping -B
my $t0 = [gettimeofday];
my $cmd4 = Test::Command->new(cmd => "fping -t 100 -r 3 -B 2 8.8.8.7");
$cmd4->exit_is_num(1);
$cmd4->stdout_is_eq("8.8.8.7 is unreachable\n");
$cmd4->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);
+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");
+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.3-rc1])
AC_INIT([fping],[3.9])
dnl make ipv4 and ipv6 options
AC_ARG_ENABLE([ipv4],
+34 -7
View File
@@ -1,10 +1,10 @@
Summary: send ICMP echo probes to multiple hosts
Name: fping
Version: 3.2
Version: 3.4
Release: 1
License: MIT
Group: Applications/System
Source0: %{name}-%{version}.tar.gz
Source0: http://fping.org/dist/%{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
%description
@@ -18,29 +18,56 @@ statistics.
%setup -q
%build
%configure
if [ ! -f ./configure ] ; then
./autogen.sh
fi
# fping
%configure --enable-ipv4
make
# fping6
%configure --enable-ipv6
make
%{__mv} -f src/fping src/fping6
%install
rm -rf $RPM_BUILD_ROOT
make DESTDIR=$RPM_BUILD_ROOT install
# fping6
%{__install} -Dp -m4755 src/fping6 %{buildroot}%{_sbindir}/fping6
%{__ln_s} -f fping.8 %{buildroot}%{_mandir}/man8/fping6.8
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root,-)
/usr/sbin/fping
%attr(4755, root, root) /usr/sbin/fping
%attr(4755, root, root) /usr/sbin/fping6
%doc README COPYING ChangeLog
/usr/share/man/man8/fping.8.gz
/usr/share/man/man8/fping6.8.gz
%post
if [ -x /usr/sbin/setcap ]; then
/usr/sbin/setcap cap_net_raw+ep /usr/sbin/fping
else
chmod 1777 /usr/sbin/fping
/bin/chmod 0755 /usr/sbin/fping*
/usr/sbin/setcap cap_net_raw+ep /usr/sbin/fping*
fi
%changelog
* Mon Dec 24 2012 Marcus Vinicius Ferreira <ferreira.mv@gmail.com>
- Missing './configure' script when cloning from master.
- Making 'fping6'.
- Fix setuid permission to 'rwsr-xr-x'.
- doc files.
- Replacing setuid permission if 'setcap' is present on post-install.
- Using 'http://fping.org/dist/' for release source distributions.
* Mon Jul 16 2012 Stephen Schaefer <sschaefer@acm.org>
- Initial build
# vim:ft=spec:
+3 -3
View File
@@ -8,10 +8,10 @@ if IPV6
man_MANS += fping6.8
endif
EXTRA_DIST = $(man_MANS) fping.pod README.1992
EXTRA_DIST = fping.8 fping6.8 fping.pod README.1992
fping.8: fping.pod
pod2man -c "" -s 8 -r "fping $(VERSION)" $< >$@
pod2man -c "" -s 8 -r "fping" $< >$@
fping6.8: fping.pod
pod2man -c "" -s 8 -r "fping $(VERSION)" -n fping6 $< >$@
pod2man -c "" -s 8 -r "fping" -n fping6 $< >$@
+5
View File
@@ -77,6 +77,11 @@ C<-> indicating that no response was received to the fourth request.
Use DNS to lookup address of return ping packet. This allows you to give fping
a list of IP addresses as input and print hostnames in the output.
=item B<-D>
Add Unix timestamps in front of output lines generated with in looping or counting
modes (B<-l>, B<-c>, or B<-C>).
=item B<-e>
Show elapsed (round-trip) time of packets.
+2 -2
View File
@@ -9,8 +9,8 @@ endif
sbin_PROGRAMS = ${prog}
fping_SOURCES = fping.c options.h
fping_SOURCES = fping.c seqmap.c socket.c socket4.c fping.h options.h seqmap.h
fping_DEPENDENCIES = ../config.h
fping6_SOURCES = fping.c options.h
fping6_SOURCES = fping.c seqmap.c socket.c socket6.c fping.h options.h seqmap.h
fping6_DEPENDENCIES = ../config.h
fping6_CFLAGS = $(AM_CFLAGS) -DIPV6
+225 -328
View File
File diff suppressed because it is too large Load Diff
+28
View File
@@ -0,0 +1,28 @@
#ifndef _FPING_H
#define _FPING_H
#define __APPLE_USE_RFC_3542 1
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#ifndef IPV6
#define FPING_SOCKADDR struct sockaddr_in
#define FPING_INADDR struct in_addr
#define FPING_ICMPHDR struct icmp
#else
#define FPING_SOCKADDR struct sockaddr_in6
#define FPING_INADDR struct in6_addr
#define FPING_ICMPHDR struct icmp6_hdr
#endif
/* fping.c */
void crash_and_burn( char *message );
void errno_crash_and_burn( char *message );
/* socket.c */
int open_ping_socket();
void socket_set_src_addr(int s, FPING_INADDR src_addr);
#endif
+119
View File
@@ -0,0 +1,119 @@
/*
* fping: fast-ping, file-ping, favorite-ping, funky-ping
*
* Ping a list of target hosts in a round robin fashion.
* A better ping overall.
*
* fping website: http://www.fping.org
*
* Current maintainer of fping: David Schweikert
* Please send suggestions and patches to: david@schweikert.ch
*
*
* 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,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by Stanford University. The name of the University may not be used
* to endorse or promote products derived from this software without
* specific prior written permission.
* 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.
*
* seqmap.c: implementation of a mapping between sequence number and (host, ping_nr)
* we can't just use ping_nr*host_count + host_nr, because it can
* overflow the 16 bit of the icmp header field. See also:
* https://github.com/schweikert/fping/issues/48
*/
#include "seqmap.h"
#include "options.h"
#include "limits.h"
#include <stdlib.h>
#include <stdio.h>
/* description of the data structure used:
*
* - we assume that no more than SEQMAP_MAXSEQ (65535) pings are sent in
* the timeout interval (SEQMAP_TIMEOUT_IN_S)
* - we store the values in an array with SEQMAP_MAXSEQ elements
* - current sequence number % SEQMAP_MAXSEQ gives the current index
* - when entering a value, we check that the current entry is expired
*/
static SEQMAP_VALUE *seqmap_map = NULL;
static unsigned int seqmap_next_id = 0;
static SEQMAP_VALUE *seqmap_free_list;
#define SEQMAP_TIMEOUT_IN_S 10
#define SEQMAP_UNASSIGNED_HOST_NR UINT_MAX
void seqmap_init()
{
unsigned int i;
seqmap_map = calloc(SEQMAP_MAXSEQ, sizeof(SEQMAP_VALUE));
if(seqmap_map == NULL) {
perror("malloc error (can't allocate seqmap_map)");
}
}
unsigned int seqmap_add(unsigned int host_nr, unsigned int ping_count, struct timeval *now)
{
unsigned int current_id;
SEQMAP_VALUE *next_value;
if(!seqmap_map) {
fprintf(stderr, "fping internal error: seqmap not initialized.\n");
exit(4);
}
/* check if expired (note that unused seqmap values will have fields set to
* 0, so will be seen as expired */
next_value = &seqmap_map[seqmap_next_id];
if(next_value->ping_ts.tv_sec != 0 && (now->tv_sec - next_value->ping_ts.tv_sec) < SEQMAP_TIMEOUT_IN_S) {
fprintf(stderr, "fping error: not enough sequence numbers available! (expire_timeout=%d, host_nr=%d, ping_count=%d, seqmap_next_id=%d)\n",
SEQMAP_TIMEOUT_IN_S, host_nr, ping_count, seqmap_next_id);
exit(4);
}
/* store the value */
next_value->host_nr = host_nr;
next_value->ping_count = ping_count;
next_value->ping_ts.tv_sec = now->tv_sec;
next_value->ping_ts.tv_usec = now->tv_usec;
/* increase next id */
current_id = seqmap_next_id;
seqmap_next_id = (seqmap_next_id + 1) % SEQMAP_MAXSEQ;
return current_id;
}
SEQMAP_VALUE *seqmap_fetch(unsigned int id, struct timeval *now)
{
SEQMAP_VALUE *value;
if(id > SEQMAP_MAXSEQ) {
return NULL;
}
value = &seqmap_map[id];
/* verify that value is not expired */
if(now->tv_sec - value->ping_ts.tv_sec >= SEQMAP_TIMEOUT_IN_S) {
return NULL;
}
return value;
}
+20
View File
@@ -0,0 +1,20 @@
#ifndef SEQMAP_H
#define SEQMAP_H
#include <sys/time.h>
typedef struct seqmap_value
{
unsigned int host_nr;
unsigned int ping_count;
struct timeval ping_ts;
} SEQMAP_VALUE;
#define SEQMAP_MAXSEQ 65535
void seqmap_init();
unsigned int seqmap_add(unsigned int host_nr, unsigned int ping_count, struct timeval *now);
SEQMAP_VALUE *seqmap_fetch(unsigned int id, struct timeval *now);
#endif
+57
View File
@@ -0,0 +1,57 @@
/*
* fping: fast-ping, file-ping, favorite-ping, funky-ping
*
* Ping a list of target hosts in a round robin fashion.
* A better ping overall.
*
* fping website: http://www.fping.org
*
* Current maintainer of fping: David Schweikert
* Please send suggestions and patches to: david@schweikert.ch
*
*
* 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,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by Stanford University. The name of the University may not be used
* to endorse or promote products derived from this software without
* specific prior written permission.
* 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.
*/
#include "fping.h"
#include "config.h"
int open_ping_socket_ipv4();
int open_ping_socket_ipv6();
void socket_set_src_addr_ipv4(int s, FPING_INADDR src_addr);
void socket_set_src_addr_ipv6(int s, FPING_INADDR src_addr);
int open_ping_socket()
{
#ifndef IPV6
return open_ping_socket_ipv4();
#else
return open_ping_socket_ipv6();
#endif
}
void socket_set_src_addr(int s, FPING_INADDR src_addr)
{
#ifndef IPV6
socket_set_src_addr_ipv4(s, src_addr);
#else
socket_set_src_addr_ipv6(s, src_addr);
#endif
}
+73
View File
@@ -0,0 +1,73 @@
/*
* fping: fast-ping, file-ping, favorite-ping, funky-ping
*
* Ping a list of target hosts in a round robin fashion.
* A better ping overall.
*
* fping website: http://www.fping.org
*
* Current maintainer of fping: David Schweikert
* Please send suggestions and patches to: david@schweikert.ch
*
*
* 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,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by Stanford University. The name of the University may not be used
* to endorse or promote products derived from this software without
* specific prior written permission.
* 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.
*/
#include "fping.h"
#include "config.h"
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
int open_ping_socket_ipv4()
{
struct protoent *proto;
int s;
/* confirm that ICMP is available on this machine */
if( ( proto = getprotobyname( "icmp" ) ) == NULL )
crash_and_burn( "icmp: unknown protocol" );
/* create raw socket for ICMP calls (ping) */
s = socket( AF_INET, SOCK_RAW, proto->p_proto );
if( s < 0 ) {
/* try non-privileged icmp (works on Mac OSX without privileges, for example) */
s = socket( AF_INET, SOCK_DGRAM, proto->p_proto );
if( s < 0 ) {
errno_crash_and_burn( "can't create socket (must run as root?)" );
}
}
return s;
}
void socket_set_src_addr_ipv4(int s, FPING_INADDR src_addr)
{
struct sockaddr_in sa;
memset( &sa, 0, sizeof( sa ) );
sa.sin_family = AF_INET;
sa.sin_addr = src_addr;
if ( bind( s, (struct sockaddr *)&sa, sizeof( sa ) ) < 0 )
errno_crash_and_burn( "cannot bind source address" );
}
+76
View File
@@ -0,0 +1,76 @@
/*
* fping: fast-ping, file-ping, favorite-ping, funky-ping
*
* Ping a list of target hosts in a round robin fashion.
* A better ping overall.
*
* fping website: http://www.fping.org
*
* Current maintainer of fping: David Schweikert
* Please send suggestions and patches to: david@schweikert.ch
*
*
* 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,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by Stanford University. The name of the University may not be used
* to endorse or promote products derived from this software without
* specific prior written permission.
* 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.
*/
#include "fping.h"
#include "config.h"
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <netinet/icmp6.h>
int open_ping_socket_ipv6()
{
struct protoent *proto;
int opton = 1;
int s;
/* confirm that ICMP is available on this machine */
if( ( proto = getprotobyname( "ipv6-icmp" ) ) == NULL )
crash_and_burn( "icmp: unknown protocol" );
/* create raw socket for ICMP calls (ping) */
s = socket( AF_INET6, SOCK_RAW, proto->p_proto );
if( s < 0 ) {
/* try non-privileged icmp (works on Mac OSX without privileges, for example) */
s = socket( AF_INET6, SOCK_DGRAM, proto->p_proto );
if( s < 0 ) {
errno_crash_and_burn( "can't create raw socket (must run as root?)" );
}
}
return s;
}
void socket_set_src_addr_ipv6(int s, FPING_INADDR src_addr)
{
struct sockaddr_in6 sa;
memset( &sa, 0, sizeof( sa ) );
sa.sin6_family = AF_INET6;
sa.sin6_addr = src_addr;
if ( bind( s, (struct sockaddr *)&sa, sizeof( sa ) ) < 0 )
errno_crash_and_burn( "cannot bind source address" );
}