Compare commits

5 Commits
Author SHA1 Message Date
rainlance 979bcfd515 Updated documentation 2016-03-05 11:19:34 +01:00
rainlance 097c701fe5 AROS changes 2016-03-05 09:51:40 +01:00
Carsten 46852d6394 Version 3.13 changes 2016-02-22 19:41:59 +01:00
llsth d4bd91c11a Thread safety 2015-08-15 19:39:38 +02:00
llsth 24fdc7958e Thread safety 2015-08-15 19:34:32 +02:00
46 changed files with 2755 additions and 1117 deletions
+1 -28
View File
@@ -1,30 +1,3 @@
.*.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
config.log
config.status
config.sub
configure
depcomp
install-sh
missing
src/*.o
src/fping
src/fping6
stamp-h1
doc/fping.8
doc/fping6.8
ci/build
*.o
*.kdev4
+15 -2
View File
@@ -1,5 +1,18 @@
UNRELEASED
* Fix double entries with fping -u and unreachable hosts
2015-10-21 David Schweikert <david@schweikert.ch>
* Version 3.13
* (bugfix) Fix ICMP errors sometimes causing crashes with fping >= 3.11
(fixes #85, reported by Jamie Heilman and Bill Blough)
2015-10-14 David Schweikert <david@schweikert.ch>
* Version 3.12
* (bugfix) Fix fping6 -R (fixes #84, reported by Stuart Henderson)
2015-10-12 David Schweikert <david@schweikert.ch>
* Version 3.11
* (feature) New option -R to use random bytes instead of NULLs (#72, Anthony DeRobertis)
* (feature) Small documentation and performance improvements (Ryan Underwood)
* (bugfix) Fix double entries with fping -u and unreachable hosts
* (internal) Use sockaddr_storage and simplify code, so that we can one day support both IPv4 and IPv6 with the same binary
2014-05-03 David Schweikert <david@schweikert.ch>
* Version 3.10
-177
View File
@@ -1,177 +0,0 @@
Basic Installation
==================
These are generic installation instructions.
--> See the README file for fping-specific instructions. <--
The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions. Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, a file
`config.cache' that saves the results of its tests to speed up
reconfiguring, and a file `config.log' containing compiler output
(useful mainly for debugging `configure').
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release. If at some point `config.cache'
contains results you don't want to keep, you may remove or edit it.
The file `configure.in' is used to create `configure' by a program
called `autoconf'. You only need `configure.in' if you want to change
it or regenerate `configure' using a newer version of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
`./configure' to configure the package for your system. If you're
using `csh' on an old version of System V, you might need to type
`sh ./configure' instead to prevent `csh' from trying to execute
`configure' itself.
Running `configure' takes a while. While running, it prints some
messages telling which features it is checking for.
2. Type `make' to compile the package.
3. Optionally, type `make check' to run any self-tests that come with
the package.
4. Type `make install' to install the programs and any data files and
documentation.
5. You can remove the program binaries and object files from the
source code directory by typing `make clean'. To also remove the
files that `configure' created (so you can compile the package for
a different kind of computer), type `make distclean'. There is
also a `make maintainer-clean' target, but that is intended mainly
for the package's developers. If you use it, you may have to get
all sorts of other programs in order to regenerate files that came
with the distribution.
Compilers and Options
=====================
Some systems require unusual options for compilation or linking that
the `configure' script does not know about. You can give `configure'
initial values for variables by setting them in the environment. Using
a Bourne-compatible shell, you can do that on the command line like
this:
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
Or on systems that have the `env' program, you can do it like this:
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
Compiling For Multiple Architectures
====================================
You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory. To do this, you must use a version of `make' that
supports the `VPATH' variable, such as GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.
If you have to use a `make' that does not supports the `VPATH'
variable, you have to compile the package for one architecture at a time
in the source code directory. After you have installed the package for
one architecture, use `make distclean' before reconfiguring for another
architecture.
Installation Names
==================
By default, `make install' will install the package's files in
`/usr/local/bin', `/usr/local/man', etc. You can specify an
installation prefix other than `/usr/local' by giving `configure' the
option `--prefix=PATH'.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
give `configure' the option `--exec-prefix=PATH', the package will use
PATH as the prefix for installing programs and libraries.
Documentation and other data files will still use the regular prefix.
If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
Optional Features
=================
Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
Specifying the System Type
==========================
There may be some features `configure' can not figure out
automatically, but needs to determine by the type of host the package
will run on. Usually `configure' can figure that out, but if it prints
a message saying it can not guess the host type, give it the
`--host=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name with three fields:
CPU-COMPANY-SYSTEM
See the file `config.sub' for the possible values of each field. If
`config.sub' isn't included in this package, then this package doesn't
need to know the host type.
If you are building compiler tools for cross-compiling, you can also
use the `--target=TYPE' option to select the type of system they will
produce code for and the `--build=TYPE' option to select the type of
system on which you are compiling the package.
Sharing Defaults
================
If you want to set default values for `configure' scripts to share,
you can create a site shell script called `config.site' that gives
default values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.
Operation Controls
==================
`configure' recognizes the following options to control how it
operates.
`--cache-file=FILE'
Use and save the results of the tests in FILE instead of
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
debugging `configure'.
`--help'
Print a summary of the options to `configure', and exit.
`--quiet'
`--silent'
`-q'
Do not print messages saying which checks are being made.
`--srcdir=DIR'
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
`--version'
Print the version of Autoconf used to generate the `configure'
script, and exit.
`configure' also accepts some other, not widely useful, options.
Regular → Executable
+2
View File
@@ -15,3 +15,5 @@
* 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.
Detailed license info can be found in supplied source files.
-1
View File
@@ -1 +0,0 @@
SUBDIRS = doc src
+21
View File
@@ -0,0 +1,21 @@
# fping 3
fping is a program to send ICMP echo probes to network hosts, similar to ping,
but much better performing when pinging multiple hosts. fping has a long long
story: Roland Schemers did publish a first version of it in 1992 and it has
established itself since then as a standard tool.
_Current maintainer_:
David Schweikert \<david@schweikert.ch\>
_Website_:
http://fping.org/
_Mailing-list_:
https://groups.google.com/group/fping-users
## Credits
Original author: Roland Schemers (schemers@stanford.edu)
Previous maintainer: RL "Bob" Morgan (morgan@stanford.edu)
Initial IPv6 Support: Jeroen Massar (jeroen@unfix.org / jeroen@ipng.nl)
Other contributors: see ChangeLog
-24
View File
@@ -1,24 +0,0 @@
#!/bin/sh
[ -f Makefile ] && make clean
rm -f Makefile
rm -f Makefile.in
rm -f aclocal.m4
rm -rf autom4te.cache
rm -f config.guess
rm -f config.h
rm -f config.h.in
rm -f config.log
rm -f config.status
rm -f config.sub
rm -f configure
rm -f depcomp
rm -f install-sh
rm -f missing
rm -f mkinstalldirs
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
-2
View File
@@ -1,2 +0,0 @@
#!/bin/sh
autoreconf -i
+9
View File
@@ -0,0 +1,9 @@
#!/bin/bash
sudo setcap cap_net_raw+ep src/fping
sudo setcap cap_net_raw+ep src/fping6
if [[ ! $PATH =~ fping/src ]]; then
echo "# WARNING: must set PATH:"
echo PATH=/home/dws/checkouts/fping/src:\$PATH
fi
+18
View File
@@ -0,0 +1,18 @@
#!/bin/bash
# only do this on Mac OS X
if [ `uname -s` != "Darwin" ]; then
exit 0;
fi
if [[ ! `ifconfig lo0` =~ 127\.0\.0\.2 ]]; then
sudo ifconfig lo0 127.0.0.2/8 alias
sudo ifconfig lo0 127.0.0.3/8 alias
sudo ifconfig lo0 127.0.0.4/8 alias
sudo ifconfig lo0 127.0.0.5/8 alias
fi
if [[ ! $PATH =~ /Users/dws/checkouts/fping/src ]]; then
echo "# WARNING: must set PATH:"
echo PATH=/Users/dws/checkouts/fping/src:\$PATH
fi
+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});
+65
View File
@@ -0,0 +1,65 @@
#!/usr/bin/perl -w
use Test::Command tests => 9;
my $I_HELP = " -I if bind to a particular interface\n";
$I_HELP = '' if $^O eq 'darwin';
# 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_HELP} -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)
-R random packet data (to foil link data compression)
-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("");
if($^O eq 'darwin') {
$cmd3->stderr_is_eq("fping: illegal option -- Z\nsee 'fping -h' for usage information\n");
}
else {
$cmd3->stderr_is_eq("fping: invalid option -- 'Z'\nsee '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");
+47
View File
@@ -0,0 +1,47 @@
#!/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 $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 -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_like(qr{^(|(8.8.8.7: error while sending ping: No route to host\n)+)$});
my $elapsed = tv_interval($t0);
# 0.1 + 0.2 + 0.4 + 0.8 = 1.5
cmp_ok($elapsed, '>=', 1.5);
cmp_ok($elapsed, '<', 1.8);
}
+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("");
}
+25
View File
@@ -0,0 +1,25 @@
#!/usr/bin/perl -w
use Test::Command tests => 4;
# -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 -> test-14-internet-hosts
+42
View File
@@ -0,0 +1,42 @@
#!/usr/bin/perl -w
use Test::Command tests => 9;
# -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 -> test-14-internet-hosts
# 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+
});
}
+92
View File
@@ -0,0 +1,92 @@
#!/usr/bin/perl -w
use Test::Command tests => 18;
# -R random bytes
# -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
{
my $cmd = Test::Command->new(cmd => "fping -q -R -c3 -p100 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%.*});
}
# fping6 -R
{
my $cmd = Test::Command->new(cmd => "fping6 -q -R -c3 -p100 ::1");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("");
$cmd->stderr_like(qr{::1 : xmt/rcv/%loss = 3/3/0%.*});
}
# 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
+8 -1
View File
@@ -1,6 +1,13 @@
#!/usr/bin/perl -w
use Test::Command tests => 6;
use Test::Command;
use Test::More;
if( $^O eq 'darwin' ) {
plan skip_all => 'Test irrelevant on MacOS';
exit 0;
}
plan tests => 6;
# run without privileges
my $fping_bin = `which fping`; chomp $fping_bin;
+2 -2
View File
@@ -7,7 +7,7 @@ use Test::Command tests => 6;
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");
$cmd->stderr_like(qr{^nosuchname\.example\.com: .*not (known|found)});
}
# fping6
@@ -15,5 +15,5 @@ $cmd->stderr_is_eq("nosuchname.example.com address not found\n");
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");
$cmd->stderr_like(qr{^nosuchname\.example\.com: .*not (known|found)});
}
+50 -1
View File
@@ -1,6 +1,15 @@
#!/usr/bin/perl -w
use Test::Command tests => 3;
use Test::Command;
use Test::More;
# evaluate if we have internet
if(!gethostbyname("www.google.com")) {
plan skip_all => 'Can\'t resolve www.google.com -> no internet?';
exit 0;
}
plan tests => 18;
my $re_num = qr{\d+(?:\.\d+)?};
@@ -15,3 +24,43 @@ www\.france-telecom\.fr\s*: xmt/rcv/%loss = [123]/3/\d+%, min/avg/max = $re_num/
www\.google\.com\s*: xmt/rcv/%loss = [123]/3/\d+%, min/avg/max = $re_num/$re_num/$re_num
});
}
# fping -A -n
{
my $cmd = Test::Command->new(cmd => "fping -A -n 8.8.8.8");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("google-public-dns-a.google.com (8.8.8.8) is alive\n");
$cmd->stderr_is_eq("");
}
# fping -A -n
{
my $cmd = Test::Command->new(cmd => "fping -A -n google-public-dns-a.google.com");
$cmd->exit_is_num(0);
$cmd->stdout_is_eq("google-public-dns-a.google.com (8.8.8.8) 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 -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("");
}
# 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("");
}
-77
View File
@@ -1,77 +0,0 @@
dnl Process this file with autoconf to produce a configure script.
dnl Minimum Autoconf version required.
AC_PREREQ(2.59)
AC_INIT([fping],[3.10])
dnl make ipv4 and ipv6 options
AC_ARG_ENABLE([ipv4],
[ --enable-ipv4 Build IPv4 capable fping],
[case "${enableval}" in
yes) ipv4=true ;;
no) ipv4=false ;;
*) AC_MSG_ERROR([bad value ${enableval} for --enable-ipv4]) ;;
esac],[ipv4=true])
AM_CONDITIONAL([IPV4], [test x$ipv4 = xtrue])
AC_ARG_ENABLE([ipv6],
[ --enable-ipv6 Build IPv6 capable fping6],
[case "${enableval}" in
yes) ipv6=true ;;
no) ipv6=false ;;
*) AC_MSG_ERROR([bad value ${enableval} for --enable-ipv6]) ;;
esac],[ipv6=false])
AM_CONDITIONAL([IPV6], [test x$ipv6 = xtrue])
if test x$ipv4 = xfalse && test x$ipv6 = xfalse; then
AC_MSG_ERROR([You must enable at least one of IPv4 and IPv6.])
fi
AC_CANONICAL_TARGET
AM_INIT_AUTOMAKE([foreign])
AM_MAINTAINER_MODE
AC_CONFIG_HEADERS([config.h])
dnl Checks for programs.
AC_PROG_CC
AC_PROG_CPP
AC_PROG_INSTALL
dnl Checks for libraries.
AC_CHECK_FUNC(gethostbyname)
if test $ac_cv_func_gethostbyname = no; then
AC_CHECK_LIB(nsl, gethostbyname)
fi
AC_CHECK_FUNC(connect)
if test $ac_cv_func_connect = no; then
AC_CHECK_LIB(socket, connect)
fi
AH_TOP([
#ifndef CONFIG_H
#define CONFIG_H
])
AH_BOTTOM([
/* some OSes do not define this ... lets take a wild guess */
#ifndef INADDR_NONE
# define INADDR_NONE 0xffffffffU
#endif
#endif /* CONFIG_H */
])
dnl Checks for header files.
AC_CHECK_HEADERS(unistd.h sys/file.h stdlib.h sys/select.h)
AC_CONFIG_FILES([Makefile
doc/Makefile
src/Makefile])
AC_OUTPUT
+189
View File
@@ -0,0 +1,189 @@
FPING(8) FPING(8)
NAME
fping - send ICMP ECHO_REQUEST packets to network hosts
SYNOPSIS
fping [ options ] [ systems... ] fping6 [ options ] [ systems... ]
DESCRIPTION
fping is a program like ping which uses the Internet Control Message
Protocol (ICMP) echo request to determine if a target host is
responding. fping differs from ping in that you can specify any number
of targets on the command line, or specify a file containing the lists
of targets to ping. Instead of sending to one target until it times
out or replies, fping will send out a ping packet and move on to the
next target in a round-robin fashion. In the default mode, if a target
replies, it is noted and removed from the list of targets to check; if
a target does not respond within a certain time limit and/or retry
limit it is designated as unreachable. fping also supports sending a
specified number of pings to a target, or looping indefinitely (as in
ping ). Unlike ping, fping is meant to be used in scripts, so its
output is designed to be easy to parse.
The binary named fping6 is the same as fping, except that it uses IPv6
addresses instead of IPv4.
OPTIONS
-a Show systems that are alive.
-A Display targets by address rather than DNS name. Combined with -d,
the output will be both the ip and (if available) the hostname.
-b n Number of bytes of ping data to send. The minimum size (normally
12) allows room for the data that fping needs to do its work
(sequence number, timestamp). The reported received data size
includes the IP header (normally 20 bytes) and ICMP header (8
bytes), so the minimum total size is 40 bytes. Default is 56, as
in ping. Maximum is the theoretical maximum IP datagram size
(64K), though most systems limit this to a smaller, system-
dependent number.
-B n Backoff factor. In the default mode, 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 (-t) is multiplied on each successive request; it must be
entered as a floating-point number (x.y). The default is 1.5.
-c n Number of request packets to send to each target. In this mode, a
line is displayed for each received response (this can suppressed
with -q or -Q). Also, statistics about responses for each target
are displayed when all requests have been sent (or when
interrupted).
-C n Similar to -c, but the per-target statistics are displayed in a
format designed for automated response-time statistics gathering.
For example:
% fping -C 5 -q somehost
somehost : 91.7 37.0 29.2 - 36.8
shows the response time in milliseconds for each of the five
requests, with the "-" indicating that no response was received to
the fourth request.
-d 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.
-D Add Unix timestamps in front of output lines generated with in
looping or counting modes (-l, -c, or -C).
-e Show elapsed (round-trip) time of packets.
-f Read list of targets from a file. This option can only be used by
the root user. Regular users should pipe in the file via stdin:
% fping < targets_file
-g addr/mask
Generate a target list from a supplied IP netmask, or a starting
and ending IP. Specify the netmask or start/end in the targets
portion of the command line. If a network with netmask is given,
the network and broadcast addresses will be excluded. ex. To ping
the network 192.168.1.0/24, the specified command line could look
like either:
fping -g 192.168.1.0/24
or
fping -g 192.168.1.1 192.168.1.254
-h Print usage message.
-i n The minimum amount of time (in milliseconds) between sending a
ping packet to any target (default is 25).
-l Loop sending packets to each target indefinitely. Can be
interrupted with Ctrl-C; statistics about responses for each
target are then displayed.
-m Send pings to each of a target host's multiple interfaces.
-n Same as -d.
-p <n>
In looping or counting modes (-l, -c, or -C), this parameter sets
the time in milliseconds that fping waits between successive
packets to an individual target. Default is 1000.
-q Quiet. Don't show per-probe results, but only the final summary.
Also don't show ICMP error messages.
-Q n Like -q, but show summary results every n seconds.
-r n Retry limit (default 3). This is the number of times an attempt at
pinging a target will be made, not including the first try.
-R Instead of using all-zeros as the packet data, generate random
bytes. Use to defeat, e.g., link data compression.
-s Print cumulative statistics upon exit.
-S addr
Set source address.
-I if
Set the interface (requires SO_BINDTODEVICE support)
-t n Initial target timeout in milliseconds (default 500). In the
default mode, this is the amount of time that fping waits for a
response to its first request. Successive timeouts are multiplied
by the backoff factor specified with -B. Note that this option
has no effect looping or counting modes (-l, -c, or -C).
-T n Ignored (for compatibility with fping 2.4).
-u Show targets that are unreachable.
-O n Set the typ of service flag (TOS). n can be either decimal or
hexadecimal (0xh) format.
-v Print fping version information.
-H n Set the IP TTL field (time to live hops).
EXAMPLES
Generate ~1000 pings per second to a host until canceled, printing
statistics on the fly at one second intervals, and printing statistics
at the end:
# fping -s -l -i 1 -p 1 -T 1 -Q 1 127.0.0.1
Note that ping intervals less than 10ms can only be used as root.
AUTHORS
· Roland J. Schemers III, Stanford University, concept and versions
1.x
· RL "Bob" Morgan, Stanford University, versions 2.x
· David Papp, versions 2.3x and up
· David Schweikert, versions 3.0 and up
fping website: <http://www.fping.org>
DIAGNOSTICS
Exit status is 0 if all the hosts are reachable, 1 if some hosts were
unreachable, 2 if any IP addresses were not found, 3 for invalid
command line arguments, and 4 for a system call failure.
RESTRICTIONS
If certain options are used (i.e, a low value for -i and -t, and a high
value for -r) it is possible to flood the network. This program must be
installed as setuid root in order to open up a raw socket, or must be
run by root. In order to stop mere mortals from hosing the network,
normal users can't specify the following:
· -i n, where n < 10 msec
· -r n, where n > 20
· -t n, where n < 250 msec
SEE ALSO
ping(8)
fping 2016-02-19 FPING(8)
+76 -60
View File
@@ -1,55 +1,57 @@
FPING(8) FPING(8)
NAME
NAME
fping - send ICMP ECHO_REQUEST packets to network hosts
SYNOPSIS
fping [ options ] [ systems... ] fping6 [ options ] [ systems... ]
SYNOPSIS
fping [ options ] [ systems... ] fping6 [ options ] [ systems... ]
DESCRIPTION
fping is a program like ping which uses the Internet Control Message
DESCRIPTION
fping is a program like ping which uses the Internet Control Message
Protocol (ICMP) echo request to determine if a target host is
responding. fping differs from ping in that you can specify any number
responding. fping differs from ping in that you can specify any number
of targets on the command line, or specify a file containing the lists
of targets to ping. Instead of sending to one target until it times
out or replies, fping will send out a ping packet and move on to the
out or replies, fping will send out a ping packet and move on to the
next target in a round-robin fashion. In the default mode, if a target
replies, it is noted and removed from the list of targets to check; if
a target does not respond within a certain time limit and/or retry
limit it is designated as unreachable. fping also supports sending a
limit it is designated as unreachable. fping also supports sending a
specified number of pings to a target, or looping indefinitely (as in
ping ). Unlike ping, fping is meant to be used in scripts, so its
ping ). Unlike ping, fping is meant to be used in scripts, so its
output is designed to be easy to parse.
The binary named fping6 is the same as fping, except that it uses IPv6
The binary named fping6 is the same as fping, except that it uses IPv6
addresses instead of IPv4.
OPTIONS
-a Show systems that are alive.
OPTIONS
-a Show systems that are alive.
-A Display targets by address rather than DNS name.
-A Display targets by address rather than DNS name. Combined with -d,
the output will be both the ip and (if available) the hostname.
-b n Number of bytes of ping data to send. The minimum size (normally
12) allows room for the data that fping needs to do its work
-b n Number of bytes of ping data to send. The minimum size (normally
12) allows room for the data that fping needs to do its work
(sequence number, timestamp). The reported received data size
includes the IP header (normally 20 bytes) and ICMP header (8
bytes), so the minimum total size is 40 bytes. Default is 56, as
in ping. Maximum is the theoretical maximum IP datagram size
in ping. Maximum is the theoretical maximum IP datagram size
(64K), though most systems limit this to a smaller, system-
dependent number.
-B n Backoff factor. In the default mode, fping sends several requests
-B n Backoff factor. In the default mode, 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 (-t) is multiplied on each successive request; it must be
time (-t) is multiplied on each successive request; it must be
entered as a floating-point number (x.y). The default is 1.5.
-c n Number of request packets to send to each target. In this mode, a
-c n Number of request packets to send to each target. In this mode, a
line is displayed for each received response (this can suppressed
with -q or -Q). Also, statistics about responses for each target
with -q or -Q). Also, statistics about responses for each target
are displayed when all requests have been sent (or when
interrupted).
-C n Similar to -c, but the per-target statistics are displayed in a
-C n Similar to -c, but the per-target statistics are displayed in a
format designed for automated response-time statistics gathering.
For example:
@@ -60,21 +62,21 @@
requests, with the "-" indicating that no response was received to
the fourth request.
-d Use DNS to lookup address of return ping packet. This allows you
-d 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.
-D Add Unix timestamps in front of output lines generated with in
looping or counting modes (-l, -c, or -C).
-D Add Unix timestamps in front of output lines generated with in
looping or counting modes (-l, -c, or -C).
-e Show elapsed (round-trip) time of packets.
-e Show elapsed (round-trip) time of packets.
-f Read list of targets from a file. This option can only be used by
-f Read list of targets from a file. This option can only be used by
the root user. Regular users should pipe in the file via stdin:
% fping < targets_file
-g addr/mask
-g addr/mask
Generate a target list from a supplied IP netmask, or a starting
and ending IP. Specify the netmask or start/end in the targets
portion of the command line. If a network with netmask is given,
@@ -88,58 +90,70 @@
fping -g 192.168.1.1 192.168.1.254
-h Print usage message.
-h Print usage message.
-i n The minimum amount of time (in milliseconds) between sending a
-i n The minimum amount of time (in milliseconds) between sending a
ping packet to any target (default is 25).
-l Loop sending packets to each target indefinitely. Can be
-l Loop sending packets to each target indefinitely. Can be
interrupted with Ctrl-C; statistics about responses for each
target are then displayed.
-m Send pings to each of a target host's multiple interfaces.
-m Send pings to each of a target host's multiple interfaces.
-n Same as -d.
-n Same as -d.
-p <n>
In looping or counting modes (-l, -c, or -C), this parameter sets
the time in milliseconds that fping waits between successive
-p <n>
In looping or counting modes (-l, -c, or -C), this parameter sets
the time in milliseconds that fping waits between successive
packets to an individual target. Default is 1000.
-q Quiet. Don't show per-probe results, but only the final summary.
-q Quiet. Don't show per-probe results, but only the final summary.
Also don't show ICMP error messages.
-Q n Like -q, but show summary results every n seconds.
-Q n Like -q, but show summary results every n seconds.
-r n Retry limit (default 3). This is the number of times an attempt at
-r n Retry limit (default 3). This is the number of times an attempt at
pinging a target will be made, not including the first try.
-s Print cumulative statistics upon exit.
-R Instead of using all-zeros as the packet data, generate random
bytes. Use to defeat, e.g., link data compression.
-S addr
-s Print cumulative statistics upon exit.
-S addr
Set source address.
-I if
-I if
Set the interface (requires SO_BINDTODEVICE support)
-t n Initial target timeout in milliseconds (default 500). In the
default mode, this is the amount of time that fping waits for a
-t n Initial target timeout in milliseconds (default 500). In the
default mode, this is the amount of time that fping waits for a
response to its first request. Successive timeouts are multiplied
by the backoff factor specified with -B. Note that this option
has no effect looping or counting modes (-l, -c, or -C).
by the backoff factor specified with -B. Note that this option
has no effect looping or counting modes (-l, -c, or -C).
-T n Ignored (for compatibility with fping 2.4).
-T n Ignored (for compatibility with fping 2.4).
-u Show targets that are unreachable.
-u Show targets that are unreachable.
-O n Set the typ of service flag (TOS). n can be either decimal or
-O n Set the typ of service flag (TOS). n can be either decimal or
hexadecimal (0xh) format.
-v Print fping version information.
-v Print fping version information.
-H n Set the IP TTL field (time to live hops).
-H n Set the IP TTL field (time to live hops).
AUTHORS
EXAMPLES
Generate ~1000 pings per second to a host until canceled, printing
statistics on the fly at one second intervals, and printing statistics
at the end:
# fping -s -l -i 1 -p 1 -T 1 -Q 1 127.0.0.1
Note that ping intervals less than 10ms can only be used as root.
AUTHORS
· Roland J. Schemers III, Stanford University, concept and versions
1.x
@@ -149,25 +163,27 @@
· David Schweikert, versions 3.0 and up
fping website: <http://www.fping.org>
fping website: <http://www.fping.org>
DIAGNOSTICS
DIAGNOSTICS
Exit status is 0 if all the hosts are reachable, 1 if some hosts were
unreachable, 2 if any IP addresses were not found, 3 for invalid
command line arguments, and 4 for a system call failure.
RESTRICTIONS
If certain options are used (i.e, a low value for -i and -t, and a high
value for -r) it is possible to flood the network. This program must be
RESTRICTIONS
If certain options are used (i.e, a low value for -i and -t, and a high
value for -r) it is possible to flood the network. This program must be
installed as setuid root in order to open up a raw socket, or must be
run by root. In order to stop mere mortals from hosing the network,
normal users can't specify the following:
· -i n, where n < 10 msec
· -i n, where n < 10 msec
· -r n, where n > 20
· -r n, where n > 20
· -t n, where n < 250 msec
· -t n, where n < 250 msec
SEE ALSO
ping(8)
2014-05-04
fping 2016-02-19 FPING(8)
Executable
+609
View File
@@ -0,0 +1,609 @@
2016-02-22 Carsten Larsen <carsten.larsen@mail.com>
* AROS Version 3.13
* (internal) Compatibility changes in usage of gettimeofday
* (internal) Compatibility changes datatypes and library usage
2016-02-22 Carsten Larsen <carsten.larsen@mail.com>
* AmigaOS Version 3.13
* (bugfix) Socket was not closed and memory not released on exit
* (bugfix) Calculation of digits were incorrect due to a faulty gettimeofday function
* (bugfix) Differences in Amiga timeval datatype sometimes caused fping to hang
* (internal) Code compliance with AmigaOS (Amiga2Date etc.)
* (internal) Removed non-supported TTL and TOS socket options
* (improvement) Minor improvement in visual layouts
2015-10-21 David Schweikert <david@schweikert.ch>
* Version 3.13
* (bugfix) Fix ICMP errors sometimes causing crashes with fping >= 3.11
(fixes #85, reported by Jamie Heilman and Bill Blough)
2015-10-14 David Schweikert <david@schweikert.ch>
* Version 3.12
* (bugfix) Fix fping6 -R (fixes #84, reported by Stuart Henderson)
2015-10-12 David Schweikert <david@schweikert.ch>
* Version 3.11
* (feature) New option -R to use random bytes instead of NULLs (#72, Anthony DeRobertis)
* (feature) Small documentation and performance improvements (Ryan Underwood)
* (bugfix) Fix double entries with fping -u and unreachable hosts
* (internal) Use sockaddr_storage and simplify code, so that we can one day support both IPv4 and IPv6 with the same binary
2015-08-14 Carsten Larsen <carsten.larsen@mail.com>
* Initial AmigaOS version
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
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)
* Fix -A for fping6 (reported by Matt LaPlante, #14)
* Fix "options inet6" breaking IPv4 name resolution (reported by Matt LaPlante, #17)
* Output statistics to stdout instead of stderr (suggested by Simon Leinen, #9)
* 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)
2012-05-29 David Schweikert <david@schweikert.ch>
* Version 3.2
* Improve documentation for -g option (G.W. Haywood)
* Performance optimization for big select timeouts (#10, Andrey Bondarenko)
* Fix restart of select call after interrupt signal (#8, Boian Bonev)
* Fix infinite loop caused by linked list corruption (#11, Boian Bonev)
2012-04-26 David Schweikert <david@schweikert.ch>
* Version 3.1
* -g option (generate): exclude network and broadcast address for cidr
ranges (idea by Eric Brander)
* do not explicitely check if running as root, to make it possible to
install fping with linux capabilities instead of making it setuid
(setcap cap_net_raw+ep fping)
* ANSI C (C89) compiler now a requirement
* Portability fixes
* Reorganized source directory
* Bugfix: fix timeout issue on Solaris (Sandor Geller)
* Man-page fixes (Axel Beckert)
* Added -H option to specify number of hops (Paul Duda)
* Output usage information to stdout when called with -h (Paul Duda)
2011-12-28 David Schweikert <david@schweikert.ch>
* Version 3.0
* rewritten main loop for improved performance
* -T parameter (select timeout) now obsolete
* Maintenance taken over from unresponsive previous maintainer
(anybody please step up, if you disagree)
* New homepage: www.fping.org
2009-12-21 Tobi Oetiker <tobi@oetiker.ch>
* Version v2.4b2-to3-ipv6
* added -On option to set the TOS octet
* Removed unused variables from code
* updated to current autoconf standards
* Merged Debian changes (see below)
----------------------------------------------------------------------
fping (2.4b2-to-ipv6-16.1) unstable; urgency=low
* NMU during Moenchengladbach BSP
* Fixes FTBFS on kfreebsd (Closes: #555398)
* Fixes typo "Paramter" in binary
-- Axel Beckert <abe@deuxchevaux.org> Sat, 23 Jan 2010 16:22:02 +0100
fping (2.4b2-to-ipv6-16) unstable; urgency=low
* Fix the following bugs
- Network byte order sensitivity was missing completely.
Added hopefully all missing calls.
- The sequence numbering scheme used led to packet drops.
Changed it to a more senseful numbering scheme.
- Some minor C programming mistakes ('=' instead of '==').
Patch by Stephan Fuhrmann; closes: #502569
* Add support for command line select timeout setting
Patch by Marton Balint; closes: #502575
* Remove symlinks in /usr/sbin; closes: #377732
* Standards-Version is 3.8.0
-- Anibal Monsalve Salazar <anibal@debian.org> Sat, 18 Oct 2008 12:04:52 +1100
fping (2.4b2-to-ipv6-15) unstable; urgency=low
* Added interface binding (-I) for fping
Patch by Peter Naulls <peter@mushroomnetworks.com>
Closes: #439014
* Fixed a couple of typos in fping.8. Closes: #423180
* Added homepage control header
* Bumped Standards-Version to 3.7.3
* Fixed the following lintian issue:
- debian-rules-sets-DH_COMPAT
-- Anibal Monsalve Salazar <anibal@debian.org> Mon, 03 Mar 2008 17:46:17 +1100
fping (2.4b2-to-ipv6-13) unstable; urgency=low
* Fixed stdout flush problem, closes: #340146.
Patch by Bart Martens <bart.martens@advalvas.be>.
-- Anibal Monsalve Salazar <anibal@debian.org> Fri, 30 Dec 2005 08:30:09 +1100
fping (2.4b2-to-ipv6-12) unstable; urgency=low
* Fixed "problem with option -r (retry limit)", closes: #318402.
Patch by Qingning Huo <qingningh@lanware.co.uk>.
-- Anibal Monsalve Salazar <anibal@debian.org> Sat, 08 Oct 2005 21:26:35 +1000
fping (2.4b2-to-ipv6-11) unstable; urgency=low
* Fixed "would be useful to specify 'source address' like ping for multi
homed machines", closes: #198486.
Patch by Marc Haber <mh+debian-bugs@zugschlus.de>.
-- Anibal Monsalve Salazar <anibal@debian.org> Thu, 02 Jun 2005 08:14:54 +1000
fping (2.4b2-to-ipv6-10) unstable; urgency=low
* Fixed "unnecessary delay with the -c option after the last packet"
(Closes: #293856). Patch by Niko Tyni <ntyni@iki.fi>
-- Anibal Monsalve Salazar <anibal@debian.org> Sun, 06 Feb 2005 23:25:57 +1100
fping (2.4b2-to-ipv6-9) unstable; urgency=low
* Fixed "fping6 always does reverse lookup" (Closes: #273647).
Patch by Jeroen Massar and forwarded by Bernhard Schmidt <berni@birkenwald.de>
-- Anibal Monsalve Salazar <A.Monsalve.Salazar@IEEE.org> Mon, 10 Jan 2005 00:01:32 +1100
fping (2.4b2-to-ipv6-7) unstable; urgency=low
* Build fping in build/ipv[46] instead of build and build-ipv6.
* Made DNS errors non-fatal for IPv6 (closes: #198056).
-- Herbert Xu <herbert@debian.org> Fri, 20 Jun 2003 21:36:30 +1000
fping (2.4b2-to-ipv6-6) unstable; urgency=low
* Do not use incorrect linux.h file (closes: #85468).
-- Herbert Xu <herbert@debian.org> Sat, 17 May 2003 14:13:11 +1000
fping (2.4b2-to-ipv6-5) unstable; urgency=low
* Fixed yet another divide by zero bug (closes: #148445).
-- Herbert Xu <herbert@debian.org> Tue, 4 Jun 2002 12:18:03 +1000
fping (2.4b2-to-ipv6-4) unstable; urgency=low
* Made fping6 setuid (closes: #136386).
* Moved fping back into bin.
* Partially applied IPv6 patch to fix IPv6 checksums (closes: #136479).
-- Herbert Xu <herbert@debian.org> Sun, 7 Apr 2002 20:36:56 +1000
fping (2.4b2-to-ipv6-3) unstable; urgency=low
* Added compatibility symlink for fping (closes: #135203).
-- Herbert Xu <herbert@debian.org> Sat, 23 Feb 2002 08:34:11 +1100
fping (2.4b2-to-ipv6-2) unstable; urgency=low
* Fixed another divide by zero error (closes: #132370).
-- Herbert Xu <herbert@debian.org> Thu, 7 Feb 2002 20:10:48 +1100
fping (2.4b2-to-ipv6-1) unstable; urgency=low
* New upstream release.
* Install fping into sbin as done by upstream.
-- Herbert Xu <herbert@debian.org> Fri, 1 Feb 2002 22:11:59 +1100
fping (2.2b2-3) unstable; urgency=low
* Removed INSTALL file from package (closes: #84050).
* Fixed alignment bug.
-- Herbert Xu <herbert@debian.org> Sat, 10 Feb 2001 19:25:18 +1100
fping (2.2b2-2) unstable; urgency=low
* Made changes for dpkg-statoverride (closes: #83838).
-- Herbert Xu <herbert@debian.org> Sun, 28 Jan 2001 21:53:05 +1100
fping (2.2b2-1) unstable; urgency=low
* New upstream release.
* Fixed typo that prevented -d from working (closes: #83255).
* Drop root privileges after opening the socket (closes: #81589).
* Fixed the options [tip], they were out by a factor of 10
(Richard Kettlewell, closes: #83742).
-- Herbert Xu <herbert@debian.org> Sun, 28 Jan 2001 00:09:41 +1100
fping (2.2b1-2) unstable; urgency=low
* Fixed typo in control file, spotted by William Ono (closes: #49909).
-- Herbert Xu <herbert@debian.org> Mon, 15 May 2000 12:27:03 +1000
fping (2.2b1-1) unstable; urgency=low
* Initial release.
* Fixed divide by zero error (closes: #29902).
-- Herbert Xu <herbert@debian.org> Sat, 30 Oct 1999 16:36:19 +1000
---------------------------------------------------------------------------------
Wed Jan 16 2002
Jeroen Massar
- Revision v2.4b2-to-IPv6
- Added IPv6 support.
- Added -I option for selecting source IPv4/IPv6 address.
- Makefile.in now generates a Makefile which will build both
fping (IPv4) and fping6 (IPv6). Thus it makes an fping (IPv4 only)
and an fping6 (IPv6 only).
- num_unreachable was counted twice when a sendto() generated errors.
- See http://unfix.org/projects/ipv6/
Tue Mar 14 2001
Jason Ewasiuk <jasone@remote.net>
- Revision v2.4b1
- added -g option for generating IPs from a start to an end value
- two available options, generate IPs from start IP to end IP
or from a passed netmask, such as 192.168.1.0/24
Thu Feb 15 2001
Jason Ewasiuk <jasone@remote.net>
- Revision v2.3b1
- formatting changes to code layout (fping.c)
NOTE: Best viewed with a tab stop of 4
- merged in changes from Debian c/o Herbert Xu
<herbert@gondor.apana.org.au>
- Compilation fix on alphas with glibc
- Alignment issues (note from JE: in wait_for_reply())
- A typo with the time specified on the command line
(note from JE: bug was using 10 instead of 100)
- Drop privileges after obtaining socket
(note from JE: might be moot, since prog exits if
user is not root)
- touched all files in package to this date
- couple new #ifdefs added for future WIN32 support
(Haven't got to adding this yet, will take a lot of rewriting.)
Fri Dec 8 10:33:13 2000 Roland Schemers <schemers@stanford.edu>
* stop using sys_errlist and start using strerror
fixed bug in output of -C
Wed Jan 8 11:18:37 1997 Roland Schemers <schemers@stanford.edu>
* Created ChangeLog file. What follows was from the CHANGES file.
* Revision 2.0 1994/10/31 21:26:23 morgan
Substantial rewrite, including new features:
support some traditional ping features:
loop mode
specify size of data packets
specify how many pings to send
show per-response data
interpret ICMPs other than ICMP Echo response
also
rewrote main loop completely
make timings in tenths of milliseconds
do exponential backoff on retries
port to more systems
add some debugging stuff
do better checking on whether received ICMP is for us
* Revision 1.24 1993/12/10 23:11:39 schemers
commented out seteuid(getuid()) since it isn't needed
* Revision 1.23 1993/12/10 18:33:41 schemers
Took out the -f option for non-root users. This can be enabled by
defining ENABLE_F_OPTION before compiling. There is a call to
access before opening the file, but there is a race condition.
Reading from stdin is much safer.
* Revision 1.22 1993/11/16 19:49:24 schemers
Took out setuid(getuid()) and used access() system call to
check for access to the file specified with "-f".
* Revision 1.21 1993/07/20 18:08:19 schemers
commented out the test to make sure the ping packet came from the
same IP address as the one we sent to. This could cause problems on
multi-homed hosts.
* Revision 1.20 1993/02/23 00:16:38 schemers
fixed syntax error (should have compiled before checking in...)
* Revision 1.19 1993/02/23 00:15:15 schemers
turned off printing of "is alive" when -a is specified.
* Revision 1.18 1992/07/28 15:16:44 schemers
added a fflush(stdout) call before the summary is sent to stderr, so
everything shows up in the right order.
* Revision 1.17 1992/07/23 03:29:42 schemers
* Revision 1.16 1992/07/22 19:24:37 schemers
Fixed declaration of timeval_diff. Didn't notice the problem because
I use 'cc' in stead of gcc under Ultrix. Time to switch? :-)
Modified file reaing so it would skip blank lines or lines starting
with a '#'. Now you can do something like:
fping -ad < /etc/hosts
* Revision 1.15 1992/07/21 17:07:18 schemers
Put in sanity checks so only root can specify "dangerous" options.
Changed usage to show switchs in alphabetical order.
* Revision 1.14 1992/07/21 16:40:52 schemers
* Revision 1.13 1992/07/17 21:02:17 schemers
Changed the default timeout to 2500 msec, and retry to 3. This was
due to suggestions from people with slow (WAN) networks. The default
1 sec timeout was too fast.
Added '-e' option for showing elapsed (round-trip) times on pakets, and
modified the -s option to include min, max, and average round-trip times,
and over all elapsed time.
Modified action taken when a error is returned from sendto. The action
taken now considers the host unreachable and prints the hostname
followed by the errno message. The program will not exit and will continue
to try other hosts.
* Revision 1.12 1992/07/17 16:38:54 schemers
* Revision 1.11 1992/07/17 16:28:38 schemers
move socket create call so I could do a setuid(getuid()) before the
fopen call is made. Once the socket is created root privs aren't needed
to send stuff out on it.
moved num_timeout counter. It really was for debug purposes and didn't
make sense to the general public :-) Now it is the number of timeouts
(pings that didn't get received with the time limit).
* Revision 1.10 1992/07/16 16:24:38 schemers
* Revision 1.9 1992/07/16 16:00:04 schemers
* Revision 1.8 1992/07/16 05:44:41 schemers
Added _NO_PROTO stuff for older compilers, and _POSIX_SOURCE
for unistd.h, and _POSIX_SOURCE for stdlib.h. Also added
check for __cplusplus.
Now compiles ok under Ultrix 3.1, and Sun4 using cc. Also compiled
ok using g++ 2.2.2.
Changed '-a' and '-u' flags to be mutually exclusive (makes sense, since
specifiying both '-a' and '-u' is the same as not specifiying anything.
Since '-a' and '-u' are mutually exclusive, these options now only print
the hostname, and not the 'is alive' or 'is unreachable' messages.
This makes it much easier to do stuff like:
#!/usr/local/bin/perl
$hosts_to_backup=`cat /etc/hosts.backup|fping -a`;
Since you don't have to strip off the 'is alive' messages.
Changed usage to and stats to print to stderr instead of stdout.
-----------------------------------------------------------------------------
RCS header info from original fping.c package (no longer required)
/*
***************************************************
*
* Standard RCS Header information (see co(1))
*
* $Author: schemers $
*
* $Date: 1997/01/08 20:29:33 $
*
* $Revision: 2.2 $
*
* $Locker: $
*
* $Source: /afs/ir/group/networking/src/fping/fping-2.2/src/RCS/fping.c,v $
*
* $State: Exp $
*
* $Log: fping.c,v $
*
* Revision 2.2 1997/01/08 20:29:33 schemers
* changes for autoconf/automake
*
* Revision 2.1 1997/01/08 19:07:18 schemers
* checked in RL "Bob"'s changes before configure'ing
*
* Revision 2.0 1994/10/31 21:26:23 schemers
* many changes by RL "Bob" Morgan
* add timing data collection, loop mode, per-packet output, etc
*
* Revision 1.24 1993/12/10 23:11:39 schemers
* commented out seteuid(getuid()) since it isn't needed
*
* Revision 1.23 1993/12/10 18:33:41 schemers
* Took out the -f option for non-root users. This can be enabled by
* defining ENABLE_F_OPTION before compiling. There is a call to
* access before opening the file, but there is a race condition.
* Reading from stdin is much safer.
*
* Revision 1.22 1993/11/16 19:49:24 schemers
* Took out setuid(getuid()) and used access() system call to
* check for access to the file specified with "-f".
*
* Revision 1.21 1993/07/20 18:08:19 schemers
* commented out the test to make sure the ping packet came from the
* same IP address as the one we sent to. This could cause problems on
* multi-homed hosts.
*
* Revision 1.20 1993/02/23 00:16:38 schemers
* fixed syntax error (should have compiled before checking in...)
*
* Revision 1.19 1993/02/23 00:15:15 schemers
* turned off printing of "is alive" when -a is specified.
*
* Revision 1.18 1992/07/28 15:16:44 schemers
* added a fflush(stdout) call before the summary is sent to stderr, so
* everything shows up in the right order.
*
* Revision 1.17 1992/07/23 03:29:42 schemers
* fixed declaration of timeval_diff.
*
* Revision 1.16 1992/07/22 19:24:37 schemers
* Modified file reading so it would skip blanks lines or lines starting
* with a '#'. Now you can do something like:
*
* fping -ad < /etc/hosts
*
* Revision 1.15 1992/07/21 17:07:18 schemers
* Put in sanity checks so only root can specify "dangerous" options.
* Changed usage to show switchs in alphabetical order.
*
* Revision 1.14 1992/07/21 16:40:52 schemers
* Now when sendto returns an error, the host is considered unreachable and
* and the error message (from errno) is displayed.
*
* Revision 1.13 1992/07/17 21:02:17 schemers
* changed default timeout to 2500 msec (for WANs), and default try
* to 3. This gives 10 second overall timeout.
*
* Added -e option for showing elapsed (round-trip) time on packets
*
* Modified -s option to inlude to round-trip stats
*
* Added #ifndef DEFAULT_* stuff its easier to change the defaults
*
* Reorganized main loop.
*
* cleaned up timeval stuff. removed set_timeval and timeval_expired
* since they aren't needed anymore. Just use timeval_diff.
*
* Revision 1.12 1992/07/17 16:38:54 schemers
* move socket create call so I could do a setuid(getuid()) before the
* fopen call is made. Once the socket is created root privs aren't needed
* to send stuff out on it.
*
* Revision 1.11 1992/07/17 16:28:38 schemers
* moved num_timeout counter. It really was for debug purposes and didn't
* make sense to the general public :-) Now it is the number of timeouts
* (pings that didn't get received with the time limit).
*
* Revision 1.10 1992/07/16 16:24:38 schemers
* changed usage() to use fprintf(stderr,"...");
*
* Revision 1.9 1992/07/16 16:00:04 schemers
* Added _NO_PROTO stuff for older compilers, and _POSIX_SOURCE
* for unistd.h, and _POSIX_SOURCE for stdlib.h. Also added
* check for __cplusplus.
*
* Revision 1.8 1992/07/16 05:44:41 schemers
* changed -a and -u to only show hostname in results. This is
* for easier parsing. Also added -v flag
*
* Revision 1.7 1992/07/14 18:45:23 schemers
* initialized last_time in add_host function
*
* Revision 1.6 1992/07/14 18:32:40 schemers
* changed select to use FD_ macros
*
* Revision 1.5 1992/07/14 17:21:22 schemers
* standardized exit status codes
*
* Revision 1.4 1992/06/26 15:25:35 schemers
* changed name from rrping to fping
*
* Revision 1.3 1992/06/24 15:39:32 schemers
* added -d option for unreachable systems
*
* Revision 1.2 1992/06/23 03:01:23 schemers
* misc fixes from R.L. "Bob" Morgan
*
* Revision 1.1 1992/06/19 18:23:52 schemers
* Initial revision
*
*--------------------------------------------------
* Copyright (c) 1992, 1994, 1997 Board of Trustees
* Leland Stanford Jr. University
***************************************************
*/
+25 -13
View File
@@ -3,34 +3,46 @@
all: fping
CC = gcc
CFLAGS = -O2 -DAROS -I. -Iinclude -Wall -Werror
CFLAGS = -O2 -DAROS -I. -D_DEBUG -Wall -Werror
LDLIBS = -lm
config.h: inet_getaddrinfo.h
touch config.h
build_date.h:
echo "#define BUILD_DATE \"$$(date -u)"\" >build_date.h
fping.o: fping.c config.h fping.h options.h seqmap.h
fping.h: mem.h
touch fping.h
fping_amiga.o: fping_amiga.c config.h
getaddrinfo.h: fping.h
touch getaddrinfo.h
inet_getaddrinfo.o: inet_getaddrinfo.c fping.h inet_getaddrinfo.h
fping.o: fping.c build_date.h fping.h getaddrinfo.h options.h seqmap.h
inet_ntop.o: inet_ntop.c
fping_amiga.o: fping_amiga.c fping.h getaddrinfo.h
inet_pton.o: inet_pton.c
getaddrinfo.o: getaddrinfo.c fping.h getaddrinfo.h
ntop.o: ntop.c
pton.o: pton.c
seqmap.o: seqmap.c options.h seqmap.h
socket.o: socket.c config.h fping.h
socket.o: socket.c fping.h
socket4.o: socket4.c config.h fping.h
socket4.o: socket4.c fping.h
mem.o: mem.c mem.h
getopt.o: getopt.c getopt.h
rand.o: rand.c
fping: fping.o fping_amiga.o inet_getaddrinfo.o inet_ntop.o inet_pton.o seqmap.o socket.o socket4.o
${CC} ${CFLAGS} -s -o fping fping.o fping_amiga.o inet_getaddrinfo.o inet_ntop.o inet_pton.o seqmap.o socket.o socket4.o ${LDLIBS}
fping: fping.o fping_amiga.o getaddrinfo.o ntop.o pton.o seqmap.o socket.o socket4.o mem.o getopt.o rand.o
${CC} ${CFLAGS} -s -o fping fping.o fping_amiga.o getaddrinfo.o ntop.o pton.o seqmap.o socket.o socket4.o mem.o getopt.o rand.o ${LDLIBS}
clean:
rm -f fping.o fping_amiga.o inet_getaddrinfo.o inet_ntop.o inet_pton.o seqmap.o socket.o socket4.o fping
rm -f fping.o fping_amiga.o getaddrinfo.o ntop.o pton.o seqmap.o socket.o socket4.o mem.o getopt.o rand.o build_date.h fping
depend:
@echo Dependencies already done
+26 -14
View File
@@ -3,34 +3,46 @@
all: fping
CC = m68k-amigaos-gcc
CFLAGS = -O2 -noixemul -DAOS3 -I. -I.. -Iinclude -Wall -Werror
LDLIBS = -liberty -lm
CFLAGS = -O2 -noixemul -DAOS3 -D_DEBUG -I. -I.. -Iinclude -Wall -Werror
LDLIBS = -lm
config.h: inet_getaddrinfo.h
touch config.h
build_date.h:
echo "#define BUILD_DATE \"$$(date -u)"\" >build_date.h
fping.o: fping.c config.h fping.h options.h seqmap.h
fping.h: mem.h
touch fping.h
fping_amiga.o: fping_amiga.c config.h
getaddrinfo.h: fping.h
touch getaddrinfo.h
inet_getaddrinfo.o: inet_getaddrinfo.c fping.h inet_getaddrinfo.h
fping.o: fping.c build_date.h fping.h getaddrinfo.h options.h seqmap.h
inet_ntop.o: inet_ntop.c
fping_amiga.o: fping_amiga.c fping.h getaddrinfo.h
inet_pton.o: inet_pton.c
getaddrinfo.o: getaddrinfo.c fping.h getaddrinfo.h
ntop.o: ntop.c
pton.o: pton.c
seqmap.o: seqmap.c options.h seqmap.h
socket.o: socket.c config.h fping.h
socket.o: socket.c fping.h
socket4.o: socket4.c config.h fping.h
socket4.o: socket4.c fping.h
mem.o: mem.c mem.h
getopt.o: getopt.c getopt.h
rand.o: rand.c
fping: fping.o fping_amiga.o inet_getaddrinfo.o inet_ntop.o inet_pton.o seqmap.o socket.o socket4.o
${CC} ${CFLAGS} -s -o fping fping.o fping_amiga.o inet_getaddrinfo.o inet_ntop.o inet_pton.o seqmap.o socket.o socket4.o ${LDLIBS}
fping: fping.o fping_amiga.o getaddrinfo.o ntop.o pton.o seqmap.o socket.o socket4.o mem.o getopt.o rand.o
${CC} ${CFLAGS} -s -o fping fping.o fping_amiga.o getaddrinfo.o ntop.o pton.o seqmap.o socket.o socket4.o mem.o getopt.o rand.o ${LDLIBS}
clean:
rm -f fping.o fping_amiga.o inet_getaddrinfo.o inet_ntop.o inet_pton.o seqmap.o socket.o socket4.o fping
rm -f fping.o fping_amiga.o getaddrinfo.o ntop.o pton.o seqmap.o socket.o socket4.o mem.o getopt.o rand.o build_date.h fping
depend:
@echo Dependencies already done
-81
View File
@@ -1,81 +0,0 @@
/* config.h. Generated from config.h.in by configure. */
/* config.h.in. Generated from configure.ac by autoheader. */
#ifndef CONFIG_H
#define CONFIG_H
#include "inet_getaddrinfo.h"
#ifdef AROS
/* Define to 1 if you have the <inttypes.h> header file. */
# define HAVE_INTTYPES_H 1
#endif
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
#ifdef AROS
/* Define to 1 if you have the <stdint.h> header file. */
# define HAVE_STDINT_H 1
#endif
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the <sys/file.h> header file. */
#define HAVE_SYS_FILE_H 1
/* Define to 1 if you have the <sys/select.h> header file. */
/* #undef HAVE_SYS_SELECT_H */
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Name of package */
#define PACKAGE "fping"
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT ""
/* Define to the full name of this package. */
#define PACKAGE_NAME "fping"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "fping 3.10"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "fping"
/* Define to the home page for this package. */
#define PACKAGE_URL ""
/* Define to the version of this package. */
#define PACKAGE_VERSION "3.10"
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Version number of package */
#define VERSION "3.10"
/* some OSes do not define this ... lets take a wild guess */
#ifndef INADDR_NONE
# define INADDR_NONE 0xffffffffU
#endif
#endif /* CONFIG_H */
+20 -10
View File
@@ -1,6 +1,6 @@
#!/bin/sh
#
# Copyright (c) 2015 Carsten Larsen
# Copyright (c) 2015, 16 Carsten Larsen
# Copyright (c) 2014 Poul-Henning Kamp
# All rights reserved.
#
@@ -29,22 +29,26 @@
set -e
HDRS='
config.h
fping.h
inet_getaddrinfo.h
getaddrinfo.h
options.h
seqmap.h
mem.h
getopt.h
'
SRCS='
fping.c
fping_amiga.c
inet_getaddrinfo.c
inet_ntop.c
inet_pton.c
getaddrinfo.c
ntop.c
pton.c
seqmap.c
socket.c
socket4.c
mem.c
getopt.c
rand.c
'
if make -v 2>&1 | grep GNU > /dev/null 2>&1 ; then
@@ -61,19 +65,25 @@ if $VALID ; then
echo ''
echo 'all: fping'
echo ''
if [ -n "$2" ] && [ $2 = "DEBUG" ] ; then
DEBUG="-D_DEBUG "
fi
if [ -n "$1" ] && [ $1 = "AMIGA" ] ; then
echo 'CC = m68k-amigaos-gcc'
echo "CFLAGS = -O2 -noixemul -DAOS3 -I. -I.. -Iinclude -Wall -Werror"
echo "LDLIBS = -liberty -lm"
echo "CFLAGS = -O2 -noixemul -DAOS3 ${DEBUG}-I. -I.. -Iinclude -Wall -Werror"
echo "LDLIBS = -lm"
elif [ -n "$1" ] && [ $1 = "AROS" ] ; then
echo 'CC = gcc'
echo "CFLAGS = -O2 -DAROS -I. -Iinclude -Wall -Werror"
echo "CFLAGS = -O2 -DAROS -I. ${DEBUG}-Wall -Werror"
echo "LDLIBS = -lm"
else
echo "CFLAGS = -O2 -Wall -Werror"
echo "LDLIBS = -lm"
fi
echo ''
echo 'build_date.h:'
echo ' echo "#define BUILD_DATE \"$$(date -u)"\" >build_date.h'
echo ''
for f in ${HDRS}
do
@@ -109,7 +119,7 @@ if $VALID ; then
echo " \${CC} \${CFLAGS} -s -o fping ${l} \${LDLIBS}"
echo
echo "clean:"
echo " rm -f ${l} fping"
echo " rm -f ${l} build_date.h fping"
echo
echo "depend:"
echo " @echo Dependencies already done"
+261 -544
View File
File diff suppressed because it is too large Load Diff
+125 -13
View File
@@ -1,34 +1,139 @@
/*
* Written by Carsten Larsen.
* Public domain.
*/
#ifndef _FPING_H
#define _FPING_H
#define __APPLE_USE_RFC_3542 1
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
#include <clib/timer_protos.h>
#include <clib/utility_protos.h>
#include <utility/date.h>
#include <devices/timer.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/file.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <stdarg.h>
#include "mem.h"
#define calloc(x, y) allocmem(x*y)
#define malloc(x) allocmem(x)
#define free(x) freemem(x)
#ifdef AOS3
#include <clib/exec_protos.h>
#include <clib/amitcp_protos.h>
# include <clib/amitcp_protos.h>
# include <amitcp/socketbasetags.h>
# include <machine/types.h>
# define uint16_t u_int16_t
# define IPTR ULONG
# define ANSI_CONSOLE 1
# define gettimeofday(x, y) getsystime(x)
typedef unsigned int socklen_t;
typedef unsigned int sa_family_t;
#endif
#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
typedef u_int16_t in_port_t;
#ifdef AROS
# include <inttypes.h>
# include <sys/time.h>
# define Socket(a,b,c) socket(a,b,c)
# define Bind(a,b,c) bind(a,b,c)
# define RecvFrom(a,b,c,d,e,f) recvfrom(a,b,c,d,e,f)
# define SendTo(a,b,c,d,e,f) sendto(a,b,c,d,e,f)
#endif
#ifdef AOS3
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_t ai_addrlen;
char *ai_canonname;
struct sockaddr *ai_addr;
struct addrinfo *ai_next;
};
#endif
#define FPING_SOCKADDR struct sockaddr_in
#ifndef IPV6
# define FPING_INADDR struct in_addr
# define FPING_ICMPHDR struct icmp
#else
# define FPING_INADDR struct in6_addr
# define FPING_ICMPHDR struct icmp6_hdr
#endif
#ifndef INADDR_NONE
# define INADDR_NONE 0xffffffffU
#endif
#ifndef PF_INET6
# define PF_INET6 10
#endif
#ifndef AF_INET6
# define AF_INET6 PF_INET6
#endif
#ifndef INET_ADDRSTRLEN
# define INET_ADDRSTRLEN 16
#endif
#ifndef INET6_ADDRSTRLEN
# define INET6_ADDRSTRLEN 46
#endif
#if defined( DEBUG ) || defined( _DEBUG )
# define DEBUG_TEXT "b"
#else
# define DEBUG_TEXT ""
#endif
#ifdef AOS3
# define random() rand()
# define srandom() srand()
#endif
#define PACKAGE_NAME "fping"
#define PACKAGE_VERSION "3.13"
/* No TTL (time to live) in socket options */
#define NOTTL 1
/* No TOS (type of service) in socket options */
#define NOTOS 1
#define SIGNAL ULONG
/* fping.c */
void crash_and_burn( char *message );
void errno_crash_and_burn( char *message );
int in_cksum( unsigned short *p, int n );
int random_data_flag;
char *prog;
unsigned int debugging;
/* socket.c */
int open_ping_socket();
int open_ping_socket();
void init_ping_buffer(size_t ping_data_size);
void socket_set_src_addr(int s, FPING_INADDR src_addr);
int socket_sendto_ping(int s, struct sockaddr *saddr, socklen_t saddr_len, uint16_t icmp_seq, uint16_t icmp_id);
void close_ping_socket();
void cleanup_ping_buffer();
/* inet_ntop.c */
const char *inet_ntop(int af, const void *src, char *dst, size_t size);
@@ -38,6 +143,13 @@ int inet_pton(int af, const char *src, void *dst);
/* fping_amiga.c */
int open_libs();
int getsystime(struct timeval *tv);
extern struct Library *SocketBase;
extern int errno;
#ifndef AROS
extern int h_errno;
#endif
#endif
+121 -17
View File
@@ -3,19 +3,21 @@
* Public domain.
*/
#include <stdio.h>
#include <stdlib.h>
#include <clib/exec_protos.h>
#include "fping.h"
#include "getaddrinfo.h"
#define OPEN_ERROR "Cannot open %s.\n"
#define OPEN_VER_ERROR "Cannot open %s (%d.0)\n"
#define DOSLIB_NAME "dos.library"
#define DOSLIB_REV 37L
#define BSDLIB_NAME "bsdsocket.library"
#define BSDLIB_REV 03L
#define DOSLIB_NAME "dos.library"
#define DOSLIB_REV 37L
#define BSDLIB_NAME "bsdsocket.library"
#define BSDLIB_REV 03L
#define UTILLIB_NAME "utility.library"
#define UTILLIB_REV 37L
#define TIMER_NAME TIMERNAME
#define LIB_ERROR 4
#include "config.h"
const char *vers = "\0$VER: " PACKAGE_NAME " " PACKAGE_VERSION " (15.08.2015)";
const char *vers = "\0$VER: " PACKAGE_NAME " " PACKAGE_VERSION " (21.02.2016)";
#include <unistd.h>
#ifdef AOS3
@@ -30,8 +32,14 @@ int setuid (uid_t id) {
int h_errno;
#endif
struct Library *DOSBase;
struct Library *SocketBase;
struct Library* DOSBase = NULL;
struct Library* SocketBase = NULL;
struct Library* UtilityBase = NULL;
struct Device* TimerBase = NULL;
struct timerequest* TimeRequest = NULL;
int create_timer();
void delete_timer();
void amiga_open_error(char *name)
{
@@ -45,30 +53,126 @@ void amiga_open_lib_error(char *name, int version)
void close_libs()
{
if (DOSBase != NULL) {
CloseLibrary(DOSBase);
DOSBase = NULL;
close_ping_socket();
cleanup_ping_buffer();
if (TimerBase != NULL) {
delete_timer();
}
if (UtilityBase != NULL) {
CloseLibrary(UtilityBase);
UtilityBase = NULL;
}
if (SocketBase != NULL) {
CloseLibrary(SocketBase);
SocketBase = NULL;
}
freeall();
if (DOSBase != NULL) {
CloseLibrary(DOSBase);
DOSBase = NULL;
}
}
int open_libs()
{
struct timeval tv;
atexit(close_libs);
InitSemaphore(&GetaddrinfoSemaphore);
if(!(DOSBase = OpenLibrary((STRPTR)DOSLIB_NAME, DOSLIB_REV))) {
amiga_open_lib_error(DOSLIB_NAME, DOSLIB_REV);
return 5;
return LIB_ERROR;
}
if(!(SocketBase = OpenLibrary((STRPTR)BSDLIB_NAME, BSDLIB_REV))) {
amiga_open_lib_error(BSDLIB_NAME, BSDLIB_REV);
return 5;
return LIB_ERROR;
} else {
SocketBaseTags(
SBTM_SETVAL(SBTC_ERRNOPTR(sizeof(errno))), (IPTR) &errno,
SBTM_SETVAL(SBTC_HERRNOLONGPTR), (IPTR) &h_errno,
SBTM_SETVAL(SBTC_LOGTAGPTR), (IPTR) &prog,
TAG_DONE );
}
if(!(UtilityBase = OpenLibrary((STRPTR)UTILLIB_NAME, UTILLIB_REV))) {
amiga_open_lib_error(UTILLIB_NAME, UTILLIB_REV);
return LIB_ERROR;
}
if (create_timer() != 0) {
amiga_open_error(TIMER_NAME);
return LIB_ERROR;
}
gettimeofday(&tv, NULL);
srand(tv.tv_usec);
return 0;
}
#ifdef AOS3
int create_timer()
{
LONG error;
struct MsgPort *port = CreatePort(0, 0);
if (port == NULL)
return 1;
TimeRequest = (struct timerequest*)CreateExtIO(port, sizeof(struct timerequest));
if (TimeRequest == NULL)
{
DeletePort(port);
return 1;
}
error = OpenDevice(
(STRPTR)TIMER_NAME, UNIT_MICROHZ,
(struct IORequest*)TimeRequest, 0L
);
if (error != 0)
{
delete_timer(TimeRequest);
return 1;
}
TimerBase = (struct Device*)TimeRequest->tr_node.io_Device;
return 0;
}
void delete_timer()
{
struct MsgPort *port;
if (TimeRequest == NULL)
return;
port = TimeRequest->tr_node.io_Message.mn_ReplyPort;
if (port != 0)
DeletePort(port);
CloseDevice((struct IORequest*)TimeRequest);
DeleteExtIO((struct IORequest*)TimeRequest);
}
int getsystime(struct timeval *tv)
{
struct timeval tv1;
GetSysTime(&tv1);
*tv = tv1;
return 0;
}
#else
int create_timer() { return 0; }
void delete_timer() { }
#endif
+7 -23
View File
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015 Carsten Larsen
* Copyright (c) 2015, 16 Carsten Larsen
* Copyright (c) 2001, 02 Motoyuki Kasahara
*
* Redistribution and use in source and binary forms, with or without
@@ -60,11 +60,7 @@
#include <netdb.h>
#include "fping.h"
#include "inet_getaddrinfo.h"
#ifdef ENABLE_PTHREAD
#include <pthread.h>
#endif
#include "getaddrinfo.h"
#ifdef ENABLE_NLS
#include <libintl.h>
@@ -133,9 +129,7 @@ static struct addrinfo default_hints = {
/*
* Mutex.
*/
#ifdef ENABLE_PTHREAD
static pthread_mutex_t gai_mutex = PTHREAD_MUTEX_INITIALIZER;
#endif
struct SignalSemaphore GetaddrinfoSemaphore;
/*
* Declaration of static functions.
@@ -276,10 +270,7 @@ struct addrinfo **res;
int saved_h_errno;
int result = 0;
#ifdef ENABLE_PTHREAD
pthread_mutex_lock(&gai_mutex);
#endif
ObtainSemaphore(&GetaddrinfoSemaphore);
saved_h_errno = h_errno;
if (nodename == NULL && servname == NULL) {
@@ -434,9 +425,7 @@ struct addrinfo **res;
end:
h_errno = saved_h_errno;
#ifdef ENABLE_PTHREAD
pthread_mutex_unlock(&gai_mutex);
#endif
ReleaseSemaphore(&GetaddrinfoSemaphore);
return result;
}
@@ -449,10 +438,7 @@ int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *node, socklen_
int saved_h_errno;
int result = 0;
#ifdef ENABLE_PTHREAD
pthread_mutex_lock(&gai_mutex);
#endif
ObtainSemaphore(&GetaddrinfoSemaphore);
saved_h_errno = h_errno;
if (sa_in->sin_family != PF_INET) {
@@ -516,8 +502,6 @@ int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *node, socklen_
end:
h_errno = saved_h_errno;
#ifdef ENABLE_PTHREAD
pthread_mutex_unlock(&gai_mutex);
#endif
ReleaseSemaphore(&GetaddrinfoSemaphore);
return result;
}
+7 -3
View File
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015 Carsten Larsen
* Copyright (c) 2015, 16 Carsten Larsen
* Copyright (c) 2001, 02 Motoyuki Kasahara
*
* Redistribution and use in source and binary forms, with or without
@@ -33,6 +33,8 @@
#include <sys/types.h>
#include <netdb.h>
#include "fping.h"
/********************************************************************/
/*
* Undefine all the macros.
@@ -184,15 +186,17 @@
/*
* Address families and Protocol families.
*/
#if 0
#ifndef AF_UNSPEC
#define AF_UNSPEC AF_INET
#endif
#ifndef PF_UNSPEC
#define PF_UNSPEC PF_INET
#endif
#endif
typedef u_int16_t in_port_t;
typedef unsigned int sa_family_t;
#include <exec/types.h>
extern struct SignalSemaphore GetaddrinfoSemaphore;
const char* gai_strerror(int);
void freeaddrinfo(struct addrinfo *);
+117
View File
@@ -0,0 +1,117 @@
/*
* getopt.c --
*
* Standard UNIX getopt function. Code is from BSD.
*
* Copyright (c) 1987-2002 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* A. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* B. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* C. Neither the names of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
* IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/* #if !defined(lint)
* static char sccsid[] = "@(#)getopt.c 8.2 (Berkeley) 4/2/94";
* #endif
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "getopt.h"
int opterr = 1, /* if error message should be printed */
optind = 1, /* index into parent argv vector */
optopt, /* character checked for validity */
optreset; /* reset getopt */
char *optarg; /* argument associated with option */
#define BADCH (int)'?'
#define BADARG (int)':'
#define EMSG ""
/*
* getopt --
* Parse argc/argv argument vector.
*/
int
getopt( int nargc,
char * const *nargv,
const char *ostr)
{
static char *place = EMSG; /* option letter processing */
char *oli; /* option letter list index */
if (optreset || !*place) { /* update scanning pointer */
optreset = 0;
if (optind >= nargc || *(place = nargv[optind]) != '-') {
place = EMSG;
return (EOF);
}
if (place[1] && *++place == '-') { /* found "--" */
++optind;
place = EMSG;
return (EOF);
}
} /* option letter okay? */
if ((optopt = (int)*place++) == (int)':' ||
!(oli = (char*) strchr(ostr, optopt))) {
/*
* if the user didn't specify '-' as an option,
* assume it means EOF.
*/
if (optopt == (int)'-')
return (EOF);
if (!*place)
++optind;
if (opterr && *ostr != ':')
(void)fprintf(stderr,
"illegal option -- %c\n", optopt);
return (BADCH);
}
if (*++oli != ':') { /* don't need argument */
optarg = NULL;
if (!*place)
++optind;
}
else { /* need an argument */
if (*place) /* no white space */
optarg = place;
else if (nargc <= ++optind) { /* no arg */
place = EMSG;
if (*ostr == ':')
return (BADARG);
if (opterr)
(void)fprintf(stderr,
"option requires an argument -- %c\n",
optopt);
return (BADCH);
}
else /* white space */
optarg = nargv[optind];
place = EMSG;
++optind;
}
return (optopt); /* dump back option letter */
}
+51
View File
@@ -0,0 +1,51 @@
#ifndef _HAD_GETOPT_H
#define _HAD_GETOPT_H
/*
getopt.h -- header for getopt() replacement function
Copyright (C) 1999-2011 Dieter Baron and Thomas Klausner
This file is part of libzip, a library to manipulate ZIP archives.
The authors can be contacted at <libzip@nih.at>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
3. The names of the authors may not be used to endorse or promote
products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef __cplusplus
extern "C" {
#endif
extern char *optarg;
extern int optind;
extern int opterr;
extern int getopt(int, char * const *, const char *);
#ifdef __cplusplus
}
#endif
#endif /* _HAD_GETOPT_H */
+253
View File
@@ -0,0 +1,253 @@
//--------------------------------------------------------------------------//
// This file is in the public domain. //
//--------------------------------------------------------------------------//
#include <stddef.h>
#include <string.h>
#include <exec/io.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/semaphores.h>
#include <clib/exec_protos.h>
//--------------------------------------------------------------------------//
#include "mem.h"
//--------------------------------------------------------------------------//
#if defined( DEBUG ) || defined( _DEBUG )
# include <stdio.h>
# define DBG_MEMORY 128
# define DBG_MEMORY_ADDR 256
#endif
//--------------------------------------------------------------------------//
struct MemoryBlock
{
struct MemoryBlock *next;
size_t size;
void *address;
};
//--------------------------------------------------------------------------//
struct MemoryList
{
struct MemoryBlock *first;
struct MemoryBlock *last;
long size;
long count;
long opcount;
};
//--------------------------------------------------------------------------//
static struct MemoryList *list = NULL;
//--------------------------------------------------------------------------//
void allocerror(char*, size_t);
void deallocerror(char*, void*);
//--------------------------------------------------------------------------//
void* allocmem(size_t size)
{
struct MemoryBlock *newblock;
size_t allocsize;
if (list == NULL) {
list =
(struct MemoryList*)
AllocVec(sizeof(struct MemoryList), MEMF_ANY | MEMF_CLEAR);
if (!list) {
allocerror("list", sizeof(struct MemoryList));
return 0;
}
list->first = NULL;
list->last = NULL;
list->size = 0;
list->count = 0;
}
// Align to bytes of 4
allocsize = (size + 3) & ~0x03;
newblock =
(struct MemoryBlock*)
AllocVec(sizeof(struct MemoryBlock), MEMF_ANY | MEMF_CLEAR);
if (!newblock) {
allocerror("block", sizeof(struct MemoryBlock));
return 0;
}
newblock->address =
(struct MemoryBlock*)
AllocVec(allocsize, MEMF_ANY | MEMF_CLEAR);
if (!newblock->address) {
FreeVec(newblock);
allocerror("memory", allocsize);
return 0;
}
newblock->size = allocsize;
newblock->next = NULL;
if(list->first == NULL) {
list->first = newblock;
list->last = newblock;
} else {
list->last->next = newblock;
list->last = newblock;
}
list->size += allocsize;
list->count++;
list->opcount++;
#if defined( DEBUG ) || defined( _DEBUG )
if ( debugging & DBG_MEMORY_ADDR && list->opcount % 25 == 0) {
fprintf(stderr,
"Memory usage: %ld bytes allocated in %ld blocks.\n",
list->size,
list->count
);
}
#endif
#if defined( DEBUG ) || defined( _DEBUG )
if( debugging & DBG_MEMORY_ADDR )
{
fprintf(stderr,
"Memory allocated at address (%X)\n",
(unsigned int)newblock->address);
}
#endif
return newblock->address;
}
//--------------------------------------------------------------------------//
void freemem(void* block)
{
struct MemoryBlock *current, *last;
if (list == NULL || block == NULL) {
deallocerror("list", 0);
return;
}
if (block == NULL) {
deallocerror("memory", 0);
return;
}
last = NULL;
current = list->first;
while (current != NULL && current->address != block) {
last = current;
current = current->next;
}
if (current == NULL) {
deallocerror("address not found", block);
return;
}
list->size -= current->size;
list->count--;
if (list->first == current) {
list->first = NULL;
list->last = NULL;
} else if (list->last == current) {
last->next = current->next;
list->last = last;
} else {
last->next = current->next;
}
FreeVec(current->address);
FreeVec(current);
list->opcount++;
#if defined( DEBUG ) || defined( _DEBUG )
if( debugging & DBG_MEMORY_ADDR )
{
fprintf(stderr,
"Memory deallocated at address (%X)\n",
(unsigned int)block);
}
#endif
}
void freeall()
{
struct MemoryBlock *current, *next;
if (list == NULL) {
return;
}
#if defined( DEBUG ) || defined( _DEBUG )
if( debugging & DBG_MEMORY )
{
fprintf(stderr,
"Cleaning up (%ld) bytes in (%ld) blocks.\n",
list->size,
list->count
);
}
#endif
current = list->first;
while (current != NULL) {
next = current->next;
FreeVec(current->address);
FreeVec(current);
current = next;
}
FreeVec(list);
list = NULL;
}
//--------------------------------------------------------------------------//
void allocerror(char *descr, size_t size)
{
#if defined( DEBUG ) || defined( _DEBUG )
if( debugging & DBG_MEMORY_ADDR )
{
fprintf(stderr,
"Memory allocation error (%s) with size (%ld)\n",
descr,
size);
}
#endif
}
void deallocerror(char *descr, void *p)
{
#if defined( DEBUG ) || defined( _DEBUG )
if( debugging & DBG_MEMORY_ADDR )
{
fprintf(stderr,
"Memory deallocation error (%s) address (%X)\n",
descr,
(unsigned int)p);
}
#endif
}
//--------------------------------------------------------------------------//
char *strdup(const char *s1)
{
char *s2;
size_t len = strlen(s1);
s2 = allocmem(++len);
if(s2 == NULL)
{
return NULL;
}
memcpy(s2, s1, --len);
return s2;
}
//--------------------------------------------------------------------------//
+18
View File
@@ -0,0 +1,18 @@
//--------------------------------------------------------------------------//
// This file is in the public domain. //
//--------------------------------------------------------------------------//
#ifndef AMIGA_MEM_H
#define AMIGA_MEM_H
//--------------------------------------------------------------------------//
#include <stddef.h>
//--------------------------------------------------------------------------//
void* allocmem(size_t);
void freemem(void*);
void freeall();
//--------------------------------------------------------------------------//
#define strdup(s) managed_strdup(s)
char *strdup(const char *s1);
//--------------------------------------------------------------------------//
extern unsigned int debugging;
//--------------------------------------------------------------------------//
#endif
+5 -8
View File
@@ -1,4 +1,5 @@
/*
* Copyright (c) 2016 - Carsten Larsen
* Copyright (c) 1999 - 2001 Kungliga Tekniska Högskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
@@ -32,13 +33,9 @@
*
* $Heimdal: inet_ntop.c 21005 2007-06-08 01:54:35Z lha $
* $NetBSD: inet_ntop.c,v 1.2 2008/03/22 08:37:21 mlelstv Exp $
*
*
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -86,7 +83,7 @@ inet_ntop_v4 (const void *src, char *dst, size_t size)
return orig_dst;
}
#ifdef HAVE_IPV6
#ifdef IPV6
static const char *
inet_ntop_v6 (const void *src, char *dst, size_t size)
{
@@ -123,7 +120,7 @@ inet_ntop_v6 (const void *src, char *dst, size_t size)
*dst++ = '\0';
return orig_dst;
}
#endif /* HAVE_IPV6 */
#endif /* IPV6 */
const char *
inet_ntop(int af, const void *src, char *dst, size_t size)
@@ -131,7 +128,7 @@ inet_ntop(int af, const void *src, char *dst, size_t size)
switch (af) {
case AF_INET :
return inet_ntop_v4 (src, dst, size);
#ifdef HAVE_IPV6
#ifdef IPV6
case AF_INET6 :
return inet_ntop_v6 (src, dst, size);
#endif
+7 -6
View File
@@ -1,4 +1,5 @@
/*
* Copyright (c) 2016 by Carsten Larsen
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
* Copyright (c) 1996,1999 by Internet Software Consortium.
*
@@ -49,9 +50,9 @@
*/
static int inet_pton4(const char *src, unsigned char *dst, int pton);
#ifdef INET6
#ifdef IPV6
static int inet_pton6(const char *src, unsigned char *dst);
#endif /* INET6 */
#endif /* IPV6 */
/* int
* inet_pton(af, src, dst)
@@ -71,10 +72,10 @@ inet_pton(int af, const char *src, void *dst)
switch (af) {
case AF_INET:
return (inet_pton4(src, dst, 1));
#ifdef INET6
#ifdef IPV6
case AF_INET6:
return (inet_pton6(src, dst));
#endif /* INET6 */
#endif /* IPV6 */
default:
errno = EAFNOSUPPORT;
return (-1);
@@ -201,7 +202,7 @@ inet_pton4(const char *src, unsigned char *dst, int pton)
return (1);
}
#ifdef INET6
#ifdef IPV6
/* int
* inet_pton6(src, dst)
* convert presentation level address to network order binary form.
@@ -300,4 +301,4 @@ inet_pton6(const char *src, unsigned char *dst)
memcpy(dst, tmp, NS_IN6ADDRSZ);
return (1);
}
#endif /* INET6 */
#endif /* IPV6 */
+61
View File
@@ -0,0 +1,61 @@
/* $NetBSD: rand.c,v 1.12 2012/06/25 22:32:45 abs Exp $ */
/*-
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
#if 1
static char sccsid[] = "@(#)rand.c 8.1 (Berkeley) 6/14/93";
#else
__RCSID("$NetBSD: rand.c,v 1.12 2012/06/25 22:32:45 abs Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <stdlib.h>
#ifndef RAND_MAX
#define RAND_MAX 2147483647
#endif
static u_long next = 1;
int
rand(void)
{
/* LINTED integer overflow */
return (int)((next = next * 1103515245 + 12345) % ((u_long)RAND_MAX + 1));
}
void
srand(u_int seed)
{
next = seed;
}
-1
View File
@@ -53,7 +53,6 @@
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
+38 -1
View File
@@ -31,12 +31,17 @@
*/
#include "fping.h"
#include "config.h"
int open_ping_socket_ipv4();
int open_ping_socket_ipv6();
void init_ping_buffer_ipv4(size_t ping_data_size);
void init_ping_buffer_ipv6(size_t ping_data_size);
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 socket_sendto_ping_ipv4(int s, struct sockaddr *saddr, socklen_t saddr_len, uint16_t icmp_seq_nr, uint16_t icmp_id_nr);
int socket_sendto_ping_ipv6(int s, struct sockaddr *saddr, socklen_t saddr_len, uint16_t icmp_seq_nr, uint16_t icmp_id_nr);
void close_ping_socket_ipv4();
void cleanup_ping_buffer_ipv4();
int open_ping_socket()
{
@@ -47,6 +52,15 @@ int open_ping_socket()
#endif
}
void init_ping_buffer(size_t ping_data_size)
{
#ifndef IPV6
return init_ping_buffer_ipv4(ping_data_size);
#else
return init_ping_buffer_ipv6(ping_data_size);
#endif
}
void socket_set_src_addr(int s, FPING_INADDR src_addr)
{
#ifndef IPV6
@@ -55,3 +69,26 @@ void socket_set_src_addr(int s, FPING_INADDR src_addr)
socket_set_src_addr_ipv6(s, src_addr);
#endif
}
int socket_sendto_ping(int s, struct sockaddr *saddr, socklen_t saddr_len, uint16_t icmp_seq_nr, uint16_t icmp_id_nr)
{
#ifndef IPV6
return socket_sendto_ping_ipv4(s, saddr, saddr_len, icmp_seq_nr, icmp_id_nr);
#else
return socket_sendto_ping_ipv6(s, saddr, saddr_len, icmp_seq_nr, icmp_id_nr);
#endif
}
void close_ping_socket()
{
#ifndef IPV6
close_ping_socket_ipv4();
#endif
}
void cleanup_ping_buffer()
{
#ifndef IPV6
cleanup_ping_buffer_ipv4();
#endif
}
+76 -5
View File
@@ -31,28 +31,34 @@
*/
#include "fping.h"
#include "config.h"
#include <sys/socket.h>
#include <netinet/in_systm.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *ping_buffer = 0;
size_t ping_pkt_size;
int s = -1;
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 );
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 );
s = Socket( AF_INET, SOCK_DGRAM, proto->p_proto );
if( s < 0 ) {
errno_crash_and_burn( "can't create socket (must run as root?)" );
}
@@ -61,6 +67,15 @@ int open_ping_socket_ipv4()
return s;
}
void init_ping_buffer_ipv4(size_t ping_data_size)
{
/* allocate ping buffer */
ping_pkt_size = ping_data_size + ICMP_MINLEN;
ping_buffer = (char *) calloc(1, ping_pkt_size);
if(!ping_buffer)
crash_and_burn( "can't malloc ping packet" );
}
void socket_set_src_addr_ipv4(int s, FPING_INADDR src_addr)
{
struct sockaddr_in sa;
@@ -68,6 +83,62 @@ void socket_set_src_addr_ipv4(int s, FPING_INADDR src_addr)
sa.sin_family = AF_INET;
sa.sin_addr = src_addr;
if ( bind( s, (struct sockaddr *)&sa, sizeof( sa ) ) < 0 )
if ( Bind( s, (struct sockaddr *)&sa, sizeof( sa ) ) < 0 )
errno_crash_and_burn( "cannot bind source address" );
}
unsigned short calcsum(unsigned short *buffer, int length)
{
unsigned long sum;
// initialize sum to zero and loop until length (in words) is 0
for (sum=0; length>1; length-=2) // sizeof() returns number of bytes, we're interested in number of words
sum += *buffer++; // add 1 word of buffer to sum and proceed to the next
// we may have an extra byte
if (length==1)
sum += (char)*buffer;
sum = (sum >> 16) + (sum & 0xFFFF); // add high 16 to low 16
sum += (sum >> 16); // add carry
return ~sum;
}
int socket_sendto_ping_ipv4(int s, struct sockaddr *saddr, socklen_t saddr_len, uint16_t icmp_seq_nr, uint16_t icmp_id_nr)
{
struct icmp *icp;
int n;
icp = (struct icmp *) ping_buffer;
icp->icmp_type = ICMP_ECHO;
icp->icmp_code = 0;
icp->icmp_cksum = 0;
icp->icmp_seq = htons(icmp_seq_nr);
icp->icmp_id = htons(icmp_id_nr);
if (random_data_flag) {
for (n = ((void*)&icp->icmp_data - (void *)icp); n < ping_pkt_size; ++n) {
ping_buffer[n] = random() & 0xFF;
}
}
icp->icmp_cksum = calcsum((unsigned short *) icp, ping_pkt_size);
n = SendTo(s, (void*)icp, ping_pkt_size, 0, saddr, saddr_len);
return n;
}
void close_ping_socket_ipv4()
{
if(s > 0)
CloseSocket(s);
}
void cleanup_ping_buffer_ipv4()
{
if (ping_buffer != 0) {
free(ping_buffer);
}
}
+38 -3
View File
@@ -31,20 +31,22 @@
*/
#include "fping.h"
#include "config.h"
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/icmp6.h>
#include <netinet/icmp6.h>
char *ping_buffer = 0;
size_t ping_pkt_size;
int open_ping_socket_ipv6()
{
struct protoent *proto;
int opton = 1;
int s;
/* confirm that ICMP is available on this machine */
@@ -64,6 +66,15 @@ int open_ping_socket_ipv6()
return s;
}
void init_ping_buffer_ipv6(size_t ping_data_size)
{
/* allocate ping buffer */
ping_pkt_size = ping_data_size + sizeof(struct icmp6_hdr);
ping_buffer = (char *) calloc(1, ping_pkt_size);
if(!ping_buffer)
crash_and_burn( "can't malloc ping packet" );
}
void socket_set_src_addr_ipv6(int s, FPING_INADDR src_addr)
{
struct sockaddr_in6 sa;
@@ -74,3 +85,27 @@ void socket_set_src_addr_ipv6(int s, FPING_INADDR src_addr)
if ( bind( s, (struct sockaddr *)&sa, sizeof( sa ) ) < 0 )
errno_crash_and_burn( "cannot bind source address" );
}
int socket_sendto_ping_ipv6(int s, struct sockaddr *saddr, socklen_t saddr_len, uint16_t icmp_seq_nr, uint16_t icmp_id_nr)
{
struct icmp6_hdr *icp;
int n;
icp = (struct icmp6_hdr *) ping_buffer;
icp->icmp6_type = ICMP6_ECHO_REQUEST;
icp->icmp6_code = 0;
icp->icmp6_seq = htons(icmp_seq_nr);
icp->icmp6_id = htons(icmp_id_nr);
if (random_data_flag) {
for (n = sizeof(struct icmp6_hdr); n < ping_pkt_size; ++n) {
ping_buffer[n] = random() & 0xFF;
}
}
icp->icmp6_cksum = 0; // The IPv6 stack calculates the checksum for us...
n = sendto(s, icp, ping_pkt_size, 0, saddr, saddr_len);
return n;
}