diff -Naur iputils.orig/Makefile iputils/Makefile --- iputils.orig/Makefile 2002-11-09 03:01:11.000000000 +0000 +++ iputils/Makefile 2005-06-09 16:15:32.000000000 +0000 @@ -17,11 +17,6 @@ GLIBCFIX=-Iinclude-glibc -include include-glibc/glibc-bugs.h endif -ifeq ($(KERNEL_INCLUDE)/linux/pfkeyv2.h,$(wildcard $(KERNEL_INCLUDE)/linux/pfkeyv2.h)) - SUBDIRS=libipsec setkey - LDLIBS+=-Llibipsec -lipsec - IPSECDEF=-DDO_IPSEC -Ilibipsec -endif #options if you compile with libc5, and without a bind>=4.9.4 libresolv @@ -31,7 +26,7 @@ # What a pity, all new gccs are buggy and -Werror does not work. Sigh. #CCOPT=-D_GNU_SOURCE -O2 -Wstrict-prototypes -Wall -g -Werror CCOPT=-D_GNU_SOURCE -O2 -Wstrict-prototypes -Wall -g -CFLAGS=$(CCOPT) $(GLIBCFIX) -I$(KERNEL_INCLUDE) -I../include $(IPSECDEF) $(DEFINES) +CFLAGS=$(CCOPT) -I../include $(IPSECDEF) $(DEFINES) IPV4_TARGETS=tracepath ping clockdiff rdisc arping tftpd rarpd IPV6_TARGETS=tracepath6 traceroute6 ping6 @@ -42,7 +37,11 @@ tftpd: tftpd.o tftpsubs.o ping: ping.o ping_common.o + $(LINK.o) $^ $(LDLIBS) -o $@ -Wl,-z,now -Wl,-z,relro ping6: ping6.o ping_common.o + $(LINK.o) $^ $(LDLIBS) -o $@ -Wl,-z,now -Wl,-z,relro +traceroute6: traceroute6.o + $(LINK.o) $^ $(LDLIBS) -o $@ -Wl,-z,now -Wl,-z,relro ping.o ping6.o ping_common.o: ping_common.h tftpd.o tftpsubs.o: tftp.h diff -Naur iputils.orig/arping.c iputils/arping.c --- iputils.orig/arping.c 2001-10-05 22:42:47.000000000 +0000 +++ iputils/arping.c 2005-06-09 16:15:24.000000000 +0000 @@ -9,6 +9,7 @@ * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> */ +#include <asm/byteorder.h> #include <stdlib.h> #include <sys/param.h> #include <sys/socket.h> @@ -19,6 +20,8 @@ #include <sys/ioctl.h> #include <linux/if.h> #include <linux/if_arp.h> +#include <linux/if_ether.h> +#include <linux/if_packet.h> #include <sys/uio.h> #include <netdb.h> diff -Naur iputils.orig/clockdiff.c iputils/clockdiff.c --- iputils.orig/clockdiff.c 2002-02-23 00:10:59.000000000 +0000 +++ iputils/clockdiff.c 2005-06-09 16:15:24.000000000 +0000 @@ -1,7 +1,9 @@ +#include <asm/byteorder.h> #include <time.h> #include <sys/types.h> #include <sys/param.h> #include <stdio.h> +#include <linux/types.h> #include <unistd.h> #include <stdlib.h> #include <math.h> diff -Naur iputils.orig/include-glibc/netinet/in.h iputils/include-glibc/netinet/in.h --- iputils.orig/include-glibc/netinet/in.h 2002-11-09 00:22:25.000000000 +0000 +++ iputils/include-glibc/netinet/in.h 2005-06-09 16:15:00.000000000 +0000 @@ -65,4 +65,45 @@ && (((__const uint32_t *) (a))[3] == ((__const uint32_t *) (b))[3])) -#endif /* netinet/in.h */ +/* Functions to convert between host and network byte order. + + Please note that these functions normally take `unsigned long int' or + `unsigned short int' values as arguments and also return them. But + this was a short-sighted decision since on different systems the types + may have different representations but the values are always the same. */ + +extern u_int32_t ntohl (u_int32_t __netlong) __THROW __attribute__ ((__const__)); +extern u_int16_t ntohs (u_int16_t __netshort) + __THROW __attribute__ ((__const__)); +extern u_int32_t htonl (u_int32_t __hostlong) + __THROW __attribute__ ((__const__)); +extern u_int16_t htons (u_int16_t __hostshort) + __THROW __attribute__ ((__const__)); + +#include <endian.h> + +/* Get machine dependent optimized versions of byte swapping functions. */ +#include <bits/byteswap.h> + +#ifdef __OPTIMIZE__ +/* We can optimize calls to the conversion functions. Either nothing has + to be done or we are using directly the byte-swapping functions which + often can be inlined. */ +# if __BYTE_ORDER == __BIG_ENDIAN +/* The host byte order is the same as network byte order, + so these functions are all just identity. */ +# define ntohl(x) (x) +# define ntohs(x) (x) +# define htonl(x) (x) +# define htons(x) (x) +# else +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define ntohl(x) __bswap_32 (x) +# define ntohs(x) __bswap_16 (x) +# define htonl(x) __bswap_32 (x) +# define htons(x) __bswap_16 (x) +# endif +# endif +#endif + +#endif /* netinet/in.h */ diff -Naur iputils.orig/ipg iputils/ipg --- iputils.orig/ipg 2001-08-02 22:37:32.000000000 +0000 +++ iputils/ipg 2005-06-09 16:14:49.000000000 +0000 @@ -1,21 +1,31 @@ -#! /bin/bash +#!/bin/bash -modprobe pg3 +modprobe pg3 >& /dev/null +modprobe pktgen >& /dev/null + +PGDEV=/proc/net/pg +if [[ ! -e ${PGDEV} ]] ; then + PGDEV=/proc/net/pktgen/pg0 + if [[ ! -e ${PGDEV} ]] ; then + echo "Couldn't not locate pg in /proc/net :(" + exit 1 + fi +fi function pgset() { local result - echo $1 > /proc/net/pg + echo $1 > ${PGDEV} - result=`cat /proc/net/pg | fgrep "Result: OK:"` + result=`cat ${PGDEV} | fgrep "Result: OK:"` if [ "$result" = "" ]; then - cat /proc/net/pg | fgrep Result: + cat ${PGDEV} | fgrep Result: fi } function pg() { - echo inject > /proc/net/pg - cat /proc/net/pg + echo inject > ${PGDEV} + cat ${PGDEV} } pgset "odev eth0" diff -Naur iputils.orig/ping.c iputils/ping.c --- iputils.orig/ping.c 2002-11-07 22:53:21.000000000 +0000 +++ iputils/ping.c 2005-06-09 16:15:00.000000000 +0000 @@ -60,8 +60,8 @@ #include "ping_common.h" +#include <linux/icmp.h> #include <netinet/ip.h> -#include <netinet/ip_icmp.h> #ifdef DO_IPSEC #include <libipsec.h> #endif @@ -1213,7 +1213,7 @@ once = 1; /* Patch bpflet for current identifier. */ - insns[2] = (struct sock_filter)BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __constant_htons(ident), 0, 1); + insns[2] = (struct sock_filter)BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htons(ident), 0, 1); if (setsockopt(icmp_sock, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter))) perror("WARNING: failed to install socket filter\n"); diff -Naur iputils.orig/ping6.c iputils/ping6.c --- iputils.orig/ping6.c 2002-09-20 15:08:11.000000000 +0000 +++ iputils/ping6.c 2005-06-09 16:15:00.000000000 +0000 @@ -68,8 +68,44 @@ */ #include "ping_common.h" -#include <linux/in6.h> -#include <linux/ipv6.h> +struct ipv6_rt_hdr { + __u8 nexthdr; + __u8 hdrlen; + __u8 type; + __u8 segments_left; + + /* + * type specific data + * variable length field + */ +}; + +struct rt0_hdr { + struct ipv6_rt_hdr rt_hdr; + __u32 bitmap; /* strict/loose bit map */ + struct in6_addr addr[0]; + +#define rt0_type rt_hdr.type; +}; +#define IPV6_SRCRT_TYPE_0 0 /* IPv6 type 0 Routing Header */ +struct ipv6hdr { +#if defined(__LITTLE_ENDIAN) + __u8 priority:4, + version:4; +#elif defined(__BIG_ENDIAN) + __u8 version:4, + priority:4; +#endif + __u8 flow_lbl[3]; + + __u16 payload_len; + __u8 nexthdr; + __u8 hop_limit; + + struct in6_addr saddr; + struct in6_addr daddr; +}; + #include <linux/icmpv6.h> #define BIT_CLEAR(nr, addr) do { ((__u32 *)(addr))[(nr) >> 5] &= ~(1U << ((nr) & 31)); } while(0) @@ -879,7 +915,7 @@ once = 1; /* Patch bpflet for current identifier. */ - insns[1] = (struct sock_filter)BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __constant_htons(ident), 0, 1); + insns[1] = (struct sock_filter)BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htons(ident), 0, 1); if (setsockopt(icmp_sock, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter))) perror("WARNING: failed to install socket filter\n"); diff -Naur iputils.orig/ping_common.h iputils/ping_common.h --- iputils.orig/ping_common.h 2002-09-20 15:08:11.000000000 +0000 +++ iputils/ping_common.h 2005-06-09 16:15:24.000000000 +0000 @@ -1,3 +1,4 @@ +#include <asm/byteorder.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -19,6 +20,7 @@ #include <netinet/in.h> #include <arpa/inet.h> +#include <linux/types.h> #include <linux/errqueue.h> #include "SNAPSHOT.h" diff -Naur iputils.orig/rarpd.c iputils/rarpd.c --- iputils.orig/rarpd.c 2001-12-02 18:45:06.000000000 +0000 +++ iputils/rarpd.c 2005-06-09 16:15:24.000000000 +0000 @@ -9,6 +9,7 @@ * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> */ +#include <asm/byteorder.h> #include <stdio.h> #include <syslog.h> #include <dirent.h> @@ -26,6 +27,7 @@ #include <sys/signal.h> #include <linux/if.h> #include <linux/if_arp.h> +#include <linux/if_ether.h> #include <netinet/in.h> #include <linux/if_packet.h> #include <linux/filter.h> @@ -42,7 +44,9 @@ char *ifname; char *tftp_dir = "/etc/tftpboot"; +#ifndef __UCLIBC__ extern int ether_ntohost(char *name, unsigned char *ea); +#endif void usage(void) __attribute__((noreturn)); struct iflink @@ -52,12 +56,12 @@ int hatype; unsigned char lladdr[16]; unsigned char name[IFNAMSIZ]; - struct ifaddr *ifa_list; + struct l_ifaddr *ifa_list; } *ifl_list; -struct ifaddr +struct l_ifaddr { - struct ifaddr *next; + struct l_ifaddr *next; __u32 prefix; __u32 mask; __u32 local; @@ -89,7 +93,7 @@ int fd; struct ifreq *ifrp, *ifend; struct iflink *ifl; - struct ifaddr *ifa; + struct l_ifaddr *ifa; struct ifconf ifc; struct ifreq ibuf[256]; @@ -180,7 +184,7 @@ if (ifa == NULL) { if (mask == 0 || prefix == 0) continue; - ifa = (struct ifaddr*)malloc(sizeof(*ifa)); + ifa = (struct l_ifaddr*)malloc(sizeof(*ifa)); memset(ifa, 0, sizeof(*ifa)); ifa->local = addr; ifa->prefix = prefix; @@ -236,10 +240,10 @@ return dent != NULL; } -struct ifaddr *select_ipaddr(int ifindex, __u32 *sel_addr, __u32 **alist) +struct l_ifaddr *select_ipaddr(int ifindex, __u32 *sel_addr, __u32 **alist) { struct iflink *ifl; - struct ifaddr *ifa; + struct l_ifaddr *ifa; int retry = 0; int i; @@ -295,7 +299,7 @@ if (r == NULL) { if (hatype == ARPHRD_ETHER && halen == 6) { - struct ifaddr *ifa; + struct l_ifaddr *ifa; struct hostent *hp; char ename[256]; static struct rarp_map emap = { @@ -305,7 +309,11 @@ 6, }; +#ifndef __UCLIBC__ if (ether_ntohost(ename, lladdr) != 0 || +#else + if ( +#endif (hp = gethostbyname(ename)) == NULL) { if (verbose) syslog(LOG_INFO, "not found in /etc/ethers"); @@ -364,7 +372,7 @@ { __u32 laddr = 0; struct iflink *ifl; - struct ifaddr *ifa; + struct l_ifaddr *ifa; for (ifl=ifl_list; ifl; ifl = ifl->next) if (ifl->index == ifindex) diff -Naur iputils.orig/rdisc.c iputils/rdisc.c --- iputils.orig/rdisc.c 2001-08-24 17:39:00.000000000 +0000 +++ iputils/rdisc.c 2005-06-09 16:15:24.000000000 +0000 @@ -25,6 +25,7 @@ * 2550 Garcia Avenue * Mountain View, California 94043 */ +#include <asm/byteorder.h> #include <stdio.h> #include <errno.h> #include <signal.h> @@ -1504,5 +1505,5 @@ if (logging) syslog(LOG_ERR, "%s: %m", str); else - (void) fprintf(stderr, "%s: %s\n", str, sys_errlist[errno]); + (void) fprintf(stderr, "%s: %s\n", str, strerror(errno)); } diff -Naur iputils.orig/tftpd.c iputils/tftpd.c --- iputils.orig/tftpd.c 2002-01-24 00:31:41.000000000 +0000 +++ iputils/tftpd.c 2005-06-09 16:15:24.000000000 +0000 @@ -48,6 +48,7 @@ * This version includes many modifications by Jim Guyton <guyton@rand-unix> */ +#include <asm/byteorder.h> #include <sys/types.h> #include <sys/ioctl.h> #include <sys/stat.h> @@ -57,7 +58,6 @@ #include <sys/socket.h> #include <netinet/in.h> -#include <linux/in6.h> #include <netdb.h> #include <setjmp.h> diff -Naur iputils.orig/tracepath.c iputils/tracepath.c --- iputils.orig/tracepath.c 2002-11-09 04:54:46.000000000 +0000 +++ iputils/tracepath.c 2005-06-09 16:15:24.000000000 +0000 @@ -9,10 +9,12 @@ * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> */ +#include <asm/byteorder.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> +#include <linux/types.h> #include <linux/errqueue.h> #include <errno.h> #include <string.h> @@ -76,7 +78,7 @@ int progress = -1; int broken_router; -restart: + while (1) { memset(&rcvbuf, -1, sizeof(rcvbuf)); iov.iov_base = &rcvbuf; iov.iov_len = sizeof(rcvbuf); @@ -93,7 +95,7 @@ if (res < 0) { if (errno == EAGAIN) return progress; - goto restart; + continue; } progress = mtu; @@ -216,7 +218,7 @@ perror("NET ERROR"); return 0; } - goto restart; + } } int probe_ttl(int fd, int ttl) @@ -227,7 +229,6 @@ memset(sndbuf,0,mtu); -restart: for (i=0; i<10; i++) { int res; @@ -243,7 +244,8 @@ if (res==0) return 0; if (res > 0) - goto restart; + i = 0; + continue; } hisptr = (hisptr + 1)&63; diff -Naur iputils.orig/tracepath6.c iputils/tracepath6.c --- iputils.orig/tracepath6.c 2001-09-02 02:03:46.000000000 +0000 +++ iputils/tracepath6.c 2005-06-09 16:15:24.000000000 +0000 @@ -9,13 +9,13 @@ * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> */ +#include <asm/byteorder.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> - -#include <linux/in6.h> +#include <linux/types.h> #include <linux/errqueue.h> #include <errno.h> #include <string.h> @@ -66,7 +66,7 @@ int progress = -1; int broken_router; -restart: + while (1) { memset(&rcvbuf, -1, sizeof(rcvbuf)); iov.iov_base = &rcvbuf; iov.iov_len = sizeof(rcvbuf); @@ -83,7 +83,7 @@ if (res < 0) { if (errno == EAGAIN) return progress; - goto restart; + continue; } progress = 2; @@ -222,34 +222,29 @@ perror("NET ERROR"); return 0; } - goto restart; + } } int probe_ttl(int fd, int ttl) { - int i; + int i=0, res; char sndbuf[mtu]; struct probehdr *hdr = (struct probehdr*)sndbuf; -restart: - - for (i=0; i<10; i++) { - int res; - - hdr->ttl = ttl; - gettimeofday(&hdr->tv, NULL); - if (send(fd, sndbuf, mtu-overhead, 0) > 0) - break; - res = recverr(fd, ttl); - if (res==0) - return 0; - if (res > 0) - goto restart; - } - - if (i<10) { - int res; - + while (i<10) { + for (i=0; i<10; i++) { + hdr->ttl = ttl; + gettimeofday(&hdr->tv, NULL); + if (send(fd, sndbuf, mtu-overhead, 0) > 0) + break; + res = recverr(fd, ttl); + if (res==0) + return 0; + if (res > 0) { + i = 0; + continue; + } + } data_wait(fd); if (recv(fd, sndbuf, sizeof(sndbuf), MSG_DONTWAIT) > 0) { printf("%2d?: reply received 8)\n", ttl); @@ -257,7 +252,7 @@ } res = recverr(fd, ttl); if (res == 1) - goto restart; + continue; return res; } diff -Naur iputils.orig/traceroute6.c iputils/traceroute6.c --- iputils.orig/traceroute6.c 2002-10-03 03:29:23.000000000 +0000 +++ iputils/traceroute6.c 2005-06-09 16:14:49.000000000 +0000 @@ -244,11 +244,30 @@ #include <netinet/in.h> #include <netinet/ip.h> #include <netinet/ip_icmp.h> +#if __linux__ +#include <linux/udp.h> +#else #include <netinet/udp.h> +#endif + +#include <linux/types.h> +struct ipv6hdr { +#if defined(__LITTLE_ENDIAN) + __u8 priority:4, + version:4; +#elif defined(__BIG_ENDIAN) + __u8 version:4, + priority:4; +#endif + __u8 flow_lbl[3]; -#include <linux/ipv6.h> -#include <linux/in6.h> + __u16 payload_len; + __u8 nexthdr; + __u8 hop_limit; + struct in6_addr saddr; + struct in6_addr daddr; +}; #include <linux/icmpv6.h> #include <arpa/inet.h>