[csw-devel] SF.net SVN: gar:[6786] csw/mgar/pkg/fping/trunk
dmichelsen at users.sourceforge.net
dmichelsen at users.sourceforge.net
Thu Oct 8 17:22:50 CEST 2009
Revision: 6786
http://gar.svn.sourceforge.net/gar/?rev=6786&view=rev
Author: dmichelsen
Date: 2009-10-08 15:22:50 +0000 (Thu, 08 Oct 2009)
Log Message:
-----------
fping: Add patch
Modified Paths:
--------------
csw/mgar/pkg/fping/trunk/Makefile
csw/mgar/pkg/fping/trunk/checksums
Added Paths:
-----------
csw/mgar/pkg/fping/trunk/files/fping-2.4b2_to-sequence-fix.patch
csw/mgar/pkg/fping/trunk/files/fping-ipv6.patch
Modified: csw/mgar/pkg/fping/trunk/Makefile
===================================================================
--- csw/mgar/pkg/fping/trunk/Makefile 2009-10-08 14:54:10 UTC (rev 6785)
+++ csw/mgar/pkg/fping/trunk/Makefile 2009-10-08 15:22:50 UTC (rev 6786)
@@ -20,7 +20,8 @@
MASTER_SITES = http://fping.sourceforge.net/download/
MASTER_SITES += http://oss.oetiker.ch/smokeping/pub/
DISTFILES = $(GARNAME).tar.gz
-PATCHFILES = fping-2.4b2_to-sequence-fix.patch
+#PATCHFILES = fping-2.4b2_to-sequence-fix.patch
+PATCHFILES += fping-ipv6.patch
# We define upstream file regex so we can be notifed of new upstream software release
#UFILES_REGEX = $(GARNAME)-(\d+(?:\.\d+)*).tar.gz
Modified: csw/mgar/pkg/fping/trunk/checksums
===================================================================
--- csw/mgar/pkg/fping/trunk/checksums 2009-10-08 14:54:10 UTC (rev 6785)
+++ csw/mgar/pkg/fping/trunk/checksums 2009-10-08 15:22:50 UTC (rev 6786)
@@ -1,2 +1,2 @@
-ee105906fc48b78f72866e121a7c179e download/fping-2.4b2_to-sequence-fix.patch
+c5e9dc057bda53ed36af08ee9fb84938 download/fping-ipv6.patch
d5e8be59e307cef76bc479e1684df705 download/fping.tar.gz
Added: csw/mgar/pkg/fping/trunk/files/fping-2.4b2_to-sequence-fix.patch
===================================================================
--- csw/mgar/pkg/fping/trunk/files/fping-2.4b2_to-sequence-fix.patch (rev 0)
+++ csw/mgar/pkg/fping/trunk/files/fping-2.4b2_to-sequence-fix.patch 2009-10-08 15:22:50 UTC (rev 6786)
@@ -0,0 +1,82 @@
+Only in fping-2.4b2_to.patch: Makefile
+Only in fping-2.4b2_to.patch: config.h
+Only in fping-2.4b2_to.patch: config.log
+Only in fping-2.4b2_to.patch: config.status
+Only in fping-2.4b2_to.patch: fping
+diff -u fping-2.4b2_to/fping.c fping-2.4b2_to.patch/fping.c
+--- fping-2.4b2_to/fping.c 2001-07-20 19:10:26.000000000 +0200
++++ fping-2.4b2_to.patch/fping.c 2008-08-18 22:14:38.000000000 +0200
+@@ -1440,7 +1440,7 @@
+ icp->icmp_type = ICMP_ECHO;
+ icp->icmp_code = 0;
+ icp->icmp_cksum = 0;
+- icp->icmp_seq = h->i;
++ icp->icmp_seq = h->i + (h->num_sent) * num_hosts;
+ icp->icmp_id = ident;
+
+ pdp = ( PING_DATA* )( buffer + SIZE_ICMP_HDR );
+@@ -1527,6 +1527,7 @@
+ int n, avg;
+ HOST_ENTRY *h;
+ long this_reply;
++ long id;
+ int this_count;
+ struct timeval sent_time;
+
+@@ -1568,6 +1569,7 @@
+ }/* IF */
+
+ icp = ( struct icmp* )( buffer + hlen );
++ id = icp->icmp_seq % num_hosts;
+ if( icp->icmp_type != ICMP_ECHOREPLY )
+ {
+ /* handle some problem */
+@@ -1583,10 +1585,10 @@
+
+ num_pingreceived++;
+
+- if( icp->icmp_seq >= ( n_short )num_hosts )
++ if( id >= ( n_short )num_hosts )
+ return( 1 ); /* packet received, don't worry about it anymore */
+
+- n = icp->icmp_seq;
++ n = id;
+ h = table[n];
+
+ /* received ping is cool, so process it */
+@@ -1726,6 +1728,7 @@
+ {
+ struct icmp *sent_icmp;
+ struct ip *sent_ip;
++ long id = sent_icmp->icmp_seq % num_hosts;
+ u_char *c;
+ HOST_ENTRY *h;
+
+@@ -1737,10 +1740,10 @@
+
+ if( ( sent_icmp->icmp_type == ICMP_ECHO ) &&
+ ( sent_icmp->icmp_id == ident ) &&
+- ( sent_icmp->icmp_seq < ( n_short )num_hosts ) )
++ ( id < ( n_short )num_hosts ) )
+ {
+ /* this is a response to a ping we sent */
+- h = table[sent_icmp->icmp_seq];
++ h = table[id];
+
+ if( p->icmp_code > ICMP_UNREACH_MAXTYPE )
+ {
+@@ -1771,10 +1774,10 @@
+ sent_icmp = ( struct icmp* )( c + 28 );
+ if( ( sent_icmp->icmp_type = ICMP_ECHO ) &&
+ ( sent_icmp->icmp_id = ident ) &&
+- ( sent_icmp->icmp_seq < ( n_short )num_hosts ) )
++ ( id < ( n_short )num_hosts ) )
+ {
+ /* this is a response to a ping we sent */
+- h = table[sent_icmp->icmp_seq];
++ h = table[id];
+ fprintf( stderr, "%s from %s for ICMP Echo sent to %s",
+ icmp_type_str[p->icmp_type], inet_ntoa( addr->sin_addr ), h->host );
+
+Only in fping-2.4b2_to.patch: fping.o
+Only in fping-2.4b2_to.patch: stamp-h
Added: csw/mgar/pkg/fping/trunk/files/fping-ipv6.patch
===================================================================
--- csw/mgar/pkg/fping/trunk/files/fping-ipv6.patch (rev 0)
+++ csw/mgar/pkg/fping/trunk/files/fping-ipv6.patch 2009-10-08 15:22:50 UTC (rev 6786)
@@ -0,0 +1,952 @@
+diff -Naur fping-2.4b2/ChangeLog fping-2.4b2_to-ipv6/ChangeLog
+--- fping-2.4b2/ChangeLog Thu Mar 15 03:09:39 2001
++++ fping-2.4b2_to-ipv6/ChangeLog Mon Jan 21 02:15:04 2002
+@@ -1,12 +1,23 @@
+-Tue Mar 14 18:37:50 2001
+-Jason Ewasiuk (ZeroHype Technologies Inc.) <noc at zerohype.com>
++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 at 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 14:35:00 2001
+-Jason Ewasiuk (ZeroHype Technologies Inc.) <noc at zerohype.com>
++Thu Feb 15 2001
++Jason Ewasiuk <jasone at remote.net>
+ - Revision v2.3b1
+ - formatting changes to code layout (fping.c)
+ NOTE: Best viewed with a tab stop of 4
+diff -Naur fping-2.4b2/Makefile.am fping-2.4b2_to-ipv6/Makefile.am
+--- fping-2.4b2/Makefile.am Thu Mar 15 03:07:52 2001
++++ fping-2.4b2_to-ipv6/Makefile.am Wed Jan 16 01:52:18 2002
+@@ -1,5 +1,5 @@
+-
+ sbin_PROGRAMS = fping
+ fping_SOURCES = fping.c options.h linux.h
+ man_MANS = fping.8
+ AUTOMAKE_OPTIONS=foreign
++EXTRA_DIST = $(man_MANS)
+diff -Naur fping-2.4b2/README fping-2.4b2_to-ipv6/README
+--- fping-2.4b2/README Wed Apr 25 20:29:10 2001
++++ fping-2.4b2_to-ipv6/README Mon Jan 21 02:02:12 2002
+@@ -1,9 +1,9 @@
+ fping README
+ ------------
+
+-Current maintainer and cool feature adder:
++Current maintainer:
+
+-ZeroHype Technologies Inc. (noc at zerohype.com) http://www.zerohype.com
++David Papp - david at remote.net
+
+
+ fping website: http://www.fping.com
+@@ -11,6 +11,7 @@
+
+ Original author: Roland Schemers (schemers at stanford.edu)
+ Previous maintainer: RL "Bob" Morgan (morgan at stanford.edu)
++IPv6 Support: Jeroen Massar (jeroen at unfix.org / jeroen at ipng.nl)
+
+
+ Suggestions and patches:
+diff -Naur fping-2.4b2/acconfig.h fping-2.4b2_to-ipv6/acconfig.h
+--- fping-2.4b2/acconfig.h Thu Mar 15 03:07:52 2001
++++ fping-2.4b2_to-ipv6/acconfig.h Sat Nov 3 16:23:40 2001
+@@ -1,4 +1,18 @@
++#ifndef CONFIG_H
++#define CONFIG_H
++
++ at TOP@
+
+ /* VERSION (from configure.in) */
+ #undef VERSION
+
++
++ at BOTTOM@
++
++/* some OSes do not define this ... lets take a wild guess */
++
++#ifndef INADDR_NONE
++# define INADDR_NONE 0xffffffffU
++#endif
++
++#endif /* CONFIG_H */
+diff -Naur fping-2.4b2/aclocal.m4 fping-2.4b2_to-ipv6/aclocal.m4
+--- fping-2.4b2/aclocal.m4 Thu Jan 1 01:00:00 1970
++++ fping-2.4b2_to-ipv6/aclocal.m4 Wed Jan 16 01:48:55 2002
+@@ -0,0 +1,127 @@
++dnl aclocal.m4 generated automatically by aclocal 1.4
++
++dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
++dnl This file is free software; the Free Software Foundation
++dnl gives unlimited permission to copy and/or distribute it,
++dnl with or without modifications, as long as this notice is preserved.
++
++dnl This program is distributed in the hope that it will be useful,
++dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
++dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
++dnl PARTICULAR PURPOSE.
++
++# Do all the work for Automake. This macro actually does too much --
++# some checks are only needed if your package does certain things.
++# But this isn't really a big deal.
++
++# serial 1
++
++dnl Usage:
++dnl AM_INIT_AUTOMAKE(package,version, [no-define])
++
++AC_DEFUN(AM_INIT_AUTOMAKE,
++[AC_REQUIRE([AC_PROG_INSTALL])
++PACKAGE=[$1]
++AC_SUBST(PACKAGE)
++VERSION=[$2]
++AC_SUBST(VERSION)
++dnl test to see if srcdir already configured
++if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
++ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
++fi
++ifelse([$3],,
++AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
++AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
++AC_REQUIRE([AM_SANITY_CHECK])
++AC_REQUIRE([AC_ARG_PROGRAM])
++dnl FIXME This is truly gross.
++missing_dir=`cd $ac_aux_dir && pwd`
++AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
++AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
++AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
++AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
++AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
++AC_REQUIRE([AC_PROG_MAKE_SET])])
++
++#
++# Check to make sure that the build environment is sane.
++#
++
++AC_DEFUN(AM_SANITY_CHECK,
++[AC_MSG_CHECKING([whether build environment is sane])
++# Just in case
++sleep 1
++echo timestamp > conftestfile
++# Do `set' in a subshell so we don't clobber the current shell's
++# arguments. Must try -L first in case configure is actually a
++# symlink; some systems play weird games with the mod time of symlinks
++# (eg FreeBSD returns the mod time of the symlink's containing
++# directory).
++if (
++ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
++ if test "[$]*" = "X"; then
++ # -L didn't work.
++ set X `ls -t $srcdir/configure conftestfile`
++ fi
++ if test "[$]*" != "X $srcdir/configure conftestfile" \
++ && test "[$]*" != "X conftestfile $srcdir/configure"; then
++
++ # If neither matched, then we have a broken ls. This can happen
++ # if, for instance, CONFIG_SHELL is bash and it inherits a
++ # broken ls alias from the environment. This has actually
++ # happened. Such a system could not be considered "sane".
++ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
++alias in your environment])
++ fi
++
++ test "[$]2" = conftestfile
++ )
++then
++ # Ok.
++ :
++else
++ AC_MSG_ERROR([newly created file is older than distributed files!
++Check your system clock])
++fi
++rm -f conftest*
++AC_MSG_RESULT(yes)])
++
++dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
++dnl The program must properly implement --version.
++AC_DEFUN(AM_MISSING_PROG,
++[AC_MSG_CHECKING(for working $2)
++# Run test in a subshell; some versions of sh will print an error if
++# an executable is not found, even if stderr is redirected.
++# Redirect stdin to placate older versions of autoconf. Sigh.
++if ($2 --version) < /dev/null > /dev/null 2>&1; then
++ $1=$2
++ AC_MSG_RESULT(found)
++else
++ $1="$3/missing $2"
++ AC_MSG_RESULT(missing)
++fi
++AC_SUBST($1)])
++
++# Like AC_CONFIG_HEADER, but automatically create stamp file.
++
++AC_DEFUN(AM_CONFIG_HEADER,
++[AC_PREREQ([2.12])
++AC_CONFIG_HEADER([$1])
++dnl When config.status generates a header, we must update the stamp-h file.
++dnl This file resides in the same directory as the config header
++dnl that is generated. We must strip everything past the first ":",
++dnl and everything past the last "/".
++AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl
++ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>,
++<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>,
++<<am_indx=1
++for am_file in <<$1>>; do
++ case " <<$>>CONFIG_HEADERS " in
++ *" <<$>>am_file "*<<)>>
++ echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
++ ;;
++ esac
++ am_indx=`expr "<<$>>am_indx" + 1`
++done<<>>dnl>>)
++changequote([,]))])
++
+diff -Naur fping-2.4b2/config.h.in fping-2.4b2_to-ipv6/config.h.in
+--- fping-2.4b2/config.h.in Thu Mar 15 03:07:52 2001
++++ fping-2.4b2_to-ipv6/config.h.in Wed Jan 16 01:49:45 2002
+@@ -1,4 +1,7 @@
+ /* config.h.in. Generated automatically from configure.in by autoheader. */
++#ifndef CONFIG_H
++#define CONFIG_H
++
+
+ /* VERSION (from configure.in) */
+ #undef VERSION
+@@ -20,3 +23,18 @@
+
+ /* Define if you have the socket library (-lsocket). */
+ #undef HAVE_LIBSOCKET
++
++/* Name of package */
++#undef PACKAGE
++
++/* Version number of package */
++#undef VERSION
++
++
++/* some OSes do not define this ... lets take a wild guess */
++
++#ifndef INADDR_NONE
++# define INADDR_NONE 0xffffffffU
++#endif
++
++#endif /* CONFIG_H */
+diff -Naur fping-2.4b2/configure.in fping-2.4b2_to-ipv6/configure.in
+--- fping-2.4b2/configure.in Thu Nov 7 21:11:57 2002
++++ fping-2.4b2_to-ipv6/configure.in Wed Jan 16 01:48:02 2002
+@@ -1,18 +1,26 @@
+ dnl Process this file with autoconf to produce a configure script.
+ AC_INIT(fping.c)
+-AM_INIT_AUTOMAKE(fping,fping)
++AM_INIT_AUTOMAKE(fping, 2.4b2_to_ipv6)
++
+ AM_CONFIG_HEADER(config.h)
++#VERSION=2.4b2
++#PACKAGE=fping
++AC_SUBST(PACKAGE)
++AC_SUBST(VERSION)
++AC_DEFINE_UNQUOTED(VERSION,"$VERSION")
+
+ dnl Checks for programs.
+
+-AC_ARG_PROGRAM
+ AC_PROG_CC
+ AC_PROG_CPP
+ AC_PROG_INSTALL
+
+ dnl Checks for libraries.
+
+-AC_CHECK_FUNC(gethostbyname, [] AC_CHECK_LIB(nsl, gethostbyname))
++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)
+@@ -21,4 +29,4 @@
+ dnl Checks for header files.
+ AC_CHECK_HEADERS(unistd.h sys/file.h stdlib.h sys/select.h)
+
+-AC_OUTPUT([Makefile])
++AC_OUTPUT(Makefile)
+diff -Naur fping-2.4b2/fping.8 fping-2.4b2_to-ipv6/fping.8
+--- fping-2.4b2/fping.8 Thu Mar 15 03:10:45 2001
++++ fping-2.4b2_to-ipv6/fping.8 Mon Jan 21 02:05:48 2002
+@@ -192,7 +192,7 @@
+ .nf
+ Roland J. Schemers III, Stanford University, concept and versions 1.x
+ RL "Bob" Morgan, Stanford University, versions 2.x
+-ZeroHype Technologies Inc. (http://www.zerohype.com), versions 2.3x and up,
++David Papp, versions 2.3x and up,
+ fping website: http://www.fping.com
+ .ni
+ .SH DIAGNOSTICS
+diff -Naur fping-2.4b2/fping.c fping-2.4b2_to-ipv6/fping.c
+--- fping-2.4b2/fping.c Fri Jul 20 19:10:26 2001
++++ fping-2.4b2_to-ipv6/fping.c Mon Jan 21 02:06:30 2002
+@@ -17,12 +17,13 @@
+ *
+ * Current maintainers of fping:
+ *
+- * ZeroHype Technologies Inc. (http://www.zerohype.com)
+- * Suggestions and patches, please email noc at zerohype.com
++ * David Papp
++ * Suggestions and patches, please email david at remote.net
+ *
+ *
+ *
+- * Original author: Roland Schemers <schemers at stanford.edu>
++ * Original author: Roland Schemers <schemers at stanford.edu>
++ * IPv6 Support: Jeroen Massar <jeroen at unfix.org / jeroen at ipng.nl>
+ *
+ *
+ *
+@@ -41,6 +42,7 @@
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
++#define IPV6 1 /* This should be a compiler option, or even better be done from the Makefile... ;) */
+
+ #ifndef _NO_PROTO
+ #if !__STDC__ && !defined( __cplusplus ) && !defined( FUNCPROTO ) \
+@@ -65,13 +67,16 @@
+
+ /*** autoconf includes ***/
+
+-#include <config.h>
+
+ #include <stdio.h>
+ #include <errno.h>
+ #include <time.h>
+ #include <signal.h>
+
++#include <netinet/in.h>
++
++#include "config.h"
++
+ #ifdef HAVE_UNISTD_H
+ #include <unistd.h>
+ #endif /* HAVE_UNISTD_H */
+@@ -91,8 +96,10 @@
+ #include <sys/file.h>
+ #endif /* HAVE_SYS_FILE_H */
+
++#ifdef IPV6
++#include <netinet/icmp6.h>
++#endif
+ #include <netinet/in_systm.h>
+-#include <netinet/in.h>
+
+ /* Linux has bizarre ip.h and ip_icmp.h */
+ #if defined( __linux__ )
+@@ -126,8 +133,8 @@
+
+ /*** Constants ***/
+
+-#define REV_DATE "2001/01/25 11:25:04"
+-#define EMAIL "noc at zerohype.com"
++#define REV_DATE "2002/01/16 00:33:42"
++#define EMAIL "david at remote.net"
+
+ /*** Ping packet defines ***/
+
+@@ -215,6 +222,13 @@
+ };
+
+ #define ICMP_UNREACH_MAXTYPE 15
++#ifndef IPV6
++#define FPING_SOCKADDR struct sockaddr_in
++#define FPING_ICMPHDR struct icmp
++#else
++#define FPING_SOCKADDR struct sockaddr_in6
++#define FPING_ICMPHDR struct icmp6_hdr
++#endif
+
+ /* entry used to keep track of each host we are pinging */
+
+@@ -225,7 +239,7 @@
+ char *name; /* name as given by user */
+ char *host; /* text description of host */
+ char *pad; /* pad to align print names */
+- struct sockaddr_in saddr; /* internet address */
++ FPING_SOCKADDR saddr; /* internet address */
+ int timeout; /* time to wait for response */
+ u_char running; /* unset when through sending */
+ u_char waiting; /* waiting for response */
+@@ -335,7 +349,11 @@
+ #else
+
+ void add_name( char *name );
++#ifndef IPV6
+ void add_addr( char *name, char *host, struct in_addr ipaddr );
++#else
++void add_addr( char *name, char *host, FPING_SOCKADDR *ipaddr );
++#endif
+ char *na_cat( char *name, struct in_addr ipaddr );
+ char *cpystr( char *string );
+ void crash_and_burn( char *message );
+@@ -343,7 +361,7 @@
+ char *get_host_by_address( struct in_addr in );
+ int in_cksum( u_short *p, int n );
+ void u_sleep( int u_sec );
+-int recvfrom_wto ( int s, char *buf, int len, struct sockaddr *saddr, int timo );
++int recvfrom_wto ( int s, char *buf, int len, FPING_SOCKADDR *saddr, int timo );
+ void remove_job( HOST_ENTRY *h );
+ void send_ping( int s, HOST_ENTRY *h );
+ long timeval_diff( struct timeval *a, struct timeval *b );
+@@ -353,7 +371,7 @@
+ void print_per_system_splits( void );
+ void print_global_stats( void );
+ void finish();
+-int handle_random_icmp( struct icmp *p, int psize, struct sockaddr_in *addr );
++int handle_random_icmp( FPING_ICMPHDR *p, int psize, FPING_SOCKADDR *addr );
+ char *sprint_tm( int t );
+
+ #endif /* _NO_PROTO */
+@@ -382,12 +400,14 @@
+ #endif /* _NO_PROTO */
+ {
+ int c, i, n;
++#ifdef IPV6
++ int opton = 1;
++#endif
+ u_int lt, ht;
+ int advance;
+ struct protoent *proto;
+ char *buf;
+ uid_t uid;
+-
+ /* check if we are root */
+
+ if( geteuid() )
+@@ -400,15 +420,62 @@
+ }/* IF */
+
+ /* confirm that ICMP is available on this machine */
++#ifndef IPV6
+ if( ( proto = getprotobyname( "icmp" ) ) == NULL )
++#else
++ if( ( proto = getprotobyname( "ipv6-icmp" ) ) == NULL )
++#endif
+ crash_and_burn( "icmp: unknown protocol" );
+
+ /* create raw socket for ICMP calls (ping) */
++#ifndef IPV6
+ s = socket( AF_INET, SOCK_RAW, proto->p_proto );
++#else
++ s = socket( AF_INET6, SOCK_RAW, proto->p_proto );
++#endif
+
+ if( s < 0 )
+ errno_crash_and_burn( "can't create raw socket" );
+
++#ifdef IPV6
++ /*
++ * let the kerel pass extension headers of incoming packets,
++ * for privileged socket options
++ */
++#ifdef IPV6_RECVHOPOPTS
++ if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVHOPOPTS, &opton,
++ sizeof(opton)))
++ err(1, "setsockopt(IPV6_RECVHOPOPTS)");
++#else /* old adv. API */
++ if (setsockopt(s, IPPROTO_IPV6, IPV6_HOPOPTS, &opton,
++ sizeof(opton)))
++ err(1, "setsockopt(IPV6_HOPOPTS)");
++#endif
++#ifdef IPV6_RECVDSTOPTS
++ if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVDSTOPTS, &opton,
++ sizeof(opton)))
++ err(1, "setsockopt(IPV6_RECVDSTOPTS)");
++#else /* old adv. API */
++ if (setsockopt(s, IPPROTO_IPV6, IPV6_DSTOPTS, &opton,
++ sizeof(opton)))
++ err(1, "setsockopt(IPV6_DSTOPTS)");
++#endif
++#ifdef IPV6_RECVRTHDRDSTOPTS
++ if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVRTHDRDSTOPTS, &opton,
++ sizeof(opton)))
++ err(1, "setsockopt(IPV6_RECVRTHDRDSTOPTS)");
++#endif
++#ifdef IPV6_RECVRTHDR
++ if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVRTHDR, &opton,
++ sizeof(opton)))
++ err(1, "setsockopt(IPV6_RECVRTHDR)");
++#else /* old adv. API */
++ if (setsockopt(s, IPPROTO_IPV6, IPV6_RTHDR, &opton,
++ sizeof(opton)))
++ err(1, "setsockopt(IPV6_RTHDR)");
++#endif
++#endif
++
+ if( ( uid = getuid() ) )
+ {
+ seteuid( getuid() );
+@@ -1425,7 +1492,7 @@
+ #endif /* _NO_PROTO */
+ {
+ char *buffer;
+- struct icmp *icp;
++ FPING_ICMPHDR *icp;
+ PING_DATA *pdp;
+ int n;
+
+@@ -1434,9 +1501,10 @@
+ crash_and_burn( "can't malloc ping packet" );
+
+ memset( buffer, 0, ping_pkt_size * sizeof( char ) );
+- icp = ( struct icmp* )buffer;
++ icp = ( FPING_ICMPHDR* )buffer;
+
+ gettimeofday( &h->last_send_time, &tz );
++#ifndef IPV6
+ icp->icmp_type = ICMP_ECHO;
+ icp->icmp_code = 0;
+ icp->icmp_cksum = 0;
+@@ -1448,14 +1516,25 @@
+ pdp->ping_count = h->num_sent;
+
+ icp->icmp_cksum = in_cksum( ( u_short* )icp, ping_pkt_size );
++#else
++ icp->icmp6_type = ICMP6_ECHO_REQUEST;
++ icp->icmp6_code = 0;
++ icp->icmp6_seq = h->i;
++ icp->icmp6_id = ident;
++
++ pdp = ( PING_DATA* )( buffer + SIZE_ICMP_HDR );
++ pdp->ping_ts = h->last_send_time;
++ pdp->ping_count = h->num_sent;
+
++ icp->icmp6_cksum = 0; // The IPv6 stack calculates the checksum for us...
++#endif
+ #if defined(DEBUG) || defined(_DEBUG)
+ if( trace_flag )
+ printf( "sending [%d] to %s\n", h->num_sent, h->host );
+ #endif /* DEBUG || _DEBUG */
+
+ n = sendto( s, buffer, ping_pkt_size, 0,
+- ( struct sockaddr* )&h->saddr, sizeof( struct sockaddr_in ) );
++ ( struct sockaddr* )&h->saddr, sizeof( FPING_SOCKADDR ) );
+
+ if( n < 0 || n != ping_pkt_size )
+ {
+@@ -1520,18 +1599,17 @@
+ {
+ int result;
+ static char buffer[4096];
+- struct sockaddr_in response_addr;
++ FPING_SOCKADDR response_addr;
+ struct ip *ip;
+- int hlen;
+- struct icmp *icp;
++ int hlen = 0;
++ FPING_ICMPHDR *icp;
+ int n, avg;
+ HOST_ENTRY *h;
+ long this_reply;
+ int this_count;
+ struct timeval sent_time;
+
+- result = recvfrom_wto( s, buffer, 4096,
+- ( struct sockaddr* )&response_addr, select_time );
++ result = recvfrom_wto( s, buffer, sizeof(buffer), &response_addr, select_time );
+
+ if( result < 0 )
+ return 0; /* timeout */
+@@ -1546,7 +1624,7 @@
+ #endif /* DEBUG || _DEBUG */
+
+ ip = ( struct ip* )buffer;
+-
++#ifndef IPV6
+ #if defined( __alpha__ ) && __STDC__ && !defined( __GLIBC__ )
+ /* The alpha headers are decidedly broken.
+ * Using an ANSI compiler, it provides ip_vhl instead of ip_hl and
+@@ -1556,37 +1634,59 @@
+ #else
+ hlen = ip->ip_hl << 2;
+ #endif /* defined(__alpha__) && __STDC__ */
+-
+ if( result < hlen + ICMP_MINLEN )
++#else
++ if( result < sizeof(FPING_ICMPHDR) )
++#endif
+ {
+ if( verbose_flag )
++ {
++#ifndef IPV6
+ printf( "received packet too short for ICMP (%d bytes from %s)\n", result,
+ inet_ntoa( response_addr.sin_addr ) );
+-
++#else
++ char buf[INET6_ADDRSTRLEN];
++ inet_ntop(response_addr.sin6_family, &response_addr.sin6_addr, buf, INET6_ADDRSTRLEN);
++ printf( "received packet too short for ICMP (%d bytes from %s)\n", result, buf);
++#endif
++ }
+ return( 1 ); /* too short */
+-
+ }/* IF */
+
+- icp = ( struct icmp* )( buffer + hlen );
++ icp = ( FPING_ICMPHDR* )( buffer + hlen );
++#ifndef IPV6
+ if( icp->icmp_type != ICMP_ECHOREPLY )
++#else
++ if( icp->icmp6_type != ICMP6_ECHO_REPLY )
++#endif
+ {
+ /* handle some problem */
+ if( handle_random_icmp( icp, result, &response_addr ) )
+ num_othericmprcvd++;
+-
+ return 1;
+-
+ }/* IF */
+
++#ifndef IPV6
+ if( icp->icmp_id != ident )
++#else
++ if( icp->icmp6_id != ident )
++#endif
+ return 1; /* packet received, but not the one we are looking for! */
+
+ num_pingreceived++;
+
++#ifndef IPV6
+ if( icp->icmp_seq >= ( n_short )num_hosts )
++#else
++ if( icp->icmp6_seq >= ( n_short )num_hosts )
++#endif
+ return( 1 ); /* packet received, don't worry about it anymore */
+
++#ifndef IPV6
+ n = icp->icmp_seq;
++#else
++ n = icp->icmp6_seq;
++#endif
+ h = table[n];
+
+ /* received ping is cool, so process it */
+@@ -1595,9 +1695,14 @@
+ h->timeout = timeout;
+ h->num_recv++;
+ h->num_recv_i++;
+-
++
++#ifndef IPV6
+ memcpy( &sent_time, icp->icmp_data + offsetof( PING_DATA, ping_ts ), sizeof( sent_time ) );
+ memcpy( &this_count, icp->icmp_data, sizeof( this_count ) );
++#else
++ memcpy( &sent_time, ((char *)icp->icmp6_data32)+4+offsetof(PING_DATA, ping_ts), sizeof( sent_time ) );
++ memcpy( &this_count, ((char *)icp->icmp6_data32)+4, sizeof( this_count ) );
++#endif
+
+ #if defined( DEBUG ) || defined( _DEBUG )
+ if( trace_flag )
+@@ -1627,10 +1732,18 @@
+ {
+ fprintf( stderr, "%s : duplicate for [%d], %d bytes, %s ms",
+ h->host, this_count, result, sprint_tm( this_reply ) );
+-
++#ifndef IPV6
+ if( response_addr.sin_addr.s_addr != h->saddr.sin_addr.s_addr )
+ fprintf( stderr, " [<- %s]", inet_ntoa( response_addr.sin_addr ) );
+-
++#else
++ if(memcmp(&response_addr.sin6_addr, &h->saddr.sin6_addr, sizeof(response_addr.sin6_addr)))
++ {
++ char buf[INET6_ADDRSTRLEN];
++ inet_ntop(response_addr.sin6_family, &response_addr.sin6_addr, buf, INET6_ADDRSTRLEN);
++
++ fprintf( stderr, " [<- %s]", buf);
++ }
++#endif
+ fprintf( stderr, "\n" );
+
+ }/* IF */
+@@ -1660,10 +1773,17 @@
+
+ if( elapsed_flag )
+ printf( " (%s ms)", sprint_tm( this_reply ) );
+-
++#ifndef IPV6
+ if( response_addr.sin_addr.s_addr != h->saddr.sin_addr.s_addr )
+ printf( " [<- %s]", inet_ntoa( response_addr.sin_addr ) );
+-
++#else
++ if(memcmp(&response_addr.sin6_addr, &h->saddr.sin6_addr, sizeof(response_addr.sin6_addr)))
++ {
++ char buf[INET6_ADDRSTRLEN];
++ inet_ntop(response_addr.sin6_family, &response_addr.sin6_addr, buf, INET6_ADDRSTRLEN);
++ fprintf( stderr, " [<- %s]", buf);
++ }
++#endif
+ printf( "\n" );
+
+ }/* IF */
+@@ -1688,9 +1808,17 @@
+ ( h->num_recv * 100 ) / h->num_sent );
+
+ }/* ELSE */
+-
++#ifndef IPV6
+ if( response_addr.sin_addr.s_addr != h->saddr.sin_addr.s_addr )
+ printf( " [<- %s]", inet_ntoa( response_addr.sin_addr ) );
++#else
++ if(memcmp(&response_addr.sin6_addr, &h->saddr.sin6_addr, sizeof(response_addr.sin6_addr)))
++ {
++ char buf[INET6_ADDRSTRLEN];
++ inet_ntop(response_addr.sin6_family, &response_addr.sin6_addr, buf, INET6_ADDRSTRLEN);
++ fprintf( stderr, " [<- %s]", buf);
++ }
++#endif
+
+ printf( "\n" );
+
+@@ -1706,7 +1834,7 @@
+
+ *************************************************************
+
+- Inputs: struct icmp *p, int psize, struct sockaddr_in *addr
++ Inputs: FPING_ICMPHDR *p, int psize, FPING_SOCKADDR *addr
+
+ Returns: int
+
+@@ -1717,22 +1845,33 @@
+
+ #ifdef _NO_PROTO
+ int handle_random_icmp( p, psize, addr )
+- struct icmp *p;
++ FPING_ICMPHDR *p;
+ int psize;
+- struct sockaddr_in *addr;
++ FPING_SOCKADDR *addr;
+ #else
+-int handle_random_icmp( struct icmp *p, int psize, struct sockaddr_in *addr )
++int handle_random_icmp( FPING_ICMPHDR *p, int psize, FPING_SOCKADDR *addr )
+ #endif /* _NO_PROTO */
+ {
+- struct icmp *sent_icmp;
++ FPING_ICMPHDR *sent_icmp;
+ struct ip *sent_ip;
+ u_char *c;
+ HOST_ENTRY *h;
++#ifdef IPV6
++ char addr_ascii[INET6_ADDRSTRLEN];
++ inet_ntop(addr->sin6_family, &addr->sin6_addr, addr_ascii, INET6_ADDRSTRLEN);
++#endif
+
+ c = ( u_char* )p;
++#ifndef IPV6
+ switch( p->icmp_type )
++#else
++ switch( p->icmp6_type )
++#endif
+ {
+ case ICMP_UNREACH:
++ sent_icmp = ( FPING_ICMPHDR* )( c + 28 );
++
++#ifndef IPV6
+ sent_icmp = ( struct icmp* )( c + 28 );
+
+ if( ( sent_icmp->icmp_type == ICMP_ECHO ) &&
+@@ -1747,16 +1886,37 @@
+ fprintf( stderr, "ICMP Unreachable (Invalid Code) from %s for ICMP Echo sent to %s",
+ inet_ntoa( addr->sin_addr ), h->host );
+
++#else
++ if( ( sent_icmp->icmp6_type == ICMP_ECHO ) &&
++ ( sent_icmp->icmp6_id == ident ) &&
++ ( sent_icmp->icmp6_seq < ( n_short )num_hosts ) )
++ {
++ /* this is a response to a ping we sent */
++ h = table[sent_icmp->icmp6_seq];
++
++ if( p->icmp6_code > ICMP_UNREACH_MAXTYPE )
++ {
++ fprintf( stderr, "ICMP Unreachable (Invalid Code) from %s for ICMP Echo sent to %s",
++ addr_ascii, h->host );
++#endif
+ }/* IF */
+ else
+ {
+ fprintf( stderr, "%s from %s for ICMP Echo sent to %s",
++#ifndef IPV6
+ icmp_unreach_str[p->icmp_code], inet_ntoa( addr->sin_addr ), h->host );
++#else
++ icmp_unreach_str[p->icmp6_code], addr_ascii, h->host );
++#endif
+
+ }/* ELSE */
+
+ if( inet_addr( h->host ) == -1 )
++#ifndef IPV6
+ fprintf( stderr, " (%s)", inet_ntoa( h->saddr.sin_addr ) );
++#else
++ fprintf( stderr, " (%s)", addr_ascii);
++#endif
+
+ fprintf( stderr, "\n" );
+
+@@ -1768,7 +1928,8 @@
+ case ICMP_REDIRECT:
+ case ICMP_TIMXCEED:
+ case ICMP_PARAMPROB:
+- sent_icmp = ( struct icmp* )( c + 28 );
++ sent_icmp = ( FPING_ICMPHDR* )( c + 28 );
++#ifndef IPV6
+ if( ( sent_icmp->icmp_type = ICMP_ECHO ) &&
+ ( sent_icmp->icmp_id = ident ) &&
+ ( sent_icmp->icmp_seq < ( n_short )num_hosts ) )
+@@ -1780,6 +1941,19 @@
+
+ if( inet_addr( h->host ) == -1 )
+ fprintf( stderr, " (%s)", inet_ntoa( h->saddr.sin_addr ) );
++#else
++ if( ( sent_icmp->icmp6_type = ICMP_ECHO ) &&
++ ( sent_icmp->icmp6_id = ident ) &&
++ ( sent_icmp->icmp6_seq < ( n_short )num_hosts ) )
++ {
++ /* this is a response to a ping we sent */
++ h = table[sent_icmp->icmp6_seq];
++ fprintf( stderr, "%s from %s for ICMP Echo sent to %s",
++ icmp_type_str[p->icmp6_type], addr_ascii, h->host );
++
++ if( inet_addr( h->host ) == -1 )
++ fprintf( stderr, " (%s)", addr_ascii );
++#endif
+
+ fprintf( stderr, "\n" );
+
+@@ -1879,6 +2053,7 @@
+ void add_name( char *name )
+ #endif /* _NO_PROTO */
+ {
++#ifndef IPV6
+ struct hostent *host_ent;
+ u_int ipaddress;
+ struct in_addr *ipa = ( struct in_addr* )&ipaddress;
+@@ -1985,7 +2160,27 @@
+
+ }/* WHILE */
+ }/* ELSE */
+-
++#else
++ FPING_SOCKADDR dst;
++ struct addrinfo *res, hints;
++ int ret_ga;
++ char *hostname;
++
++ /* getaddrinfo */
++ bzero(&hints, sizeof(struct addrinfo));
++ hints.ai_flags = AI_CANONNAME;
++ hints.ai_family = AF_INET6;
++ hints.ai_socktype = SOCK_RAW;
++ hints.ai_protocol = IPPROTO_ICMPV6;
++
++ ret_ga = getaddrinfo(name, NULL, &hints, &res);
++ if (ret_ga) errx(1, "%s", gai_strerror(ret_ga));
++ if (res->ai_canonname) hostname = res->ai_canonname;
++ else hostname = name;
++ if (!res->ai_addr) errx(1, "getaddrinfo failed");
++ (void)memcpy(&dst, res->ai_addr, sizeof(FPING_SOCKADDR)); /*res->ai_addrlen);*/
++ add_addr(name, name, &dst);
++#endif
+ } /* add_name() */
+
+
+@@ -2048,9 +2243,17 @@
+ void add_addr( name, host, ipaddr )
+ char *name;
+ char *host;
++#ifndef IPV6
+ struct in_addr ipaddr;
+ #else
++FPING_SOCKADDR *ipaddr;
++#endif
++#else
++#ifndef IPV6
+ void add_addr( char *name, char *host, struct in_addr ipaddr )
++#else
++void add_addr( char *name, char *host, FPING_SOCKADDR *ipaddr )
++#endif
+ #endif /* _NO_PROTO */
+ {
+ HOST_ENTRY *p;
+@@ -2064,8 +2267,13 @@
+
+ p->name = name;
+ p->host = host;
++#ifndef IPV6
+ p->saddr.sin_family = AF_INET;
+ p->saddr.sin_addr = ipaddr;
++#else
++ p->saddr.sin6_family = AF_INET6;
++ (void)memcpy(&p->saddr, ipaddr, sizeof(FPING_SOCKADDR));
++#endif
+ p->timeout = timeout;
+ p->running = 1;
+ p->min_reply = 10000000;
+@@ -2193,7 +2401,11 @@
+ #endif /* _NO_PROTO */
+ {
+ struct hostent *h;
++#ifndef IPV6
+ h = gethostbyaddr( ( char* )&in, sizeof( struct in_addr ),AF_INET );
++#else
++ h = gethostbyaddr( ( char* )&in, sizeof( FPING_SOCKADDR ),AF_INET6 );
++#endif
+
+ if( h == NULL || h->h_name == NULL )
+ return inet_ntoa( in );
+@@ -2429,7 +2641,7 @@
+
+ *************************************************************
+
+- Inputs: int s, char* buf, int len, struct sockaddr *saddr, int timo
++ Inputs: int s, char* buf, int len, FPING_SOCKADDR *saddr, int timo
+
+ Returns: int
+
+@@ -2443,9 +2655,9 @@
+
+ #ifdef _NO_PROTO
+ int recvfrom_wto( s, buf, len, saddr, timo )
+-int s; char *buf; int len; struct sockaddr *saddr; int timo;
++int s; char *buf; int len; FPING_SOCKADDR *saddr; int timo;
+ #else
+-int recvfrom_wto( int s, char *buf, int len, struct sockaddr *saddr, int timo )
++int recvfrom_wto( int s, char *buf, int len, FPING_SOCKADDR *saddr, int timo )
+ #endif /* _NO_PROTO */
+ {
+ int nfound, slen, n;
+@@ -2465,8 +2677,12 @@
+ if( nfound == 0 )
+ return -1; /* timeout */
+
++#ifndef IPV6
+ slen = sizeof( struct sockaddr );
+- n = recvfrom( s, buf, len, 0, saddr, &slen );
++#else
++ slen = sizeof( FPING_SOCKADDR );
++#endif
++ n = recvfrom( s, buf, len, 0, (struct sockaddr *)saddr, &slen );
+ if( n < 0 )
+ errno_crash_and_burn( "recvfrom" );
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the devel
mailing list