packages: Add net-tools to OpenEmbedded
authorHolger Freyther <zecke@selfish.org>
Thu, 26 Oct 2006 12:38:27 +0000 (12:38 +0000)
committerHolger Freyther <zecke@selfish.org>
Thu, 26 Oct 2006 12:38:27 +0000 (12:38 +0000)
52 files changed:
packages/net-tools/.mtn2git_empty [new file with mode: 0644]
packages/net-tools/files/.mtn2git_empty [new file with mode: 0644]
packages/net-tools/files/README [new file with mode: 0644]
packages/net-tools/files/ether-wake.8 [new file with mode: 0644]
packages/net-tools/files/ether-wake.c [new file with mode: 0644]
packages/net-tools/files/mii-diag.8 [new file with mode: 0644]
packages/net-tools/files/mii-diag.c [new file with mode: 0644]
packages/net-tools/files/net-tools-1.57-bug22040.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-arp_overflow.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-bcast.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-bitkeeper.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-config.h [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-config.make [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-cycle.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-de.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-duplicate-tcp.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-gcc33.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-gcc34.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-hostname_man.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-ifaceopt.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-ifconfig.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-ifconfig_ib.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-inet6-lookup.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-interface.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-interface_stack.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-ipx.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-isofix.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-man.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-manydevs.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-mii-tool-obsolete.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-miiioctl.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-nameif.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-netmask.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-netstat_stop_trim.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-netstat_ulong.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-note.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-num-ports.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-overflow.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-parse.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-pie.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-return.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-selinux.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-siunits.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-statalias.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-statistics.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-stdo.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-trailingblank.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-trim_iface.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-trunc.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-ulong.patch [new file with mode: 0644]
packages/net-tools/files/net-tools-1.60-virtualname.patch [new file with mode: 0644]
packages/net-tools/net-tools_1.60.bb [new file with mode: 0644]

diff --git a/packages/net-tools/.mtn2git_empty b/packages/net-tools/.mtn2git_empty
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packages/net-tools/files/.mtn2git_empty b/packages/net-tools/files/.mtn2git_empty
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packages/net-tools/files/README b/packages/net-tools/files/README
new file mode 100644 (file)
index 0000000..76e14a2
--- /dev/null
@@ -0,0 +1 @@
+Patches were downloaded from http://ftp.uni-koeln.de/mirrors/fedora/linux/core/5/source/SRPMS/net-tools-1.60-62.1.src.rpm
diff --git a/packages/net-tools/files/ether-wake.8 b/packages/net-tools/files/ether-wake.8
new file mode 100644 (file)
index 0000000..26b4f85
--- /dev/null
@@ -0,0 +1,81 @@
+.\"                                      Hey, EMACS: -*- nroff -*-
+.\" First parameter, NAME, should be all caps
+.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
+.\" other parameters are allowed: see man(7), man(1)
+.TH ETHER-WAKE 8 "March 31, 2003" "Scyld"
+.\" Please adjust this date whenever revising the manpage.
+.\"
+.\" Some roff macros, for reference:
+.\" .nh        disable hyphenation
+.\" .hy        enable hyphenation
+.\" .ad l      left justify
+.\" .ad b      justify to both left and right margins
+.\" .nf        disable filling
+.\" .fi        enable filling
+.\" .br        insert line break
+.\" .sp <n>    insert n+1 empty lines
+.\" for manpage-specific macros, see man(7)
+.SH NAME
+ether-wake \- A tool to send a Wake-On-LAN "Magic Packet"
+.SH SYNOPSIS
+.B ether-wake
+.RI [ options ] " Host-ID"
+.SH DESCRIPTION
+This manual page documents the usage of the
+.B ether-wake
+command.
+.PP
+.\" TeX users may be more comfortable with the \fB<whatever>\fP and
+.\" \fI<whatever>\fP escape sequences to invode bold face and italics, 
+.\" respectively.
+\fBether-wake\fP is a program that generates and transmits a Wake-On-LAN 
+(WOL) "Magic Packet", used for restarting machines that have been
+soft-powered-down (ACPI D3-warm state). It generates the standard
+AMD Magic Packet format, optionally with a password included.  The
+single required parameter is a station (MAC) address or a host ID that can
+be translated to a MAC address by an
+.BR ethers (5)
+database specified in
+.BR nsswitch.conf (5)
+.
+.SH OPTIONS
+\fBether-wake\fP needs a single dash (´-´) in front of options.
+A summary of options is included below.
+.TP
+.B \-b
+Send the wake-up packet to the broadcast address.
+.TP
+.B \-D
+Increase the Debug Level.
+.TP
+.B \-i ifname
+Use interface ifname instead of the default "eth0".
+.TP
+.B \-p passwd
+Append a four or six byte password to the packet. Only a few adapters
+need or support this. A six byte password may be specified in Ethernet hex
+format (00:22:44:66:88:aa) or four byte dotted decimal (192.168.1.1) format.
+A four byte password must use the dotted decimal format.
+
+.TP
+.B \-V
+Show the program version information.
+
+.SH EXIT STATUS
+This program returns 0 on success.
+A permission failures (e.g. run as a non-root user) results in an exit
+status of 2.  Unrecognized or invalid parameters result in an exit
+status of 3.  Failure to retrieve network interface information or send
+a packet will result in an exit status of 1.
+
+.SH SEE ALSO
+.BR arp (8).
+.br
+.SH SECURITY
+On some non-Linux systems dropping root capability allows the process to be
+dumped, traced or debugged.
+If someone traces this program, they get control of a raw socket.
+Linux handles this safely, but beware when porting this program.
+.SH AUTHOR
+The etherwake program was written by Donald Becker at Scyld Computing
+Corporation for use with the Scyld(\*(Tm) Beowulf System.
diff --git a/packages/net-tools/files/ether-wake.c b/packages/net-tools/files/ether-wake.c
new file mode 100644 (file)
index 0000000..eef22a7
--- /dev/null
@@ -0,0 +1,392 @@
+/* ether-wake.c: Send a magic packet to wake up sleeping machines. */
+
+static char version_msg[] =
+"ether-wake.c: v1.09 11/12/2003 Donald Becker, http://www.scyld.com/";
+static char brief_usage_msg[] =
+"usage: ether-wake [-i <ifname>] [-p aa:bb:cc:dd[:ee:ff]] 00:11:22:33:44:55\n"
+"   Use '-u' to see the complete set of options.\n";
+static char usage_msg[] =
+"usage: ether-wake [-i <ifname>] [-p aa:bb:cc:dd[:ee:ff]] 00:11:22:33:44:55\n"
+"\n"
+"      This program generates and transmits a Wake-On-LAN (WOL)\n"
+"      \"Magic Packet\", used for restarting machines that have been\n"
+"      soft-powered-down (ACPI D3-warm state).\n"
+"      It currently generates the standard AMD Magic Packet format, with\n"
+"      an optional password appended.\n"
+"\n"
+"      The single required parameter is the Ethernet MAC (station) address\n"
+"      of the machine to wake or a host ID with known NSS 'ethers' entry.\n"
+"      The MAC address may be found with the 'arp' program while the target\n"
+"      machine is awake.\n"
+"\n"
+"      Options:\n"
+"              -b      Send wake-up packet to the broadcast address.\n"
+"              -D      Increase the debug level.\n"
+"              -i ifname       Use interface IFNAME instead of the default 'eth0'.\n"
+"              -p <pw>         Append the four or six byte password PW to the packet.\n"
+"                                      A password is only required for a few adapter types.\n"
+"                                      The password may be specified in ethernet hex format\n"
+"                                      or dotted decimal (Internet address)\n"
+"              -p 00:22:44:66:88:aa\n"
+"              -p 192.168.1.1\n";
+
+/*
+       This program generates and transmits a Wake-On-LAN (WOL) "Magic Packet",
+       used for restarting machines that have been soft-powered-down
+       (ACPI D3-warm state).  It currently generates the standard AMD Magic Packet
+       format, with an optional password appended.
+
+       This software may be used and distributed according to the terms
+       of the GNU Public License, incorporated herein by reference.
+       Contact the author for use under other terms.
+
+       This source file was originally part of the network tricks package, and
+       is now distributed to support the Scyld Beowulf system.
+       Copyright 1999-2003 Donald Becker and Scyld Computing Corporation.
+
+       The author may be reached as becker@scyld, or C/O
+        Scyld Computing Corporation
+        914 Bay Ridge Road, Suite 220
+        Annapolis MD 21403
+
+  Notes:
+  On some systems dropping root capability allows the process to be
+  dumped, traced or debugged.
+  If someone traces this program, they get control of a raw socket.
+  Linux handles this safely, but beware when porting this program.
+
+  An alternative to needing 'root' is using a UDP broadcast socket, however
+  doing so only works with adapters configured for unicast+broadcast Rx
+  filter.  That configuration consumes more power.
+*/
+\f
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <ctype.h>
+#include <string.h>
+
+#if 0                                                  /* Only exists on some versions. */
+#include <ioctls.h>
+#endif
+
+#include <sys/socket.h>
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <linux/if.h>
+
+#include <features.h>
+#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
+#include <netpacket/packet.h>
+#include <net/ethernet.h>
+#else
+#include <asm/types.h>
+#include <linux/if_packet.h>
+#include <linux/if_ether.h>
+#endif
+#include <netdb.h>
+#include <netinet/ether.h>
+
+/* Grrr, no consistency between include versions.
+   Enable this if setsockopt() isn't declared with your library. */
+#if 0
+extern int setsockopt __P ((int __fd, int __level, int __optname,
+                                                       __ptr_t __optval, int __optlen));
+#else                          /* New, correct head files.  */
+#include <sys/socket.h>
+#endif
+
+u_char outpack[1000];
+int outpack_sz = 0;
+int debug = 0;
+u_char wol_passwd[6];
+int wol_passwd_sz = 0;
+
+static int opt_no_src_addr = 0, opt_broadcast = 0;
+
+static int get_dest_addr(const char *arg, struct ether_addr *eaddr);
+static int get_fill(unsigned char *pkt, struct ether_addr *eaddr);
+static int get_wol_pw(const char *optarg);
+
+int main(int argc, char *argv[])
+{
+       char *ifname = "eth0";
+       int one = 1;                            /* True, for socket options. */
+       int s;                                          /* Raw socket */
+       int errflag = 0, verbose = 0, do_version = 0;
+       int perm_failure = 0;
+       int i, c, pktsize;
+#if defined(PF_PACKET)
+       struct sockaddr_ll whereto;
+#else
+       struct sockaddr whereto;        /* who to wake up */
+#endif
+       struct ether_addr eaddr;
+
+       while ((c = getopt(argc, argv, "bDi:p:uvV")) != -1)
+               switch (c) {
+               case 'b': opt_broadcast++;      break;
+               case 'D': debug++;                      break;
+               case 'i': ifname = optarg;      break;
+               case 'p': get_wol_pw(optarg); break;
+               case 'u': printf(usage_msg); return 0;
+               case 'v': verbose++;            break;
+               case 'V': do_version++;         break;
+               case '?':
+                       errflag++;
+               }
+       if (verbose || do_version)
+               printf("%s\n", version_msg);
+       if (errflag) {
+               fprintf(stderr, brief_usage_msg);
+               return 3;
+       }
+
+       if (optind == argc) {
+               fprintf(stderr, "Specify the Ethernet address as 00:11:22:33:44:55.\n");
+               return 3;
+       }
+
+       /* Note: PF_INET, SOCK_DGRAM, IPPROTO_UDP would allow SIOCGIFHWADDR to
+          work as non-root, but we need SOCK_PACKET to specify the Ethernet
+          destination address. */
+#if defined(PF_PACKET)
+       s = socket(PF_PACKET, SOCK_RAW, 0);
+#else
+       s = socket(AF_INET, SOCK_PACKET, SOCK_PACKET);
+#endif
+       if (s < 0) {
+               if (errno == EPERM)
+                       fprintf(stderr, "ether-wake: This program must be run as root.\n");
+               else
+                       perror("ether-wake: socket");
+               perm_failure++;
+       }
+       /* Don't revert if debugging allows a normal user to get the raw socket. */
+       setuid(getuid());
+
+       /* We look up the station address before reporting failure so that
+          errors may be reported even when run as a normal user.
+       */
+       if (get_dest_addr(argv[optind], &eaddr) != 0)
+               return 3;
+       if (perm_failure && ! debug)
+               return 2;
+
+       pktsize = get_fill(outpack, &eaddr);
+
+       /* Fill in the source address, if possible.
+          The code to retrieve the local station address is Linux specific. */
+       if (! opt_no_src_addr) {
+               struct ifreq if_hwaddr;
+               unsigned char *hwaddr = if_hwaddr.ifr_hwaddr.sa_data;
+
+               strcpy(if_hwaddr.ifr_name, ifname);
+               if (ioctl(s, SIOCGIFHWADDR, &if_hwaddr) < 0) {
+                       fprintf(stderr, "SIOCGIFHWADDR on %s failed: %s\n", ifname,
+                                       strerror(errno));
+                       /* Magic packets still work if our source address is bogus, but
+                          we fail just to be anal. */
+                       return 1;
+               }
+               memcpy(outpack+6, if_hwaddr.ifr_hwaddr.sa_data, 6);
+
+               if (verbose) {
+                       printf("The hardware address (SIOCGIFHWADDR) of %s is type %d  "
+                                  "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.\n", ifname,
+                                  if_hwaddr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1],
+                                  hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
+               }
+       }
+
+       if (wol_passwd_sz > 0) {
+               memcpy(outpack+pktsize, wol_passwd, wol_passwd_sz);
+               pktsize += wol_passwd_sz;
+       }
+
+       if (verbose > 1) {
+               printf("The final packet is: ");
+               for (i = 0; i < pktsize; i++)
+                       printf(" %2.2x", outpack[i]);
+               printf(".\n");
+       }
+
+       /* This is necessary for broadcasts to work */
+       if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&one, sizeof(one)) < 0)
+               perror("setsockopt: SO_BROADCAST");
+
+#if defined(PF_PACKET)
+       {
+               struct ifreq ifr;
+               strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+               if (ioctl(s, SIOCGIFINDEX, &ifr) == -1) {
+                       fprintf(stderr, "SIOCGIFINDEX on %s failed: %s\n", ifname,
+                                       strerror(errno));
+                       return 1;
+               }
+               memset(&whereto, 0, sizeof(whereto));
+               whereto.sll_family = AF_PACKET;
+               whereto.sll_ifindex = ifr.ifr_ifindex;
+               /* The manual page incorrectly claims the address must be filled.
+                  We do so because the code may change to match the docs. */
+               whereto.sll_halen = ETH_ALEN;
+               memcpy(whereto.sll_addr, outpack, ETH_ALEN);
+
+       }
+#else
+       whereto.sa_family = 0;
+       strcpy(whereto.sa_data, ifname);
+#endif
+
+       if ((i = sendto(s, outpack, pktsize, 0, (struct sockaddr *)&whereto,
+                                       sizeof(whereto))) < 0)
+               perror("sendto");
+       else if (debug)
+               printf("Sendto worked ! %d.\n", i);
+
+#ifdef USE_SEND
+       if (bind(s, (struct sockaddr *)&whereto, sizeof(whereto)) < 0)
+               perror("bind");
+       else if (send(s, outpack, 100, 0) < 0)
+               perror("send");
+#endif
+#ifdef USE_SENDMSG
+       {
+               struct msghdr msghdr = { 0,};
+               struct iovec iovector[1];
+               msghdr.msg_name = &whereto;
+               msghdr.msg_namelen = sizeof(whereto);
+               msghdr.msg_iov = iovector;
+               msghdr.msg_iovlen = 1;
+               iovector[0].iov_base = outpack;
+               iovector[0].iov_len = pktsize;
+               if ((i = sendmsg(s, &msghdr, 0)) < 0)
+                       perror("sendmsg");
+               else if (debug)
+                       printf("sendmsg worked, %d (%d).\n", i, errno);
+       }
+#endif
+
+       return 0;
+}
+
+/* Convert the host ID string to a MAC address.
+   The string may be a
+       Host name
+    IP address string
+       MAC address string
+*/
+
+static int get_dest_addr(const char *hostid, struct ether_addr *eaddr)
+{
+       struct ether_addr *eap;
+
+       eap = ether_aton(hostid);
+       if (eap) {
+               *eaddr = *eap;
+               if (debug)
+                       fprintf(stderr, "The target station address is %s.\n",
+                                       ether_ntoa(eaddr));
+       } else if (ether_hostton(hostid, eaddr) == 0) {
+               if (debug)
+                       fprintf(stderr, "Station address for hostname %s is %s.\n",
+                                       hostid, ether_ntoa(eaddr));
+       } else {
+               (void)fprintf(stderr,
+                                         "ether-wake: The Magic Packet host address must be "
+                                         "specified as\n"
+                                         "  - a station address, 00:11:22:33:44:55, or\n"
+                                         "  - a hostname with a known 'ethers' entry.\n");
+               return -1;
+       }
+       return 0;
+}
+
+
+static int get_fill(unsigned char *pkt, struct ether_addr *eaddr)
+{
+       int offset, i;
+       unsigned char *station_addr = eaddr->ether_addr_octet;
+
+       if (opt_broadcast)
+               memset(pkt+0, 0xff, 6);
+       else
+               memcpy(pkt, station_addr, 6);
+       memcpy(pkt+6, station_addr, 6);
+       pkt[12] = 0x08;                         /* Or 0x0806 for ARP, 0x8035 for RARP */
+       pkt[13] = 0x42;
+       offset = 14;
+
+       memset(pkt+offset, 0xff, 6);
+       offset += 6;
+
+       for (i = 0; i < 16; i++) {
+               memcpy(pkt+offset, station_addr, 6);
+               offset += 6;
+       }
+       if (debug) {
+               fprintf(stderr, "Packet is ");
+               for (i = 0; i < offset; i++)
+                       fprintf(stderr, " %2.2x", pkt[i]);
+               fprintf(stderr, ".\n");
+       }
+       return offset;
+}
+
+static int get_wol_pw(const char *optarg)
+{
+       int passwd[6];
+       int byte_cnt;
+       int i;
+
+       byte_cnt = sscanf(optarg, "%2x:%2x:%2x:%2x:%2x:%2x",
+                                         &passwd[0], &passwd[1], &passwd[2],
+                                         &passwd[3], &passwd[4], &passwd[5]);
+       if (byte_cnt < 4)
+               byte_cnt = sscanf(optarg, "%d.%d.%d.%d",
+                                                 &passwd[0], &passwd[1], &passwd[2], &passwd[3]);
+       if (byte_cnt < 4) {
+               fprintf(stderr, "Unable to read the Wake-On-LAN password.\n");
+               return 0;
+       }
+       printf(" The Magic packet password is %2.2x %2.2x %2.2x %2.2x (%d).\n",
+                  passwd[0], passwd[1], passwd[2], passwd[3], byte_cnt);
+       for (i = 0; i < byte_cnt; i++)
+               wol_passwd[i] = passwd[i];
+       return wol_passwd_sz = byte_cnt;
+}
+
+#if 0
+{
+       to = (struct sockaddr_in *)&whereto;
+       to->sin_family = AF_INET;
+       if (inet_aton(target, &to->sin_addr)) {
+               hostname = target;
+       }
+       memset (&sa, 0, sizeof sa);
+       sa.sa_family = AF_INET;
+       strncpy (sa.sa_data, interface, sizeof sa.sa_data);
+       sendto (sock, buf, bufix + len, 0, &sa, sizeof sa);
+       strncpy (sa.sa_data, interface, sizeof sa.sa_data);
+#if 1
+       sendto (sock, buf, bufix + len, 0, &sa, sizeof sa);
+#else
+       bind (sock, &sa, sizeof sa);
+       connect();
+       send (sock, buf, bufix + len, 0);
+#endif
+}
+#endif
+
+\f
+/*
+ * Local variables:
+ *  compile-command: "gcc -O -Wall -o ether-wake ether-wake.c"
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ *  c-indent-level: 4
+ *  tab-width: 4
+ * End:
+ */
diff --git a/packages/net-tools/files/mii-diag.8 b/packages/net-tools/files/mii-diag.8
new file mode 100644 (file)
index 0000000..aa0dc0b
--- /dev/null
@@ -0,0 +1,160 @@
+.\"                                      Hey, EMACS: -*- nroff -*-
+.\" $Revision: 1.1 $ $Date: 2003/09/06 17:20:17 $
+.\" First parameter, NAME, should be all caps
+.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
+.\" other parameters are allowed: see man(7), man(1)
+.TH MII-DIAG 8 "September 9, 2003" "Scyld Beowulf\*(Tm"
+.\" Please adjust this date whenever revising the manpage.
+.\"
+.\" Some roff macros, for reference:
+.\" .nh        disable hyphenation
+.\" .hy        enable hyphenation
+.\" .ad l      left justify
+.\" .ad b      justify to both left and right margins
+.\" .nf        disable filling
+.\" .fi        enable filling
+.\" .br        insert line break
+.\" .sp <n>    insert n+1 empty lines
+.\" for manpage-specific macros, see man(7)
+.SH NAME
+mii-diag \- Network adapter control and monitoring
+.SH SYNOPSIS
+.B mii-diag
+.RI [ options ] <interface>
+.SH DESCRIPTION
+This manual page documents briefly the
+.B mii-diag
+network adapter control and monitoring command.
+Addition documentation is available from http://scyld.com/diag/index.html.
+
+.\" TeX users may be more comfortable with the \fB<whatever>\fP and
+.\" \fI<whatever>\fP escape sequences to invoke bold face and italics, 
+.\" respectively.
+.PP
+This \fBmii-diag\fP command configures, controls and monitors the
+transceiver management registers for network interfaces, and configures
+driver operational parameters.  For transceiver control \fBmii-diag\fP
+uses the Media Independent Interface (MII) standard (thus the command name).
+It also has additional Linux-specific controls to communicate parameters
+such as message enable settings and buffer sizes to the underlying device
+driver.
+.PP
+The MII standard defines registers that control and report network
+transceiver capabilities, link settings and errors.  Examples are link
+speed, duplex, capabilities advertised to the link partner, status LED
+indications and link error counters.
+
+.SH OPTIONS
+The \fBmii-diag\fP command supports both single character and long
+option names.  Short options use a single dash (´-´) in front of the option
+character.  For options without parameters, multiple options may be
+concatenated after a single dash.  Long options are prefixed by two
+dashes (´--´), and may be abbreviated with a unique prefix.
+A long option may take a parameter of the form --arg=param or --arg param.
+
+.PP
+A summary of options is as follows.
+
+.TP
+.B \-A, --advertise <speed|setting>
+.BR
+.B \-F, --fixed-speed <speed|setting>
+
+Speed is one of: 100baseT4, 100baseTx, 100baseTx-FD, 100baseTx-HD, 10baseT,
+10baseT-FD, 10baseT-HD.  For more precise control an explict numeric
+register setting is also allowed.
+
+
+.TP
+.B \-a, \--all-interfaces
+Show the status of all interfaces.  This option is not recommended with
+any other option, especially ones that change settings.
+
+.TP
+.B \-s,\--status
+Return exit status 2 if there is no link beat.
+
+.TP
+.B \-D
+Increase the debugging level.  This may be used to understand the
+actions the command is taking.
+
+.TP
+.B \-g, \--read-parameters
+Show driver-specific parameters.
+
+.TP
+.B \-G, \--set-parameters value[,value...]
+Set driver-specific parameters.
+Set a adapter-specific parameters.
+Parameters are comma separated, with missing elements retaining the
+existing value.
+
+.TP
+.B \-v
+Increase the verbosity level.  Additional "-v" options increase the
+level further.
+
+.TP
+.B \-V
+Show the program version information.
+
+.TP
+.B \-w, \--watch
+Continuously monitor the transceiver and report changes.
+
+.TP
+.B \-?
+Emit usage information.
+
+.SH DESCRIPTION
+
+.PP
+Calling the command with just the interface name (which defaults to
+'eth0' if missing) produces extensive output describing the transceiver
+capabilities, configuration and current status.
+
+.PP
+The '--monitor' option allows scripting link beat changes.
+.PP
+This option is similar to --watch, but with lower overhead and simplifed
+output.  It polls the interface only once a second and the output format
+is a single line per link change with three fixed words
+  <unknown|down||negotiating|up> <STATUS> <PARTNER-CAP>
+.PP
+Example output:  mii-diag --monitor eth0
+   down         0x7809 0x0000
+   negotiating  0x7829 0x45e1
+   up           0x782d 0x45e1
+   down         0x7809 0x0000
+
+.PP
+This may be used as
+  mii-diag --monitor eth0 |
+    while read linkstatus bmsr linkpar; do
+     case $linkstatus in
+        up)   ifup eth0 ;;
+        down) ifdown eth0 ;;
+     esac
+    done
+
+.PP
+It may be useful to shorten the DHCP client daemon timeout if it does
+not receive an address by adding the following setting to
+/etc/sysconfig/network:
+DHCPCDARGS="-t 3"
+
+.SH SEE ALSO
+.BR ether-wake (8), net-diag (8), mii-tool (8).
+.br
+Addition documentation is available from http://scyld.com/diag/index.html.
+
+.SH KNOWN BUGS
+The --all-interfaces option is quirky.  There are very few settings that
+are usefully applied to all interfaces.
+
+.SH AUTHOR
+The manual pages, diagnostic commands, and many of the underlying Linux
+network drivers were written by Donald Becker for the Scyld
+Beowulf(\*(Tm) cluster system.
+
diff --git a/packages/net-tools/files/mii-diag.c b/packages/net-tools/files/mii-diag.c
new file mode 100644 (file)
index 0000000..17d8bef
--- /dev/null
@@ -0,0 +1,650 @@
+/* Mode: C;
+ * mii-diag.c: Examine and set the MII registers of a network interfaces.
+
+       Usage:  mii-diag [-vw] interface.
+
+       This program reads and writes the Media Independent Interface (MII)
+       management registers on network transceivers.  The registers control
+       and report network link settings and errors.  Examples are link speed,
+       duplex, capabilities advertised to the link partner, status LED
+       indications and link error counters.
+
+       Notes:
+       The compile-command is at the end of this source file.
+       This program works with drivers that implement MII ioctl() calls.
+
+       Written/copyright 1997-2003 by Donald Becker <becker@scyld.com>
+
+       This program is free software; you can redistribute it
+       and/or modify it under the terms of the GNU General Public
+       License as published by the Free Software Foundation.
+
+       The author may be reached as becker@scyld.com, or C/O
+        Scyld Computing Corporation
+        914 Bay Ridge Road, Suite 220
+        Annapolis MD 21403
+
+       References
+       http://scyld.com/expert/mii-status.html
+       http://scyld.com/expert/NWay.html
+       http://www.national.com/pf/DP/DP83840.html
+*/
+
+static char version[] =
+"mii-diag.c:v2.11 3/21/2005 Donald Becker (becker@scyld.com)\n"
+" http://www.scyld.com/diag/index.html\n";
+
+static const char usage_msg[] =
+"Usage: %s [--help] [-aDfrRvVw] [-AF <speed+duplex>] [--watch] <interface>.\n";
+static const char long_usage_msg[] =
+"Usage: %s [-aDfrRvVw] [-AF <speed+duplex>] [--watch] <interface>.\n\
+\n\
+  This program configures and monitors the transceiver management registers\n\
+  for network interfaces.  It uses the Media Independent Interface (MII)\n\
+  standard with additional Linux-specific controls to communicate with the\n\
+  underlying device driver.  The MII registers control and report network\n\
+  link settings and errors.  Examples are link speed, duplex, capabilities\n\
+  advertised to the link partner, status LED indications and link error\n\
+  counters.\n\
+\n\
+   The common usage is\n\
+      mii-diag eth0\n\
+\n\
+   The default interface is \"eth0\".\n\
+ Frequently used options are\n\
+   -A  --advertise <speed|setting>\n\
+   -F  --fixed-speed <speed>\n\
+       Speed is one of: 100baseT4, 100baseTx, 100baseTx-FD, 100baseTx-HD,\n\
+                        10baseT, 10baseT-FD, 10baseT-HD\n\
+   -s  --status     Return exit status 2 if there is no link beat.\n\
+\n\
+ Less frequently used options are\n\
+   -a  --all-interfaces  Show the status all interfaces\n\
+              (Not recommended with options that change settings.)\n\
+   -D  --debug\n\
+   -g  --read-parameters       Get driver-specific parameters.\n\
+   -G  --set-parameters PARMS  Set driver-specific parameters.\n\
+       Parameters are comma separated, missing parameters retain\n\
+       their previous values.\n\
+   -M  --msg-level LEVEL       Set the driver message bit map.\n\
+   -p  --phy ADDR              Set the PHY (MII address) to report.\n\
+   -r  --restart       Restart the link autonegotiation.\n\
+   -R  --reset         Reset the transceiver.\n\
+   -v  --verbose       Report each action taken.\n\
+   -V  --version       Emit version information.\n\
+   -w  --watch         Continuously monitor the transceiver and report changes.\n\
+\n\
+   This command returns success (zero) if the interface information can be\n\
+   read.  If the --status option is passed, a zero return means that the\n\
+   interface has link beat.\n\
+";
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <getopt.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#ifdef use_linux_libc5
+#include <linux/if_arp.h>
+#include <linux/if_ether.h>
+#endif
+
+typedef u_int32_t u32;
+typedef u_int16_t u16;
+typedef u_int8_t u8;
+
+#if defined(SIOCGPARAMS)  && SIOCGPARAMS != SIOCDEVPRIVATE+3
+#error Changed definition for SIOCGPARAMS
+#else
+#define SIOCGPARAMS (SIOCDEVPRIVATE+3)                 /* Read operational parameters. */
+#define SIOCSPARAMS (SIOCDEVPRIVATE+4)                 /* Set operational parameters. */
+#endif
+
+const char shortopts[] = "aA:C:DfF:gG:hmM:p:rRsvVw?";
+struct option longopts[] = {
+ /* { name  has_arg  *flag  val } */
+    {"all-interfaces", 0, 0, 'a'},     /* Show all interfaces. */
+       {"advertise",   1, 0, 'A'},             /* Change the capabilities advertised. */
+       {"BMCR",                1, 0, 'C'},             /* Set the control register. */
+    {"debug",       0, 0, 'D'},                /* Increase the debug level. */
+    {"force",       0, 0, 'f'},                /* Force the operation. */
+    {"fixed-speed", 1, 0, 'F'},                /* Fixed speed name. */
+    {"read-parameters", 0, 0, 'g'}, /* Show general settings values. */
+    {"set-parameters",  1, 0, 'G'},    /* Write general settings values. */
+    {"help",           0, 0, 'h'},             /* Print a long usage message. */
+    {"monitor",                0, 0, 'm'},             /* Monitor status register. */
+    {"msg-level",      1, 0, 'M'},             /* Set the driver message level. */
+    {"phy",                    1, 0, 'p'},             /* Set the PHY (MII address) to report. */
+    {"restart",                0, 0, 'r'},             /* Restart the link negotiation */
+    {"reset",          0, 0, 'R'},             /* Reset the transceiver. */
+    {"status",         0, 0, 's'},             /* Non-zero exit status w/ no link beat. */
+    {"verbose",        0, 0, 'v'},             /* Report each action taken.  */
+    {"version",        0, 0, 'V'},             /* Emit version information.  */
+    {"watch",          0, 0, 'w'},             /* Constantly monitor the port.  */
+    {"error",          0, 0, '?'},             /* Return the error message. */
+    { 0, 0, 0, 0 }
+};
+
+/* Usually in libmii.c, but trivial substitions are below. */
+extern int  show_mii_details(long ioaddr, int phy_id);
+extern void monitor_mii(long ioaddr, int phy_id);
+int  show_mii_details(long ioaddr, int phy_id) __attribute__((weak));
+void monitor_mii(long ioaddr, int phy_id) __attribute__((weak));
+
+
+/* Command-line flags. */
+unsigned int opt_a = 0,                                        /* Show-all-interfaces flag. */
+       opt_f = 0,                                      /* Force the operation. */
+       opt_g = 0,
+       opt_G = 0,
+       verbose = 0,                            /* Verbose flag. */
+       debug = 0,
+       opt_version = 0,
+       opt_restart = 0,
+       opt_reset = 0,
+       opt_status = 0,
+       opt_watch = 0;
+static int msg_level = -1;
+static int set_BMCR = -1;
+static int nway_advertise = 0;
+static int fixed_speed = -1;
+static int override_phy = -1;
+char *opt_G_string = NULL;
+
+/* Internal values. */
+int new_ioctl_nums;
+int skfd = -1;                                 /* AF_INET socket for ioctl() calls.    */
+struct ifreq ifr;
+
+int do_one_xcvr(int skfd);
+int show_basic_mii(long ioaddr, int phy_id);
+int mdio_read(int skfd, int phy_id, int location);
+void mdio_write(int skfd, int phy_id, int location, int value);
+static int parse_advertise(const char *capabilities);
+static void monitor_status(long ioaddr, int phy_id);
+
+
+int
+main(int argc, char **argv)
+{
+       int c, errflag = 0;
+       char **spp, *ifname;
+    char *progname = rindex(argv[0], '/') ? rindex(argv[0], '/')+1 : argv[0];
+
+       while ((c = getopt_long(argc, argv, shortopts, longopts, 0)) != EOF)
+               switch (c) {
+               case 'a': opt_a++; break;
+               case 'A': nway_advertise |= parse_advertise(optarg);
+                       if (nway_advertise == -1) errflag++;
+                       break;
+               case 'C': set_BMCR = strtoul(optarg, NULL, 16); break;
+               case 'D': debug++;                      break;
+               case 'f': opt_f++; break;
+               case 'F': fixed_speed = parse_advertise(optarg);
+                       if (fixed_speed == -1) errflag++;
+                       break;
+               case 'g': opt_g++; break;
+               case 'G': opt_G++; opt_G_string = strdup(optarg); break;
+               case 'm': opt_watch++; opt_status++; break;
+               case 'M': msg_level = strtoul(optarg, NULL, 0); break;
+               case 'h': fprintf(stderr, long_usage_msg, progname); return 0;
+               case 'p': override_phy = atoi(optarg); break;
+               case 'r': opt_restart++;        break;
+               case 'R': opt_reset++;          break;
+               case 's': opt_status++;         break;
+               case 'v': verbose++;            break;
+               case 'V': opt_version++;        break;
+               case 'w': opt_watch++;          break;
+               case '?': errflag++;            break;
+               }
+       if (errflag) {
+               fprintf(stderr, usage_msg, progname);
+               return 2;
+       }
+
+       if (verbose || opt_version)
+               printf(version);
+
+       /* Open a basic socket. */
+       if ((skfd = socket(AF_INET, SOCK_DGRAM,0)) < 0) {
+               perror("socket");
+               return 1;
+       }
+
+       if (debug)
+               fprintf(stderr, "DEBUG: argc=%d, optind=%d and argv[optind] is %s.\n",
+                               argc, optind, argv[optind]);
+
+       /* No remaining args means show all interfaces. */
+       if (optind == argc) {
+               ifname = "eth0";
+               fprintf(stderr, "Using the default interface 'eth0'.\n");
+       } else {
+               /* Copy the interface name. */
+               spp = argv + optind;
+               ifname = *spp++;
+       }
+
+       if (ifname == NULL) {
+               ifname = "eth0";
+               fprintf(stderr, "Using the default interface 'eth0'.\n");
+       }
+
+       /* Verify that the interface supports the ioctl(), and if
+          it is using the new or old SIOCGMIIPHY value (grrr...).
+        */
+       {
+               u16 *data = (u16 *)(&ifr.ifr_data);
+
+               strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+               data[0] = 0;
+
+               if (ioctl(skfd, 0x8947, &ifr) >= 0) {
+                       new_ioctl_nums = 1;
+               } else if (ioctl(skfd, SIOCDEVPRIVATE, &ifr) >= 0) {
+                       new_ioctl_nums = 0;
+               } else {
+                       fprintf(stderr, "SIOCGMIIPHY on %s failed: %s\n", ifname,
+                                       strerror(errno));
+                       (void) close(skfd);
+                       return 1;
+               }
+               if (verbose)
+                       printf("  Using the %s SIOCGMIIPHY value on PHY %d "
+                                  "(BMCR 0x%4.4x).\n",
+                                  new_ioctl_nums ? "new" : "old", data[0], data[3]);
+       }
+
+       do_one_xcvr(skfd);
+
+       (void) close(skfd);
+       return 0;
+}
+
+int do_one_xcvr(int skfd)
+{
+       u16 *data = (u16 *)(&ifr.ifr_data);
+       u32 *data32 = (u32 *)(&ifr.ifr_data);
+       unsigned phy_id = data[0];
+
+       if (override_phy >= 0) {
+               printf("Using the specified MII PHY index %d.\n", override_phy);
+               phy_id = override_phy;
+       }
+
+       if (opt_g || opt_G || msg_level >= 0) {
+               if (ioctl(skfd, SIOCGPARAMS, &ifr) < 0) {
+                       fprintf(stderr, "SIOCGPARAMS on %s failed: %s\n", ifr.ifr_name,
+                                       strerror(errno));
+                       return -1;
+               }
+       }
+       if (opt_g) {
+               int i;
+               printf("Driver general parameter settings:");
+               for (i = 0; i*sizeof(u32) < sizeof(ifr.ifr_ifru); i++) {
+                       printf(" %d", data32[i]);
+               }
+               printf(".\n");
+       }
+       if (opt_G) {
+               /* Set up to four arbitrary driver parameters from the -G parameter.
+                  The format is comma separated integers, with a missing element
+                  retaining the previous value.
+               */
+               char *str = opt_G_string;
+               int i;
+               for (i = 0; str && i < 4; i++) {
+                       char *endstr;
+                       u32 newval = strtol(str, &endstr, 0);
+                       if (debug)
+                               printf(" parse string '%s'  value %d end '%s'.\n",
+                                          str, newval, endstr);
+                       if (str == endstr) {
+                               if (endstr[0] == ',') /* No parameter */
+                                       str = endstr+1;
+                               else {
+                                       fprintf(stderr, "Invalid driver parameter '%s'.\n", str);
+                                       str = index(str, ',');
+                               }
+                       } else if (endstr[0] == ',') {
+                               data32[i] = newval;
+                               str = endstr + 1;
+                       } else if (endstr[0] == 0) {
+                               data32[i] = newval;
+                               break;
+                       }
+               }
+               printf("Setting new driver general parameters:");
+               for (i = 0; i*sizeof(u32) < sizeof(ifr.ifr_ifru); i++) {
+                       printf(" %d", data32[i]);
+               }
+               printf(".\n");
+               if (ioctl(skfd, SIOCSPARAMS, &ifr) < 0) {
+                       fprintf(stderr, "SIOCSPARAMS on %s failed: %s\n", ifr.ifr_name,
+                                       strerror(errno));
+                       return -1;
+               }
+       }
+       if (msg_level >= 0) {
+               data32[0] = msg_level;
+               if (ioctl(skfd, SIOCSPARAMS, &ifr) < 0) {
+                       fprintf(stderr, "SIOCSPARAMS on %s failed: %s\n", ifr.ifr_name,
+                                       strerror(errno));
+                       return -1;
+               }
+       }
+
+       if (opt_reset) {
+               printf("Resetting the transceiver...\n");
+               mdio_write(skfd, phy_id, 0, 0x8000);
+       }
+       /* Note: PHY addresses > 32 are pseudo-MII devices, usually built-in. */
+       if (phy_id < 64  &&  nway_advertise > 0) {
+               printf(" Setting the media capability advertisement register of "
+                          "PHY #%d to 0x%4.4x.\n", phy_id, nway_advertise | 1);
+               mdio_write(skfd, phy_id, 4, nway_advertise | 1);
+               mdio_write(skfd, phy_id, 0, 0x1000);
+       }
+
+       if (opt_restart) {
+               printf("Restarting negotiation...\n");
+               mdio_write(skfd, phy_id, 0, 0x0000);
+               mdio_write(skfd, phy_id, 0, 0x1200);
+       }
+       /* To force 100baseTx-HD do  mdio_write(skfd, phy_id, 0, 0x2000); */
+       if (fixed_speed >= 0) {
+               int reg0_val = 0;
+               if (fixed_speed & 0x0180)               /* 100mpbs */
+                       reg0_val |=  0x2000;
+               if ((fixed_speed & 0x0140) &&           /* A full duplex type and */
+                       ! (fixed_speed & 0x0820))               /* no half duplex types. */
+                       reg0_val |= 0x0100;
+               printf("Setting the speed to \"fixed\", Control register %4.4x.\n",
+                          reg0_val);
+               mdio_write(skfd, phy_id, 0, reg0_val);
+       }
+       if (set_BMCR >= 0) {
+               printf("Setting the Basic Mode Control Register to 0x%4.4x.\n",
+                          set_BMCR);
+               mdio_write(skfd, phy_id, 0, set_BMCR);
+       }
+
+       if (opt_watch && opt_status)
+               monitor_status(skfd, phy_id);
+
+       show_basic_mii(skfd, phy_id);
+#ifdef LIBMII
+       if (verbose)
+               show_mii_details(skfd, phy_id);
+#else
+       if (verbose || debug) {
+               int mii_reg, mii_val;
+               printf(" MII PHY #%d transceiver registers:", phy_id);
+               for (mii_reg = 0; mii_reg < 32; mii_reg++) {
+                       mii_val = mdio_read(skfd, phy_id, mii_reg);
+                       printf("%s %4.4x", (mii_reg % 8) == 0 ? "\n  " : "",
+                                  mii_val);
+               }
+               printf("\n");
+       }
+#endif
+
+       if (opt_watch)
+               monitor_mii(skfd, phy_id);
+       if (opt_status &&
+               (mdio_read(skfd, phy_id, 1) & 0x0004) == 0)
+               exit(2);
+       return 0;
+}
+
+int mdio_read(int skfd, int phy_id, int location)
+{
+       u16 *data = (u16 *)(&ifr.ifr_data);
+
+       data[0] = phy_id;
+       data[1] = location;
+
+       if (ioctl(skfd, new_ioctl_nums ? 0x8948 : SIOCDEVPRIVATE+1, &ifr) < 0) {
+               fprintf(stderr, "SIOCGMIIREG on %s failed: %s\n", ifr.ifr_name,
+                               strerror(errno));
+               return -1;
+       }
+       return data[3];
+}
+
+void mdio_write(int skfd, int phy_id, int location, int value)
+{
+       u16 *data = (u16 *)(&ifr.ifr_data);
+
+       data[0] = phy_id;
+       data[1] = location;
+       data[2] = value;
+
+       if (ioctl(skfd, new_ioctl_nums ? 0x8949 : SIOCDEVPRIVATE+2, &ifr) < 0) {
+               fprintf(stderr, "SIOCSMIIREG on %s failed: %s\n", ifr.ifr_name,
+                               strerror(errno));
+       }
+}
+
+/* Parse the command line argument for advertised capabilities. */
+static int parse_advertise(const char *capabilities)
+{
+       const char *mtypes[] = {
+               "100baseT4", "100baseTx", "100baseTx-FD", "100baseTx-HD",
+               "10baseT", "10baseT-FD", "10baseT-HD", 0,
+       };
+       char *endptr;
+       int cap_map[] = { 0x0200, 0x0180, 0x0100, 0x0080, 0x0060, 0x0040, 0x0020,};
+       int i;
+       if ( ! capabilities) {
+               fprintf(stderr, "You passed -A 'NULL'.  You must provide a media"
+                               " list to advertise!\n");
+               return -1;
+       }
+       if (debug)
+               fprintf(stderr, "Advertise string is '%s'.\n", capabilities);
+       for (i = 0; mtypes[i]; i++)
+               if (strcasecmp(mtypes[i], capabilities) == 0)
+                       return cap_map[i];
+       if ((i = strtol(capabilities, &endptr, 16)) <= 0xffff  &&  endptr[0] == 0)
+               return i;
+       fprintf(stderr, "Invalid media advertisement value '%s'.\n"
+                       "  Either pass a numeric value or one of the following names:\n",
+                       capabilities);
+       for (i = 0; mtypes[i]; i++)
+               fprintf(stderr, "   %-14s %3.3x\n", mtypes[i], cap_map[i]);
+       return -1;
+}
+
+/* Trivial versions if we don't link against libmii.c */
+static const char *media_names[] = {
+       "10baseT", "10baseT-FD", "100baseTx", "100baseTx-FD", "100baseT4",
+       "Flow-control", 0,
+};
+/* Various non-good bits in the command register. */
+static const char *bmcr_bits[] = {
+       "  Internal Collision-Test enabled!\n", "",             /* 0x0080,0x0100 */
+       "  Restarted auto-negotiation in progress!\n",
+       "  Transceiver isolated from the MII!\n",
+       "  Transceiver powered down!\n", "", "",
+       "  Transceiver in loopback mode!\n",
+       "  Transceiver currently being reset!\n",
+};
+
+int show_basic_mii(long ioaddr, int phy_id)
+{
+       int mii_reg, i;
+       u16 mii_val[32];
+       u16 bmcr, bmsr, new_bmsr, nway_advert, lkpar;
+
+       for (mii_reg = 0; mii_reg < 8; mii_reg++)
+               mii_val[mii_reg] = mdio_read(ioaddr, phy_id, mii_reg);
+       if ( ! verbose) {
+               printf("Basic registers of MII PHY #%d: ", phy_id);
+               for (mii_reg = 0; mii_reg < 8; mii_reg++)
+                       printf(" %4.4x", mii_val[mii_reg]);
+               printf(".\n");
+       }
+
+       if (mii_val[0] == 0xffff  ||  mii_val[1] == 0x0000) {
+               printf("  No MII transceiver present!.\n");
+               if (! opt_f) {
+                       printf("  Use '--force' to view the information anyway.\n");
+                       return -1;
+               }
+       }
+       /* Descriptive rename. */
+       bmcr = mii_val[0];
+       bmsr = mii_val[1];
+       nway_advert = mii_val[4];
+       lkpar = mii_val[5];
+
+       if (lkpar & 0x4000) {
+               int negotiated = nway_advert & lkpar & 0x3e0;
+               int max_capability = 0;
+               /* Scan for the highest negotiated capability, highest priority
+                  (100baseTx-FDX) to lowest (10baseT-HDX). */
+               int media_priority[] = {8, 9, 7, 6, 5};         /* media_names[i-5] */
+               printf(" The autonegotiated capability is %4.4x.\n", negotiated);
+               for (i = 0; media_priority[i]; i++)
+                       if (negotiated & (1 << media_priority[i])) {
+                               max_capability = media_priority[i];
+                               break;
+                       }
+               if (max_capability)
+                       printf("The autonegotiated media type is %s.\n",
+                                  media_names[max_capability - 5]);
+               else
+                       printf("No common media type was autonegotiated!\n"
+                                  "This is extremely unusual and typically indicates a "
+                                  "configuration error.\n" "Perhaps the advertised "
+                                  "capability set was intentionally limited.\n");
+       }
+       printf(" Basic mode control register 0x%4.4x:", bmcr);
+       if (bmcr & 0x1000)
+               printf(" Auto-negotiation enabled.\n");
+       else
+               printf(" Auto-negotiation disabled, with\n"
+                          " Speed fixed at 10%s mbps, %s-duplex.\n",
+                          bmcr & 0x2000 ? "0" : "",
+                          bmcr & 0x0100 ? "full":"half");
+       for (i = 0; i < 9; i++)
+               if (bmcr & (0x0080<<i))
+                       printf(bmcr_bits[i]);
+
+       new_bmsr = mdio_read(ioaddr, phy_id, 1);
+       if ((bmsr & 0x0016) == 0x0004)
+               printf( " You have link beat, and everything is working OK.\n");
+       else
+               printf(" Basic mode status register 0x%4.4x ... %4.4x.\n"
+                          "   Link status: %sestablished.\n",
+                          bmsr, new_bmsr,
+                          bmsr & 0x0004 ? "" :
+                          (new_bmsr & 0x0004) ? "previously broken, but now re" : "not ");
+       if (verbose) {
+               printf("   This transceiver is capable of ");
+               if (bmsr & 0xF800) {
+                       for (i = 15; i >= 11; i--)
+                               if (bmsr & (1<<i))
+                                       printf(" %s", media_names[i-11]);
+               } else
+                       printf("<Warning! No media capabilities>");
+               printf(".\n");
+               printf("   %s to perform Auto-negotiation, negotiation %scomplete.\n",
+                          bmsr & 0x0008 ? "Able" : "Unable",
+                          bmsr & 0x0020 ? "" : "not ");
+       }
+
+       if (bmsr & 0x0010)
+               printf(" Remote fault detected!\n");
+       if (bmsr & 0x0002)
+               printf("   *** Link Jabber! ***\n");
+
+       if (lkpar & 0x4000) {
+               printf(" Your link partner advertised %4.4x:",
+                          lkpar);
+               for (i = 5; i >= 0; i--)
+                       if (lkpar & (0x20<<i))
+                               printf(" %s", media_names[i]);
+               printf("%s.\n", lkpar & 0x0400 ? ", w/ 802.3X flow control" : "");
+       } else if (lkpar & 0x00A0)
+               printf(" Your link partner is generating %s link beat  (no"
+                          " autonegotiation).\n",
+                          lkpar & 0x0080 ? "100baseTx" : "10baseT");
+       else if ( ! (bmcr & 0x1000))
+               printf(" Link partner information is not exchanged when in"
+                          " fixed speed mode.\n");
+       else if ( ! (new_bmsr & 0x004))
+                                                       ;       /* If no partner, do not report status. */
+       else if (lkpar == 0x0001  ||  lkpar == 0x0000) {
+               printf(" Your link partner does not do autonegotiation, and this "
+                          "transceiver type\n  does not report the sensed link "
+                          "speed.\n");
+       } else
+               printf(" Your link partner is strange, status %4.4x.\n", lkpar);
+
+       printf("   End of basic transceiver information.\n\n");
+       return 0;
+}
+
+static void monitor_status(long ioaddr, int phy_id)
+{
+       unsigned int baseline_1 = 0x55555555;   /* Always show initial status. */
+
+       while (1) {
+               unsigned int new_1 = mdio_read(ioaddr, phy_id, 1);
+               if (new_1 != baseline_1) {
+                       printf("%-12s 0x%4.4x 0x%4.4x\n",
+                                  new_1 & 0x04 ? (new_1==0xffff ? "unknown" : "up") :
+                                  new_1 & 0x20 ? "negotiating" : "down",
+                                  new_1, mdio_read(ioaddr, phy_id, 5));
+                       fflush(stdout);
+                       baseline_1 = new_1;
+               }
+               sleep(1);
+       }
+}
+
+int  show_mii_details(long ioaddr, int phy_id)
+{
+       int mii_reg, mii_val;
+       printf(" MII PHY #%d transceiver registers:", phy_id);
+       for (mii_reg = 0; mii_reg < 32; mii_reg++) {
+               mii_val = mdio_read(skfd, phy_id, mii_reg);
+               printf("%s %4.4x", (mii_reg % 8) == 0 ? "\n  " : "",
+                          mii_val);
+       }
+       printf("\nThis version of 'mii-diag' has not been linked with "
+                       "the libmii.c library.\n"
+                       "  That library provides extended transceiver status reports.\n");
+       return 0;
+}
+
+void monitor_mii(long ioaddr, int phy_id)
+{
+       fprintf(stderr, "\nThis version of 'mii-diag' has not been linked with "
+                       "the libmii.c library \n"
+                       "  required for the media monitor option.\n");
+}
+
+
+\f
+/*
+ * Local variables:
+ *  version-control: t
+ *  kept-new-versions: 5
+ *  c-indent-level: 4
+ *  c-basic-offset: 4
+ *  tab-width: 4
+ *  compile-command: "gcc -Wall -Wstrict-prototypes -O mii-diag.c -DLIBMII libmii.c -o mii-diag"
+ *  simple-compile-command: "gcc mii-diag.c -o mii-diag"
+ * End:
+ */
diff --git a/packages/net-tools/files/net-tools-1.57-bug22040.patch b/packages/net-tools/files/net-tools-1.57-bug22040.patch
new file mode 100644 (file)
index 0000000..76f04d5
--- /dev/null
@@ -0,0 +1,50 @@
+--- net-tools-1.57/arp.c.orig  Sun May 14 17:57:41 2000
++++ net-tools-1.57/arp.c       Sat Nov 25 15:05:27 2000
+@@ -618,6 +618,7 @@
+     fprintf(stderr, _("  arp [-v]   [<HW>] [-i <if>] -Ds <hostname> <if> [netmask <nm>] pub      <-''-\n\n"));
+     
+     fprintf(stderr, _("        -a                       display (all) hosts in alternative (BSD) style\n"));
++    fprintf(stderr, _("        -e                       display (all) hosts in default (Linux) style\n"));
+     fprintf(stderr, _("        -s, --set                set a new ARP entry\n"));
+     fprintf(stderr, _("        -d, --delete             delete a specified entry\n"));
+     fprintf(stderr, _("        -v, --verbose            be verbose\n"));
+--- net-tools-1.57/man/en_US/arp.8.orig        Sat Nov 25 15:13:26 2000
++++ net-tools-1.57/man/en_US/arp.8     Sat Nov 25 15:15:12 2000
+@@ -3,7 +3,7 @@
+ arp \- manipulate the system ARP cache
+ .SH SYNOPSIS
+ .B arp 
+-.RB [ \-vn ] 
++.RB [ \-evn ] 
+ .RB [ "\-H type" ] 
+ .RB [ "-i if" ] 
+ .B -a 
+@@ -60,7 +60,7 @@
+ shows numerical addresses instead of trying to determine symbolic host, port
+ or user names.
+ .TP
+-.B "\-H type, \-\-hw-type type"
++.B "\-H type, \-\-hw-type type, \-t type"
+ When setting or reading the ARP cache, this optional parameter tells
+ .B arp
+ which class of entries it should check for.  The default value of
+@@ -81,7 +81,8 @@
+ .B hostname
+ parameter is not used,
+ .B all
+-entries will be displayed.
++entries will be displayed.  
++The entries will be displayed in alternate (BSD) style.
+ .TP
+ .B "\-d hostname, \-\-delete hostname"
+ Remove any entry for the specified host.  This can be used if the
+@@ -91,6 +92,9 @@
+ Use the interface
+ .BR ifa "'s"
+ hardware address.
++.TP
++.B "\-e"
++Shows the entries in default (Linux) style.
+ .TP
+ .B "\-i If, \-\-device If"
+ Select an interface. When dumping the ARP cache only entries matching
diff --git a/packages/net-tools/files/net-tools-1.60-arp_overflow.patch b/packages/net-tools/files/net-tools-1.60-arp_overflow.patch
new file mode 100644 (file)
index 0000000..4679a51
--- /dev/null
@@ -0,0 +1,11 @@
+--- net-tools-1.60/arp.c.old   2005-08-03 08:23:46.000000000 +0200
++++ net-tools-1.60/arp.c       2005-08-03 11:02:10.000000000 +0200
+@@ -235,7 +235,7 @@
+     struct ifreq ifr;
+     struct hwtype *xhw;
+-    strcpy(ifr.ifr_name, ifname);
++    strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+     if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) < 0) {
+       fprintf(stderr, _("arp: cant get HW-Address for `%s': %s.\n"), ifname, strerror(errno));
+       return (-1);
diff --git a/packages/net-tools/files/net-tools-1.60-bcast.patch b/packages/net-tools/files/net-tools-1.60-bcast.patch
new file mode 100644 (file)
index 0000000..9489e26
--- /dev/null
@@ -0,0 +1,99 @@
+--- net-tools-1.60/ifconfig.c.broadcast        2004-11-03 12:05:30.000000000 +0100
++++ net-tools-1.60/ifconfig.c  2004-11-04 15:39:32.817077232 +0100
+@@ -36,6 +36,7 @@
+ #include <sys/ioctl.h>
+ #include <netinet/in.h>
+ #include <net/if.h>
++#include <netinet/ip.h>
+ #include <net/if_arp.h>
+ #include <stdio.h>
+ #include <errno.h>
+@@ -138,6 +139,7 @@
+       perror("SIOCSIFFLAGS");
+       return -1;
+     }
++    
+     return (0);
+ }
+@@ -212,17 +214,41 @@
+     exit(0);
+ }
+-static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa)
++static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa, int new_bcast)
+ {
+     int err = 0;
+-
+-    memcpy((char *) &ifr->ifr_netmask, (char *) sa,
+-         sizeof(struct sockaddr));
++      struct sockaddr_in * ip_addr, * netmask, *bcast;
++    struct ifreq ifraddr;
++      struct ifreq ifrbcast;
++              
++      memcpy((char *) &ifr->ifr_netmask, (char *) sa,
++         sizeof(struct sockaddr)); 
+     if (ioctl(skfd, SIOCSIFNETMASK, ifr) < 0) {
+       fprintf(stderr, "SIOCSIFNETMASK: %s\n",
+               strerror(errno));
+       err = 1;
+     }
++      
++      if (new_bcast) {
++              memcpy(&ifraddr,ifr,sizeof(struct ifreq));
++              memcpy(&ifrbcast,ifr,sizeof(struct ifreq));
++      
++              if (ioctl(skfd, SIOCGIFADDR, &ifraddr) < 0) {
++                      fprintf(stderr, "SIOCGIFADDR: %s\n", strerror(errno));
++                      err = 1;
++      }
++      
++              ip_addr = (struct sockaddr_in *)&ifraddr.ifr_addr;
++              netmask = (struct sockaddr_in *)&ifr->ifr_netmask;
++              bcast = (struct sockaddr_in *)&ifrbcast.ifr_broadaddr;
++              /* calculate new broadcast adress */
++              bcast->sin_addr.s_addr = ip_addr->sin_addr.s_addr | ~netmask->sin_addr.s_addr;
++              /* set new broadcast adress   */
++      if (ioctl(skfd, SIOCSIFBRDADDR, &ifrbcast) < 0) {
++                      fprintf(stderr, "SIOCSIFBROADCAST: %s\n", strerror(errno));
++                      err = 1;
++      }
++    }
+     return 0;
+ }
+@@ -234,7 +260,7 @@
+     struct aftype *ap;
+     struct hwtype *hw;
+     struct ifreq ifr;
+-    int goterr = 0, didnetmask = 0, donetmask = 0;
++    int goterr = 0, didnetmask = 0, donetmask = 0, dobcast = 1;
+     char **spp;
+     int fd;
+ #if HAVE_AFINET6
+@@ -506,6 +532,7 @@
+                           strerror(errno));
+                   goterr = 1;
+               }
++              dobcast = 0;
+               spp++;
+           }
+           goterr |= set_flag(ifr.ifr_name, IFF_BROADCAST);
+@@ -542,7 +569,7 @@
+               continue;
+           }
+           didnetmask++;
+-          goterr = set_netmask(ap->fd, &ifr, &sa);
++          goterr = set_netmask(ap->fd, &ifr, &sa, dobcast);
+           spp++;
+           continue;
+       }
+@@ -964,7 +991,7 @@
+       /* set CIDR netmask */
+       if (donetmask) {
+               donetmask = 0;
+-              goterr = set_netmask(skfd, &ifr, &sa_netmask);
++              goterr = set_netmask(skfd, &ifr, &sa_netmask, dobcast);
+               didnetmask++;
+       }
diff --git a/packages/net-tools/files/net-tools-1.60-bitkeeper.patch b/packages/net-tools/files/net-tools-1.60-bitkeeper.patch
new file mode 100644 (file)
index 0000000..6871304
--- /dev/null
@@ -0,0 +1,17 @@
+--- net-tools-1.60/netplug-1.2.9/Makefile.kill_bitkeeper       2005-01-10 11:36:32.000000000 +0100
++++ net-tools-1.60/netplug-1.2.9/Makefile      2005-01-10 11:38:01.796744224 +0100
+@@ -24,10 +24,12 @@
+       install $(install_opts) -m 755 scripts/rc.netplugd $(initdir)/netplugd
+       install -C $(install_opts) -m 444 man/man8/netplugd.8 $(mandir)/man8
+-bk_root := $(shell bk root)
++#bk_root := $(shell bk root)
++bk_root := $(shell)
+ tar_root := netplug-$(version)
+ tar_file := $(bk_root)/$(tar_root).tar.bz2
+-files := $(shell bk sfiles -Ug)
++#files := $(shell bk sfiles -Ug)
++file := $(shell)
+ tarball: $(tar_file)
diff --git a/packages/net-tools/files/net-tools-1.60-config.h b/packages/net-tools/files/net-tools-1.60-config.h
new file mode 100644 (file)
index 0000000..b01fd72
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+* config.h     Automatically generated configuration includefile
+*
+* NET-TOOLS    A collection of programs that form the base set of the
+*              NET-3 Networking Distribution for the LINUX operating
+*              system.
+*
+*              DO  NOT  EDIT  DIRECTLY
+*
+*/
+
+/* 
+ * 
+ * Internationalization
+ * 
+ * The net-tools package has currently been translated to French,
+ * German and Brazilian Portugese.  Other translations are, of
+ * course, welcome.  Answer `n' here if you have no support for
+ * internationalization on your system.
+ * 
+ */
+#define I18N 0
+
+/* 
+ * 
+ * Protocol Families.
+ * 
+ */
+#define HAVE_AFUNIX 1
+#define HAVE_AFINET 1
+#define HAVE_AFINET6 1
+#define HAVE_AFIPX 0
+#define HAVE_AFATALK 0
+#define HAVE_AFAX25 0
+#define HAVE_AFNETROM 1
+#define HAVE_AFROSE 0
+#define HAVE_AFX25 0
+#define HAVE_AFECONET 0
+#define HAVE_AFDECnet 0
+#define HAVE_AFASH 0
+
+/* 
+ * 
+ * Device Hardware types.
+ * 
+ */
+#define HAVE_HWETHER 1
+#define HAVE_HWARC 1
+#define HAVE_HWSLIP 1
+#define HAVE_HWPPP 1
+#define HAVE_HWTUNNEL 1
+#define HAVE_HWSTRIP 1
+#define HAVE_HWTR 1
+#define HAVE_HWAX25 0
+#define HAVE_HWROSE 0
+#define HAVE_HWNETROM 1
+#define HAVE_HWX25 0
+#define HAVE_HWFR 1
+#define HAVE_HWSIT 0
+#define HAVE_HWFDDI 0
+#define HAVE_HWHIPPI 0
+#define HAVE_HWASH 0
+#define HAVE_HWHDLCLAPB 0
+#define HAVE_HWIRDA 1
+#define HAVE_HWEC 0
+#define HAVE_HWIB 0
+
+/* 
+ * 
+ * Other Features.
+ * 
+ */
+#define HAVE_FW_MASQUERADE 1
+#define HAVE_IP_TOOLS 1
+#define HAVE_MII 1
diff --git a/packages/net-tools/files/net-tools-1.60-config.make b/packages/net-tools/files/net-tools-1.60-config.make
new file mode 100644 (file)
index 0000000..1108200
--- /dev/null
@@ -0,0 +1,36 @@
+# I18N=0
+HAVE_AFUNIX=1
+HAVE_AFINET=1
+HAVE_AFINET6=1
+# HAVE_AFIPX=0
+# HAVE_AFATALK=0
+# HAVE_AFAX25=0
+HAVE_AFNETROM=1
+# HAVE_AFROSE=0
+# HAVE_AFX25=0
+# HAVE_AFECONET=0
+# HAVE_AFDECnet=0
+# HAVE_AFASH=0
+HAVE_HWETHER=1
+HAVE_HWARC=1
+HAVE_HWSLIP=1
+HAVE_HWPPP=1
+HAVE_HWTUNNEL=1
+HAVE_HWSTRIP=1
+HAVE_HWTR=1
+# HAVE_HWAX25=0
+# HAVE_HWROSE=0
+HAVE_HWNETROM=1
+# HAVE_HWX25=0
+HAVE_HWFR=1
+# HAVE_HWSIT=0
+# HAVE_HWFDDI=0
+# HAVE_HWHIPPI=0
+# HAVE_HWASH=0
+# HAVE_HWHDLCLAPB=0
+HAVE_HWIRDA=1
+# HAVE_HWEC=0
+# HAVE_HWIB=0
+HAVE_FW_MASQUERADE=1
+HAVE_IP_TOOLS=1
+HAVE_MII=1
diff --git a/packages/net-tools/files/net-tools-1.60-cycle.patch b/packages/net-tools/files/net-tools-1.60-cycle.patch
new file mode 100644 (file)
index 0000000..ce659ec
--- /dev/null
@@ -0,0 +1,311 @@
+--- net-tools-1.60/lib/interface.c.cycle       2003-02-11 14:29:29.000000000 +0100
++++ net-tools-1.60/lib/interface.c     2003-02-11 14:29:29.000000000 +0100
+@@ -90,6 +90,7 @@
+ static struct interface *int_list, *int_last;
+ static int if_readlist_proc(char *);
++static int if_readlist_rep(char *, struct interface *);
+ static struct interface *add_interface(char *name)
+ {
+@@ -128,11 +129,13 @@
+ int for_all_interfaces(int (*doit) (struct interface *, void *), void *cookie)
+ {
+     struct interface *ife;
++    int err;
+     if (!int_list && (if_readlist() < 0))
+       return -1;
+     for (ife = int_list; ife; ife = ife->next) {
+-      int err = doit(ife, cookie);
++        if_readlist_rep(ife->name, ife);
++      err = doit(ife, cookie);
+       if (err)
+           return err;
+     }
+@@ -369,6 +372,42 @@
+     return err;
+ }
++
++static int if_readlist_rep(char *target, struct interface *ife)
++{
++    FILE *fh;
++    char buf[512];
++    int err;
++
++    fh = fopen(_PATH_PROCNET_DEV, "r");
++    if (!fh) {
++              fprintf(stderr, _("Warning: cannot open %s (%s). Limited output.\n"),
++                      _PATH_PROCNET_DEV, strerror(errno)); 
++              return if_readconf();
++      }       
++    fgets(buf, sizeof buf, fh);       /* eat line */
++    fgets(buf, sizeof buf, fh);
++
++    procnetdev_vsn = procnetdev_version(buf);
++
++    err = 0;
++    while (fgets(buf, sizeof buf, fh)) {
++      char *s, name[IFNAMSIZ];
++      s = get_name(name, buf);    
++      get_dev_fields(s, ife);
++      ife->statistics_valid = 1;
++      if (target && !strcmp(target,name))
++              break;
++    }
++    if (ferror(fh)) {
++      perror(_PATH_PROCNET_DEV);
++      err = -1;
++    }
++
++    fclose(fh);
++    return err;
++}
++
+ int if_readlist(void) 
+ { 
+     int err = if_readlist_proc(NULL); 
+--- net-tools-1.60/man/en_US/netstat.8.cycle   2001-01-07 13:43:57.000000000 +0100
++++ net-tools-1.60/man/en_US/netstat.8 2003-02-11 14:29:29.000000000 +0100
+@@ -30,6 +30,7 @@
+ .RB [ \-\-program | \-p ]
+ .RB [ \-\-verbose | \-v ]
+ .RB [ \-\-continuous | \-c]
++.RB [delay]
+ .P
+ .B netstat 
+ .RB { \-\-route | \-r }
+@@ -39,6 +40,7 @@
+ .RB [ \-\-numeric | \-n ]
+ .RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ]
+ .RB [ \-\-continuous | \-c]
++.RB [delay]
+ .P
+ .B netstat
+ .RB { \-\-interfaces | \-i }
+@@ -50,12 +52,14 @@
+ .RB [ \-\-numeric | \-n ]
+ .RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ]
+ .RB [ \-\-continuous | \-c]
++.RB [delay]
+ .P
+ .B netstat
+ .RB { \-\-groups | \-g }
+ .RB [ \-\-numeric | \-n ]
+ .RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ]
+ .RB [ \-\-continuous | \-c]
++.RB [delay]
+ .P
+ .B netstat
+ .RB { \-\-masquerade | \-M }
+@@ -63,12 +67,14 @@
+ .RB [ \-\-numeric | \-n ]
+ .RB [ \-\-numeric-hosts ] [ \-\-numeric-ports ] [ \-\-numeric-ports ]
+ .RB [ \-\-continuous | \-c]
++.RB [delay]
+ .P
+ .B netstat
+ .RB { \-\-statistics | -s }
+ .RB [ \-\-tcp | \-t ]
+ .RB [ \-\-udp | \-u ]
+ .RB [ \-\-raw | \-w ]
++.RB [delay]
+ .P
+ .B netstat 
+ .RB { \-\-version | \-V }
+@@ -170,6 +176,10 @@
+ Print routing information from the FIB.  (This is the default.)
+ .SS "\-C"
+ Print routing information from the route cache.
++.SS delay
++Netstat will cycle printing through statistics every 
++.B delay 
++seconds.
+ .IR UP .
+ .P
+ .SH OUTPUT
+--- net-tools-1.60/netstat.c.cycle     2003-02-11 14:29:29.000000000 +0100
++++ net-tools-1.60/netstat.c   2003-02-11 15:07:26.000000000 +0100
+@@ -102,7 +102,7 @@
+ #endif
+ /* prototypes for statistics.c */
+-void parsesnmp(int, int, int);
++int parsesnmp(int, int, int);
+ void inittab(void);
+ typedef enum {
+@@ -1440,6 +1440,8 @@
+ static int iface_info(void)
+ {
++    static int count=0;
++
+     if (skfd < 0) {
+       if ((skfd = sockets_open(0)) < 0) {
+           perror("socket");
+@@ -1449,20 +1451,21 @@
+     }
+     if (flag_exp < 2) {
+       ife_short = 1;
+-      printf(_("Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg\n"));
++      if(!(count % 8))
++          printf(_("Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg\n"));
+     }
+     if (for_all_interfaces(do_if_print, &flag_all) < 0) {
+       perror(_("missing interface information"));
+       exit(1);
+     }
+-    if (flag_cnt)
++    if (!flag_cnt) {
+       free_interface_list();
+-    else {
+       close(skfd);
+       skfd = -1;
+     }
++    count++;
+     return 0;
+ }
+@@ -1478,7 +1481,7 @@
+ {
+     fprintf(stderr, _("usage: netstat [-veenNcCF] [<Af>] -r         netstat {-V|--version|-h|--help}\n"));
+     fprintf(stderr, _("       netstat [-vnNcaeol] [<Socket> ...]\n"));
+-    fprintf(stderr, _("       netstat { [-veenNac] -i | [-cnNe] -M | -s }\n\n"));
++    fprintf(stderr, _("       netstat { [-veenNac] -i | [-cnNe] -M | -s } [delay]\n\n"));
+     fprintf(stderr, _("        -r, --route              display routing table\n"));
+     fprintf(stderr, _("        -i, --interfaces         display interface table\n"));
+@@ -1514,6 +1517,7 @@
+  (int argc, char *argv[]) {
+     int i;
+     int lop;
++    int reptimer = 1;
+     struct option longopts[] =
+     {
+       AFTRANS_OPTS,
+@@ -1655,6 +1659,12 @@
+           flag_sta++;
+       }
++    if(argc == optind + 1) {
++      if((reptimer = atoi(argv[optind])) <= 0)
++      usage();
++      flag_cnt++;
++    }
++    
+     if (flag_int + flag_rou + flag_mas + flag_sta > 1)
+       usage();
+@@ -1666,7 +1676,7 @@
+     flag_arg = flag_tcp + flag_udp + flag_raw + flag_unx + flag_ipx
+       + flag_ax25 + flag_netrom + flag_igmp + flag_x25;
+-
++    
+     if (flag_mas) {
+ #if HAVE_FW_MASQUERADE && HAVE_AFINET
+ #if MORE_THAN_ONE_MASQ_AF
+@@ -1678,7 +1688,7 @@
+                            flag_not & FLAG_NUM_PORT, flag_exp);
+           if (i || !flag_cnt)
+               break;
+-          sleep(1);
++          sleep(reptimer);
+       }
+ #else
+       ENOSUPP("netstat.c", "FW_MASQUERADE");
+@@ -1688,9 +1698,15 @@
+     }
+     if (flag_sta) {
++      for(;;) {
+         inittab();
+-      parsesnmp(flag_raw, flag_tcp, flag_udp);
+-      exit(0);
++      i = parsesnmp(flag_raw, flag_tcp, flag_udp);
++      
++      if(i || !flag_cnt)
++        break;
++      sleep(reptimer);
++      }
++      return(i);
+     }
+     
+     if (flag_rou) {
+@@ -1712,7 +1728,7 @@
+           i = route_info(afname, options);
+           if (i || !flag_cnt)
+               break;
+-          sleep(1);
++          sleep(reptimer);
+       }
+       return (i);
+     }
+@@ -1721,7 +1737,7 @@
+           i = iface_info();
+           if (!flag_cnt || i)
+               break;
+-          sleep(1);
++          sleep(reptimer);
+       }
+       return (i);
+     }
+@@ -1847,7 +1863,7 @@
+       }
+       if (!flag_cnt || i)
+           break;
+-      sleep(1);
++      sleep(reptimer);
+       prg_cache_clear();
+     }
+     return (i);
+--- net-tools-1.60/statistics.c.cycle  2001-02-02 19:01:23.000000000 +0100
++++ net-tools-1.60/statistics.c        2003-02-11 14:29:29.000000000 +0100
+@@ -338,7 +338,7 @@
+ }
+-void parsesnmp(int flag_raw, int flag_tcp, int flag_udp)
++int parsesnmp(int flag_raw, int flag_tcp, int flag_udp)
+ {
+     FILE *f;
+@@ -347,12 +347,14 @@
+     f = fopen("/proc/net/snmp", "r");
+     if (!f) {
+       perror(_("cannot open /proc/net/snmp"));
+-      return;
++      return(1);
+     }
+     process_fd(f);
+-    if (ferror(f))
++    if (ferror(f)) {
+       perror("/proc/net/snmp");
++      return(1);
++    }
+     fclose(f);
+@@ -361,12 +363,14 @@
+     if (f) {
+       process_fd(f);
+-        if (ferror(f))
+-          perror("/proc/net/netstat");
++        if (ferror(f)) {
++        perror("/proc/net/netstat");
++        return(1);
++      }
+     
+         fclose(f);
+     }
+-    return;
++    return(0);
+ }
+     
diff --git a/packages/net-tools/files/net-tools-1.60-de.patch b/packages/net-tools/files/net-tools-1.60-de.patch
new file mode 100644 (file)
index 0000000..f015f13
--- /dev/null
@@ -0,0 +1,11 @@
+--- net-tools-1.60/po/de.po.old        2005-02-16 16:46:02.000000000 +0100
++++ net-tools-1.60/po/de.po    2005-02-16 16:54:07.886323928 +0100
+@@ -64,7 +64,7 @@
+ #: ../arp.c:467
+ msgid "(incomplete)"
+-msgstr "(unvollsändig)"
++msgstr "(unvollständig)"
+ #: ../arp.c:484
+ #, c-format
diff --git a/packages/net-tools/files/net-tools-1.60-duplicate-tcp.patch b/packages/net-tools/files/net-tools-1.60-duplicate-tcp.patch
new file mode 100644 (file)
index 0000000..316ac65
--- /dev/null
@@ -0,0 +1,194 @@
+--- net-tools-1.60/netstat.c.foo       Mon Apr 22 14:25:20 2002
++++ net-tools-1.60/netstat.c   Mon Apr 22 14:25:22 2002
+@@ -435,6 +435,162 @@
+                        " will not be shown, you would have to be root to see it all.)\n"));
+ }
++#define TCP_HASH_SIZE 1009
++
++static struct tcp_node {
++  struct tcp_node *next;
++  char            *socket_pair;
++} *tcp_node_hash[TCP_HASH_SIZE];
++
++static unsigned int tcp_node_compute_string_hash(const char *p)
++{
++  unsigned int h = *p;
++
++  if (h)
++    for (p += 1; *p != '\0'; p++)
++      h = (h << 5) - h + *p;
++
++  return h;
++}
++
++#define TCP_NODE_HASH_STRING(x) \
++  (tcp_node_compute_string_hash(x) % TCP_HASH_SIZE)
++
++static void tcp_node_hash_clear(void)
++{
++  int i;
++  struct tcp_node *next_node;
++  struct tcp_node *tmp_node;
++  for (i=0; i < TCP_HASH_SIZE; i++) {
++    if (tcp_node_hash[i]) {
++      /* free the children of this hash bucket */
++      next_node = tcp_node_hash[i]->next;
++      while (next_node) {
++      tmp_node = next_node;
++      next_node = next_node->next;
++      free(tmp_node->socket_pair);
++      free(tmp_node);
++      }
++
++      /* free the bucket itself */
++      free(tcp_node_hash[i]);
++      tcp_node_hash[i] = NULL;
++    }
++  }
++}
++
++/* This function takes a socket pair string.  If it already exists in
++   the hash it returns -1, otherwise it returns 0. */
++
++static int tcp_node_hash_check_and_append(const char *local_addr,
++                                        int local_port,
++                                        const char *rem_addr,
++                                        int rem_port)
++{
++  unsigned int hash_val;
++  struct tcp_node *tmp_node;
++  int   tmp_string_len;
++  char *tmp_string;;
++
++  /* Size of the string is the size of the two lengths of the address
++     strings plus enough sizes for the colons and the ports. */
++  tmp_string_len = strlen(local_addr) + strlen(rem_addr) + 32;
++  tmp_string = malloc(tmp_string_len);
++  if (!tmp_string)
++    return 0;
++
++  if (snprintf(tmp_string, tmp_string_len - 1, "%s:%d:%s:%d",
++             local_addr, local_port, rem_addr, rem_port) < 0) {
++    free(tmp_string);
++    return 0;
++  }
++
++  hash_val = TCP_NODE_HASH_STRING(tmp_string);
++
++  /* See if we have to allocate this node */
++  if (!tcp_node_hash[hash_val]) {
++    tcp_node_hash[hash_val] = malloc(sizeof(struct tcp_node));
++    if (!tcp_node_hash[hash_val]) {
++      free(tmp_string);
++      return 0;
++    }
++
++    memset(tcp_node_hash[hash_val], 0, sizeof(struct tcp_node));
++
++    /* Stuff this new value into the hash bucket and return early */
++    tcp_node_hash[hash_val]->socket_pair = tmp_string;
++    return 0;
++  }
++
++  /* Try to find the value in the hash bucket. */
++  tmp_node = tcp_node_hash[hash_val];
++  while (tmp_node) {
++    if (!strcmp(tmp_node->socket_pair, tmp_string)) {
++      free(tmp_string);
++      return -1;
++    }
++    tmp_node = tmp_node->next;
++  }
++
++  /* If we got this far it means that it isn't in the hash bucket.
++     Add it to the front since it's faster that way. */
++  tmp_node = tcp_node_hash[hash_val];
++
++  tcp_node_hash[hash_val] = malloc(sizeof(struct tcp_node));
++  if (!tcp_node_hash[hash_val]) {
++    free(tmp_string);
++    tcp_node_hash[hash_val] = tmp_node;
++    return 0;
++  }
++
++  tcp_node_hash[hash_val]->socket_pair = tmp_string;
++  tcp_node_hash[hash_val]->next = tmp_node;
++
++  return 0;
++}
++
++#if 0
++static void tcp_node_hash_report_bucket_size(void)
++{
++  int max = 0;
++  int min = 0;
++  int num = 0;
++  int total = 0;
++  struct tcp_node *tmp_node;
++  int tmp, i;
++  float avg;
++
++  for (i=0; i < TCP_HASH_SIZE; i++) {
++    tmp_node = tcp_node_hash[i];
++    if (!tmp_node)
++      continue;
++
++    tmp = 0;
++
++    num++;
++    tmp = 1;
++
++    while (tmp_node) {
++      tmp++;
++      tmp_node = tmp_node->next;
++    }
++    
++    total += tmp;
++    if (tmp > max)
++      max = tmp;
++    
++    if (min == 0 || tmp < min)
++      min = tmp;
++  }
++
++  avg = (float)total/(float)num;
++
++  printf("%d nodes in %d buckets min/max/avg %d/%d/%.2f\n",
++       total, num, min, max, avg);
++
++}
++#endif
++
+ #if HAVE_AFNETROM
+ static const char *netrom_state[] =
+ {
+@@ -752,11 +908,20 @@
+       fprintf(stderr, _("warning, got bogus tcp line.\n"));
+       return;
+     }
++
+     if ((ap = get_afntype(((struct sockaddr *) &localaddr)->sa_family)) == NULL) {
+       fprintf(stderr, _("netstat: unsupported address family %d !\n"),
+               ((struct sockaddr *) &localaddr)->sa_family);
+       return;
+     }
++
++    /* make sure that we haven't seen this socket pair before */
++    if (tcp_node_hash_check_and_append(local_addr, local_port,
++                                     rem_addr, rem_port) < 0) {
++  /*  fprintf(stderr, _("warning, got duplicate tcp line.\n")); */
++      return;
++    }
++
+     if (state == TCP_LISTEN) {
+       time_len = 0;
+       retr = 0L;
+@@ -1849,6 +2014,7 @@
+           break;
+       sleep(1);
+       prg_cache_clear();
++      tcp_node_hash_clear();
+     }
+     return (i);
+ }
diff --git a/packages/net-tools/files/net-tools-1.60-gcc33.patch b/packages/net-tools/files/net-tools-1.60-gcc33.patch
new file mode 100644 (file)
index 0000000..a6ae422
--- /dev/null
@@ -0,0 +1,31 @@
+--- net-tools-1.60/mii-tool.c.gcc33    2003-05-22 23:34:06.000000000 -0400
++++ net-tools-1.60/mii-tool.c  2003-05-22 23:34:57.000000000 -0400
+@@ -378,17 +378,17 @@
+ /*--------------------------------------------------------------------*/
+-const char *usage =
+-"usage: %s [-VvRrwl] [-A media,... | -F media] [interface ...]
+-       -V, --version               display version information
+-       -v, --verbose               more verbose output
+-       -R, --reset                 reset MII to poweron state
+-       -r, --restart               restart autonegotiation
+-       -w, --watch                 monitor for link status changes
+-       -l, --log                   with -w, write events to syslog
+-       -A, --advertise=media,...   advertise only specified media
+-       -F, --force=media           force specified media technology
+-media: 100baseT4, 100baseTx-FD, 100baseTx-HD, 10baseT-FD, 10baseT-HD,
++const char *usage = "\
++usage: %s [-VvRrwl] [-A media,... | -F media] [interface ...]\n\
++       -V, --version               display version information\n\
++       -v, --verbose               more verbose output\n\
++       -R, --reset                 reset MII to poweron state\n\
++       -r, --restart               restart autonegotiation\n\
++       -w, --watch                 monitor for link status changes\n\
++       -l, --log                   with -w, write events to syslog\n\
++       -A, --advertise=media,...   advertise only specified media\n\
++       -F, --force=media           force specified media technology\n\
++media: 100baseT4, 100baseTx-FD, 100baseTx-HD, 10baseT-FD, 10baseT-HD,\n\
+        (to advertise both HD and FD) 100baseTx, 10baseT\n";
+ int main(int argc, char **argv)
diff --git a/packages/net-tools/files/net-tools-1.60-gcc34.patch b/packages/net-tools/files/net-tools-1.60-gcc34.patch
new file mode 100644 (file)
index 0000000..5f700c1
--- /dev/null
@@ -0,0 +1,36 @@
+--- net-tools-1.60/lib/inet_sr.c.gcc34 2000-02-20 22:46:45.000000000 +0100
++++ net-tools-1.60/lib/inet_sr.c       2004-03-30 15:57:25.276049571 +0200
+@@ -105,6 +105,7 @@
+     case 2:
+        isnet = 0; break;
+     default:
++       ;
+     }
+     /* Fill in the other fields. */
+--- net-tools-1.60/hostname.c.gcc34    2004-03-30 15:58:12.979830341 +0200
++++ net-tools-1.60/hostname.c  2004-03-30 15:58:47.110380585 +0200
+@@ -98,6 +98,7 @@
+           fprintf(stderr, _("%s: name too long\n"), program_name);
+           break;
+       default:
++      ;
+       }
+       exit(1);
+     };
+@@ -117,6 +118,7 @@
+           fprintf(stderr, _("%s: name too long\n"), program_name);
+           break;
+       default:
++        ;
+       }
+       exit(1);
+     };
+@@ -180,6 +182,7 @@
+       printf("%s\n", hp->h_name);
+       break;
+     default:
++    ;
+     }
+ }
diff --git a/packages/net-tools/files/net-tools-1.60-hostname_man.patch b/packages/net-tools/files/net-tools-1.60-hostname_man.patch
new file mode 100644 (file)
index 0000000..84a4051
--- /dev/null
@@ -0,0 +1,35 @@
+--- net-tools-1.60/man/en_US/hostname.1.gethostbyname  2005-10-14 11:33:41.000000000 +0200
++++ net-tools-1.60/man/en_US/hostname.1        2005-10-15 11:46:14.646697600 +0200
+@@ -99,6 +99,32 @@
+ complete FQDN of the system is returned with
+ .BR "hostname \-\-fqdn" .
++.LP
++The function 
++.BR gethostname(2)
++is used to get the hostname.  Only when the 
++.BR "hostname \-s" 
++is called will 
++.BR gethostbyname(3)
++be called.  The difference in 
++.BR gethostname(2)
++and
++.BR gethostbyname(3)
++is that
++.BR gethostbyname(3)
++is network aware, so it consults 
++.IR /etc/nsswitch.conf
++and
++.IR /etc/host.conf
++to decide whether to read information in
++.IR /etc/sysconfig/network
++or
++.IR /etc/hosts
++. To add another dimension to this,
++the 
++.B hostname 
++is also set when the network interface is brought up.
++
+ .SS "SET NAME"
+ When called with one argument or with the 
+ .B \-\-file
diff --git a/packages/net-tools/files/net-tools-1.60-ifaceopt.patch b/packages/net-tools/files/net-tools-1.60-ifaceopt.patch
new file mode 100644 (file)
index 0000000..a561d07
--- /dev/null
@@ -0,0 +1,52 @@
+--- net-tools-1.60/netstat.c.ifaceopt  2005-03-01 12:11:43.695661632 +0100
++++ net-tools-1.60/netstat.c   2005-03-01 12:16:37.601981080 +0100
+@@ -1658,10 +1658,11 @@
+ {
+     fprintf(stderr, _("usage: netstat [-veenNcCF] [<Af>] -r         netstat {-V|--version|-h|--help}\n"));
+     fprintf(stderr, _("       netstat [-vnNcaeol] [<Socket> ...]\n"));
+-    fprintf(stderr, _("       netstat { [-veenNac] -i[<Iface>] | [-cnNe] -M | -s } [delay]\n\n"));
++    fprintf(stderr, _("       netstat { [-veenNac] -I[<Iface>] | [-veenNac] -i | [-cnNe] -M | -s } [delay]\n\n"));
+     fprintf(stderr, _("        -r, --route                display routing table\n"));
+-    fprintf(stderr, _("        -i, --interfaces=[<Iface>] display interface table\n"));
++    fprintf(stderr, _("        -I, --interfaces=[<Iface>] display interface table for <Iface>\n"));
++    fprintf(stderr, _("        -i, --interfaces           display interface table\n"));
+     fprintf(stderr, _("        -g, --groups               display multicast group memberships\n"));
+     fprintf(stderr, _("        -s, --statistics           display networking statistics (like SNMP)\n"));
+ #if HAVE_FW_MASQUERADE
+@@ -1700,7 +1701,8 @@
+     {
+       AFTRANS_OPTS,
+       {"version", 0, 0, 'V'},
+-      {"interfaces", 2, 0, 'i'},
++      {"interfaces", 2, 0, 'I'},
++      {"interfaces", 0, 0, 'i'},
+       {"help", 0, 0, 'h'},
+       {"route", 0, 0, 'r'},
+ #if HAVE_FW_MASQUERADE
+@@ -1738,7 +1740,8 @@
+     getroute_init();          /* Set up AF routing support */
+     afname[0] = '\0';
+-    while ((i = getopt_long(argc, argv, "MCFA:acdegphi::nNorstuVv?wxl", longopts, &lop)) != EOF)
++
++    while ((i = getopt_long(argc, argv, "MCFA:acdegphiI::nNorstuVv?wxl", longopts, &lop)) != EOF)
+       switch (i) {
+       case -1:
+           break;
+@@ -1779,11 +1782,14 @@
+       case 'p':
+           flag_prg++;
+           break;
+-      case 'i':
++      case 'I':
+             if (optarg && strcmp(optarg, "(null)"))
+                 flag_int_name = strdup(optarg);
+           flag_int++;
+           break;
++      case 'i':
++              flag_int++;
++          break;
+       case 'n':
+           flag_not |= FLAG_NUM;
+           break;
diff --git a/packages/net-tools/files/net-tools-1.60-ifconfig.patch b/packages/net-tools/files/net-tools-1.60-ifconfig.patch
new file mode 100644 (file)
index 0000000..a209bd4
--- /dev/null
@@ -0,0 +1,107 @@
+--- net-tools-1.60/ifconfig.c.new      2005-07-20 12:47:29.000000000 +0200
++++ net-tools-1.60/ifconfig.c  2005-07-20 12:54:57.000000000 +0200
+@@ -175,6 +175,32 @@
+     return (0);
+ }
++/** test is a specified flag is set */
++static int test_flag(char *ifname, short flags)
++{
++    struct ifreq ifr;
++    int fd;
++
++    if (strchr(ifname, ':')) {
++        /* This is a v4 alias interface.  Downing it via a socket for
++         another AF may have bad consequences. */
++        fd = get_socket_for_af(AF_INET);
++      if (fd < 0) {
++          fprintf(stderr, _("No support for INET on this system.\n"));
++          return -1;
++      }
++    } else
++        fd = skfd;
++
++    safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
++    if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
++      fprintf(stderr, _("%s: ERROR while testing interface flags: %s\n"), 
++              ifname, strerror(errno));
++      return -1;
++    }
++    return (ifr.ifr_flags & flags);
++}
++
+ static void usage(void)
+ {
+     fprintf(stderr, _("Usage:\n  ifconfig [-a] [-v] [-s] <interface> [[<AF>] <address>]\n"));
+@@ -249,7 +275,7 @@
+                       err = 1;
+       }
+     }
+-    return 0;
++    return err;
+ }
+ int main(int argc, char **argv)
+@@ -415,6 +441,8 @@
+       }
+       if (!strcmp(*spp, "-promisc")) {
+           goterr |= clr_flag(ifr.ifr_name, IFF_PROMISC);
++          if (test_flag(ifr.ifr_name, IFF_PROMISC) > 0)
++              fprintf(stderr, _("Warning: Interface %s still in promisc mode... maybe other application is running?\n"), ifr.ifr_name);
+           spp++;
+           continue;
+       }
+@@ -425,6 +453,8 @@
+       }
+       if (!strcmp(*spp, "-multicast")) {
+           goterr |= clr_flag(ifr.ifr_name, IFF_MULTICAST);
++          if (test_flag(ifr.ifr_name, IFF_MULTICAST) > 0)
++              fprintf(stderr, _("Warning: Interface %s still in MULTICAST mode.\n"), ifr.ifr_name);
+           spp++;
+           continue;
+       }
+@@ -435,6 +465,8 @@
+       }
+       if (!strcmp(*spp, "-allmulti")) {
+           goterr |= clr_flag(ifr.ifr_name, IFF_ALLMULTI);
++          if (test_flag(ifr.ifr_name, IFF_MULTICAST) > 0)
++              fprintf(stderr, _("Warning: Interface %s still in ALLMULTI mode.\n"), ifr.ifr_name);
+           spp++;
+           continue;
+       }
+@@ -456,6 +488,8 @@
+       }
+       if (!strcmp(*spp, "-dynamic")) {
+           goterr |= clr_flag(ifr.ifr_name, IFF_DYNAMIC);
++          if (test_flag(ifr.ifr_name, IFF_MULTICAST) > 0)
++              fprintf(stderr, _("Warning: Interface %s still in DYNAMIC mode.\n"), ifr.ifr_name);
+           spp++;
+           continue;
+       }
+@@ -513,6 +547,8 @@
+       if (!strcmp(*spp, "-broadcast")) {
+           goterr |= clr_flag(ifr.ifr_name, IFF_BROADCAST);
++          if (test_flag(ifr.ifr_name, IFF_MULTICAST) > 0)
++              fprintf(stderr, _("Warning: Interface %s still in BROADCAST mode.\n"), ifr.ifr_name);
+           spp++;
+           continue;
+       }
+@@ -569,7 +605,7 @@
+               continue;
+           }
+           didnetmask++;
+-          goterr = set_netmask(ap->fd, &ifr, &sa, dobcast);
++          goterr |= set_netmask(ap->fd, &ifr, &sa, dobcast);
+           spp++;
+           continue;
+       }
+@@ -640,6 +676,8 @@
+       }
+       if (!strcmp(*spp, "-pointopoint")) {
+           goterr |= clr_flag(ifr.ifr_name, IFF_POINTOPOINT);
++          if (test_flag(ifr.ifr_name, IFF_MULTICAST) > 0)
++              fprintf(stderr, _("Warning: Interface %s still in POINTOPOINT mode.\n"), ifr.ifr_name);
+           spp++;
+           continue;
+       }
diff --git a/packages/net-tools/files/net-tools-1.60-ifconfig_ib.patch b/packages/net-tools/files/net-tools-1.60-ifconfig_ib.patch
new file mode 100644 (file)
index 0000000..b5a234f
--- /dev/null
@@ -0,0 +1,202 @@
+--- net-tools-1.60/config.in.ifconfig_ib       2000-05-21 16:32:12.000000000 +0200
++++ net-tools-1.60/config.in   2005-02-09 10:36:26.000000000 +0100
+@@ -82,6 +82,7 @@
+ bool '(Cisco)-HDLC/LAPB support' HAVE_HWHDLCLAPB n
+ bool 'IrDA support' HAVE_HWIRDA y
+ bool 'Econet hardware support' HAVE_HWEC n
++bool 'InfiniBand hardware support' HAVE_HWIB y
+ *
+ *
+ *           Other Features.
+--- net-tools-1.60/lib/hw.c.ifconfig_ib        2000-05-20 20:27:25.000000000 +0200
++++ net-tools-1.60/lib/hw.c    2005-02-09 10:36:26.000000000 +0100
+@@ -73,6 +73,8 @@
+ extern struct hwtype ec_hwtype;
++extern struct hwtype ib_hwtype;
++
+ static struct hwtype *hwtypes[] =
+ {
+@@ -144,6 +146,9 @@
+ #if HAVE_HWX25
+     &x25_hwtype,
+ #endif
++#if HAVE_HWIB
++    &ib_hwtype,
++#endif
+     &unspec_hwtype,
+     NULL
+ };
+@@ -217,6 +222,9 @@
+ #if HAVE_HWEC
+     ec_hwtype.title = _("Econet");
+ #endif
++#if HAVE_HWIB
++    ib_hwtype.title = _("InfiniBand");
++#endif
+     sVhwinit = 1;
+ }
+--- net-tools-1.60/lib/ib.c.ifconfig_ib        2005-02-09 10:36:26.000000000 +0100
++++ net-tools-1.60/lib/ib.c    2005-02-09 10:42:21.000000000 +0100
+@@ -0,0 +1,147 @@
++/*
++ * lib/ib.c        This file contains an implementation of the "Infiniband"
++ *              support functions.
++ *
++ * Version:     $Id: ib.c,v 1.1 2005/02/06 11:00:47 tduffy Exp $
++ *
++ * Author:      Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
++ *              Copyright 1993 MicroWalt Corporation
++ *             Tom Duffy <tduffy@sun.com>
++ *
++ *              This program is free software; you can redistribute it
++ *              and/or  modify it under  the terms of  the GNU General
++ *              Public  License as  published  by  the  Free  Software
++ *              Foundation;  either  version 2 of the License, or  (at
++ *              your option) any later version.
++ */
++#include "config.h"
++
++#if HAVE_HWIB
++#include <sys/types.h>
++#include <sys/socket.h>
++#include <net/if_arp.h>
++/*#include <linux/if_infiniband.h> - not in gcc-kernheaders*/
++#include <stdlib.h>
++#include <stdio.h>
++#include <errno.h>
++#include <ctype.h>
++#include <string.h>
++#include <unistd.h>
++#include "net-support.h"
++#include "pathnames.h"
++#include "intl.h"
++#include "util.h"
++
++extern struct hwtype ib_hwtype;
++
++#define INFINIBAND_ALEN         20
++
++/* Display an InfiniBand address in readable format. */
++static char *pr_ib(unsigned char *ptr)
++{
++    static char buff[128];
++    char *pos;
++    unsigned int i;
++
++    pos = buff;
++    for (i = 0; i < INFINIBAND_ALEN; i++) {
++      pos += sprintf(pos, "%02X:", (*ptr++ & 0377));
++    }
++    buff[strlen(buff) - 1] = '\0';
++
++    /* snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X",
++           (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377),
++           (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377)
++      );
++    */
++    return (buff);
++}
++
++
++/* Input an Infiniband address and convert to binary. */
++static int in_ib(char *bufp, struct sockaddr *sap)
++{
++    unsigned char *ptr;
++    char c, *orig;
++    int i;
++    unsigned val;
++
++    sap->sa_family = ib_hwtype.type;
++    ptr = sap->sa_data;
++
++    i = 0;
++    orig = bufp;
++    while ((*bufp != '\0') && (i < INFINIBAND_ALEN)) {
++      val = 0;
++      c = *bufp++;
++      if (isdigit(c))
++          val = c - '0';
++      else if (c >= 'a' && c <= 'f')
++          val = c - 'a' + 10;
++      else if (c >= 'A' && c <= 'F')
++          val = c - 'A' + 10;
++      else {
++#ifdef DEBUG
++          fprintf(stderr, _("in_ib(%s): invalid infiniband address!\n"), orig);
++#endif
++          errno = EINVAL;
++          return (-1);
++      }
++      val <<= 4;
++      c = *bufp;
++      if (isdigit(c))
++          val |= c - '0';
++      else if (c >= 'a' && c <= 'f')
++          val |= c - 'a' + 10;
++      else if (c >= 'A' && c <= 'F')
++          val |= c - 'A' + 10;
++      else if (c == ':' || c == 0)
++          val >>= 4;
++      else {
++#ifdef DEBUG
++          fprintf(stderr, _("in_ib(%s): invalid infiniband address!\n"), orig);
++#endif
++          errno = EINVAL;
++          return (-1);
++      }
++      if (c != 0)
++          bufp++;
++      *ptr++ = (unsigned char) (val & 0377);
++      i++;
++
++      /* We might get a semicolon here - not required. */
++      if (*bufp == ':') {
++          if (i == INFINIBAND_ALEN) {
++#ifdef DEBUG
++              fprintf(stderr, _("in_ib(%s): trailing : ignored!\n"),
++                      orig)
++#endif
++                  ;           /* nothing */
++          }
++          bufp++;
++      }
++    }
++
++    /* That's it.  Any trailing junk? */
++    if ((i == INFINIBAND_ALEN) && (*bufp != '\0')) {
++#ifdef DEBUG
++      fprintf(stderr, _("in_ib(%s): trailing junk!\n"), orig);
++      errno = EINVAL;
++      return (-1);
++#endif
++    }
++#ifdef DEBUG
++    fprintf(stderr, "in_ib(%s): %s\n", orig, pr_ib(sap->sa_data));
++#endif
++
++    return (0);
++}
++
++
++struct hwtype ib_hwtype =
++{
++    "infiniband", NULL, ARPHRD_INFINIBAND, INFINIBAND_ALEN,
++    pr_ib, in_ib, NULL
++};
++
++#endif /* HAVE_HWIB */
+--- net-tools-1.60/lib/Makefile.ifconfig_ib    2000-10-28 12:59:42.000000000 +0200
++++ net-tools-1.60/lib/Makefile        2005-02-09 10:36:26.000000000 +0100
+@@ -16,7 +16,7 @@
+ #
+-HWOBJS         = hw.o loopback.o slip.o ether.o ax25.o ppp.o arcnet.o tr.o tunnel.o frame.o sit.o rose.o ash.o fddi.o hippi.o hdlclapb.o strip.o irda.o ec_hw.o x25.o
++HWOBJS         = hw.o loopback.o slip.o ether.o ax25.o ppp.o arcnet.o tr.o tunnel.o frame.o sit.o rose.o ash.o fddi.o hippi.o hdlclapb.o strip.o irda.o ec_hw.o x25.o ib.o
+ AFOBJS         = unix.o inet.o inet6.o ax25.o ipx.o ddp.o ipx.o netrom.o af.o rose.o econet.o x25.o
+ AFGROBJS = inet_gr.o inet6_gr.o ipx_gr.o ddp_gr.o netrom_gr.o ax25_gr.o rose_gr.o getroute.o x25_gr.o
+ AFSROBJS = inet_sr.o inet6_sr.o netrom_sr.o ipx_sr.o setroute.o x25_sr.o
diff --git a/packages/net-tools/files/net-tools-1.60-inet6-lookup.patch b/packages/net-tools/files/net-tools-1.60-inet6-lookup.patch
new file mode 100644 (file)
index 0000000..3d4854a
--- /dev/null
@@ -0,0 +1,81 @@
+--- net-tools-1.60/lib/inet6.c.inet6-lookup    2000-10-28 13:04:00.000000000 +0200
++++ net-tools-1.60/lib/inet6.c 2003-05-21 15:28:50.000000000 +0200
+@@ -133,28 +133,9 @@
+ }
+-static int INET6_getsock(char *bufp, struct sockaddr *sap)
+-{
+-    struct sockaddr_in6 *sin6;
+-
+-    sin6 = (struct sockaddr_in6 *) sap;
+-    sin6->sin6_family = AF_INET6;
+-    sin6->sin6_port = 0;
+-
+-    if (inet_pton(AF_INET6, bufp, sin6->sin6_addr.s6_addr) <= 0)
+-      return (-1);
+-
+-    return 16;                        /* ?;) */
+-}
+-
+ static int INET6_input(int type, char *bufp, struct sockaddr *sap)
+ {
+-    switch (type) {
+-    case 1:
+-      return (INET6_getsock(bufp, sap));
+-    default:
+-      return (INET6_resolve(bufp, (struct sockaddr_in6 *) sap));
+-    }
++    return (INET6_resolve(bufp, (struct sockaddr_in6 *) sap));
+ }
+--- net-tools-1.60/lib/inet6_gr.c.inet6-lookup 2001-04-01 16:48:06.000000000 +0200
++++ net-tools-1.60/lib/inet6_gr.c      2003-05-21 15:28:50.000000000 +0200
+@@ -100,7 +100,7 @@
+                addr6p[4], addr6p[5], addr6p[6], addr6p[7]);
+       inet6_aftype.input(1, addr6, (struct sockaddr *) &saddr6);
+       snprintf(addr6, sizeof(addr6), "%s/%d",
+-               inet6_aftype.sprint((struct sockaddr *) &saddr6, 1),
++               inet6_aftype.sprint((struct sockaddr *) &saddr6, numeric),
+                prefix_len);
+       /* Fetch and resolve the nexthop address. */
+@@ -109,7 +109,7 @@
+                naddr6p[4], naddr6p[5], naddr6p[6], naddr6p[7]);
+       inet6_aftype.input(1, naddr6, (struct sockaddr *) &snaddr6);
+       snprintf(naddr6, sizeof(naddr6), "%s",
+-               inet6_aftype.sprint((struct sockaddr *) &snaddr6, 1));
++               inet6_aftype.sprint((struct sockaddr *) &snaddr6, numeric));
+       /* Decode the flags. */
+       strcpy(flags, "U");
+--- net-tools-1.60/lib/inet6_sr.c.inet6-lookup 2000-05-22 23:18:37.000000000 +0200
++++ net-tools-1.60/lib/inet6_sr.c      2003-05-21 15:28:50.000000000 +0200
+@@ -63,7 +63,7 @@
+     if (*args == NULL)
+       return (usage());
+-    strcpy(target, *args++);
++    safe_strncpy(target, *args++, sizeof(target));
+     if (!strcmp(target, "default")) {
+         prefix_len = 0;
+       memset(&sa6, 0, sizeof(sa6));
+@@ -112,7 +112,7 @@
+               return (usage());
+           if (rt.rtmsg_flags & RTF_GATEWAY)
+               return (usage());
+-          strcpy(gateway, *args);
++          safe_strncpy(gateway, *args, sizeof(gateway));
+           if (inet6_aftype.input(1, gateway,
+                                  (struct sockaddr *) &sa6) < 0) {
+               inet6_aftype.herror(gateway);
+@@ -152,7 +152,7 @@
+     }
+     if (devname) {
+       memset(&ifr, 0, sizeof(ifr));
+-      strcpy(ifr.ifr_name, devname);
++      safe_strncpy(ifr.ifr_name, devname, sizeof(ifr.ifr_name));
+       if (ioctl(skfd, SIOGIFINDEX, &ifr) < 0) {
+           perror("SIOGIFINDEX");
diff --git a/packages/net-tools/files/net-tools-1.60-interface.patch b/packages/net-tools/files/net-tools-1.60-interface.patch
new file mode 100644 (file)
index 0000000..3a1bc91
--- /dev/null
@@ -0,0 +1,110 @@
+--- net-tools-1.60/netstat.c.interface 2003-08-25 17:06:30.000000000 +0200
++++ net-tools-1.60/netstat.c   2003-08-25 17:08:41.000000000 +0200
+@@ -129,6 +129,7 @@
+ #define E_IOCTL -3
+ int flag_int = 0;
++char *flag_int_name = NULL;
+ int flag_rou = 0;
+ int flag_mas = 0;
+ int flag_sta = 0;
+@@ -1441,6 +1442,7 @@
+ static int iface_info(void)
+ {
+     static int count=0;
++    struct interface *ife = NULL;
+     if (skfd < 0) {
+       if ((skfd = sockets_open(0)) < 0) {
+@@ -1455,7 +1457,11 @@
+           printf(_("Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg\n"));
+     }
+-    if (for_all_interfaces(do_if_print, &flag_all) < 0) {
++    if (flag_int_name) {
++        ife = lookup_interface(flag_int_name);
++        do_if_print(ife, &flag_all);
++    }
++    else if (for_all_interfaces(do_if_print, &flag_all) < 0) {
+       perror(_("missing interface information"));
+       exit(1);
+     }
+@@ -1481,30 +1487,31 @@
+ {
+     fprintf(stderr, _("usage: netstat [-veenNcCF] [<Af>] -r         netstat {-V|--version|-h|--help}\n"));
+     fprintf(stderr, _("       netstat [-vnNcaeol] [<Socket> ...]\n"));
+-    fprintf(stderr, _("       netstat { [-veenNac] -i | [-cnNe] -M | -s } [delay]\n\n"));
++    fprintf(stderr, _("       netstat { [-veenNac] -i[<Iface>] | [-cnNe] -M | -s } [delay]\n\n"));
+-    fprintf(stderr, _("        -r, --route              display routing table\n"));
+-    fprintf(stderr, _("        -i, --interfaces         display interface table\n"));
+-    fprintf(stderr, _("        -g, --groups             display multicast group memberships\n"));
+-    fprintf(stderr, _("        -s, --statistics         display networking statistics (like SNMP)\n"));
++    fprintf(stderr, _("        -r, --route                display routing table\n"));
++    fprintf(stderr, _("        -i, --interfaces=[<Iface>] display interface table\n"));
++    fprintf(stderr, _("        -g, --groups               display multicast group memberships\n"));
++    fprintf(stderr, _("        -s, --statistics           display networking statistics (like SNMP)\n"));
+ #if HAVE_FW_MASQUERADE
+-    fprintf(stderr, _("        -M, --masquerade         display masqueraded connections\n\n"));
++    fprintf(stderr, _("        -M, --masquerade           display masqueraded connections\n\n"));
+ #endif
+-    fprintf(stderr, _("        -v, --verbose            be verbose\n"));
+-    fprintf(stderr, _("        -n, --numeric            don't resolve names\n"));
+-    fprintf(stderr, _("        --numeric-hosts          don't resolve host names\n"));
+-    fprintf(stderr, _("        --numeric-ports          don't resolve port names\n"));
+-    fprintf(stderr, _("        --numeric-users          don't resolve user names\n"));
+-    fprintf(stderr, _("        -N, --symbolic           resolve hardware names\n"));
+-    fprintf(stderr, _("        -e, --extend             display other/more information\n"));
+-    fprintf(stderr, _("        -p, --programs           display PID/Program name for sockets\n"));
+-    fprintf(stderr, _("        -c, --continuous         continuous listing\n\n"));
+-    fprintf(stderr, _("        -l, --listening          display listening server sockets\n"));
+-    fprintf(stderr, _("        -a, --all, --listening   display all sockets (default: connected)\n"));
+-    fprintf(stderr, _("        -o, --timers             display timers\n"));
+-    fprintf(stderr, _("        -F, --fib                display Forwarding Information Base (default)\n"));
+-    fprintf(stderr, _("        -C, --cache              display routing cache instead of FIB\n\n"));
++    fprintf(stderr, _("        -v, --verbose              be verbose\n"));
++    fprintf(stderr, _("        -n, --numeric              don't resolve names\n"));
++    fprintf(stderr, _("        --numeric-hosts            don't resolve host names\n"));
++    fprintf(stderr, _("        --numeric-ports            don't resolve port names\n"));
++    fprintf(stderr, _("        --numeric-users            don't resolve user names\n"));
++    fprintf(stderr, _("        -N, --symbolic             resolve hardware names\n"));
++    fprintf(stderr, _("        -e, --extend               display other/more information\n"));
++    fprintf(stderr, _("        -p, --programs             display PID/Program name for sockets\n"));
++    fprintf(stderr, _("        -c, --continuous           continuous listing\n\n"));
++    fprintf(stderr, _("        -l, --listening            display listening server sockets\n"));
++    fprintf(stderr, _("        -a, --all, --listening     display all sockets (default: connected)\n"));
++    fprintf(stderr, _("        -o, --timers               display timers\n"));
++    fprintf(stderr, _("        -F, --fib                  display Forwarding Information Base (default)\n"));
++    fprintf(stderr, _("        -C, --cache                display routing cache instead of FIB\n\n"));
++    fprintf(stderr, _("  <Iface>: Name of interface to monitor/list.\n"));
+     fprintf(stderr, _("  <Socket>={-t|--tcp} {-u|--udp} {-w|--raw} {-x|--unix} --ax25 --ipx --netrom\n"));
+     fprintf(stderr, _("  <AF>=Use '-A <af>' or '--<af>'; default: %s\n"), DFLT_AF);
+     fprintf(stderr, _("  List of possible address families (which support routing):\n"));
+@@ -1522,7 +1529,7 @@
+     {
+       AFTRANS_OPTS,
+       {"version", 0, 0, 'V'},
+-      {"interfaces", 0, 0, 'i'},
++      {"interfaces", 2, 0, 'i'},
+       {"help", 0, 0, 'h'},
+       {"route", 0, 0, 'r'},
+ #if HAVE_FW_MASQUERADE
+@@ -1560,7 +1567,7 @@
+     getroute_init();          /* Set up AF routing support */
+     afname[0] = '\0';
+-    while ((i = getopt_long(argc, argv, "MCFA:acdegphinNorstuVv?wxl", longopts, &lop)) != EOF)
++    while ((i = getopt_long(argc, argv, "MCFA:acdegphi::nNorstuVv?wxl", longopts, &lop)) != EOF)
+       switch (i) {
+       case -1:
+           break;
+@@ -1602,6 +1609,8 @@
+           flag_prg++;
+           break;
+       case 'i':
++            if (optarg && strcmp(optarg, "(null)"))
++                flag_int_name = strdup(optarg);
+           flag_int++;
+           break;
+       case 'n':
diff --git a/packages/net-tools/files/net-tools-1.60-interface_stack.patch b/packages/net-tools/files/net-tools-1.60-interface_stack.patch
new file mode 100644 (file)
index 0000000..c16f539
--- /dev/null
@@ -0,0 +1,115 @@
+Bugzilla Bug 176714 – *** stack smashing detected ***: /sbin/ifconfig terminated
+
+--- lib/interface.c-old        2005-12-30 11:08:15.000000000 -0800
++++ lib/interface.c    2005-12-30 11:17:02.000000000 -0800
+@@ -201,10 +201,11 @@
+     return err;
+ }
+-static char *get_name(char *name, char *p)
++static char *get_name(char **namep, char *p)
+ {
+     while (isspace(*p))
+       p++;
++    char *name = *namep = p;
+     while (*p) {
+       if (isspace(*p))
+           break;
+@@ -305,9 +306,10 @@
+ {
+     static int proc_read; 
+     FILE *fh;
+-    char buf[512];
+     struct interface *ife;
+     int err;
++    char *line = NULL;
++    size_t linelen = 0;
+     if (proc_read) 
+           return 0; 
+@@ -320,8 +322,11 @@
+                       _PATH_PROCNET_DEV, strerror(errno)); 
+               return if_readconf();
+       }       
+-    fgets(buf, sizeof buf, fh);       /* eat line */
+-    fgets(buf, sizeof buf, fh);
++    if (getline(&line, &linelen, fh) == -1 /* eat line */
++      || getline(&line, &linelen, fh) == -1) {
++              err = -1;
++              goto out;
++    }
+ #if 0                         /* pretty, but can't cope with missing fields */
+     fmt = proc_gen_fmt(_PATH_PROCNET_DEV, 1, fh,
+@@ -346,13 +351,13 @@
+     if (!fmt)
+       return -1;
+ #else
+-    procnetdev_vsn = procnetdev_version(buf);
++    procnetdev_vsn = procnetdev_version(line);
+ #endif
+     err = 0;
+-    while (fgets(buf, sizeof buf, fh)) {
+-      char *s, name[IFNAMSIZ];
+-      s = get_name(name, buf);    
++    while (getline(&line, &linelen, fh) != -1) {
++      char *s, *name;
++      s = get_name(&name, line);    
+       ife = add_interface(name);
+       get_dev_fields(s, ife);
+       ife->statistics_valid = 1;
+@@ -368,6 +373,8 @@
+ #if 0
+     free(fmt);
+ #endif
++  out:
++    free(line);
+     fclose(fh);
+     return err;
+ }
+@@ -376,8 +383,9 @@
+ static int if_readlist_rep(char *target, struct interface *ife)
+ {
+     FILE *fh;
+-    char buf[512];
+     int err;
++    char *line = NULL;
++    size_t linelen = 0;
+     fh = fopen(_PATH_PROCNET_DEV, "r");
+     if (!fh) {
+@@ -385,15 +393,18 @@
+                       _PATH_PROCNET_DEV, strerror(errno)); 
+               return if_readconf();
+       }       
+-    fgets(buf, sizeof buf, fh);       /* eat line */
+-    fgets(buf, sizeof buf, fh);
++    if (getline(&line, &linelen, fh) == -1 /* eat line */
++      || getline(&line, &linelen, fh) == -1) {
++              err = -1;
++              goto out;
++    }
+-    procnetdev_vsn = procnetdev_version(buf);
++    procnetdev_vsn = procnetdev_version(line);
+     err = 0;
+-    while (fgets(buf, sizeof buf, fh)) {
+-      char *s, name[IFNAMSIZ];
+-      s = get_name(name, buf);    
++    while (getline(&line, &linelen, fh) != -1) {
++      char *s, *name;
++      s = get_name(&name, line);    
+       get_dev_fields(s, ife);
+       if (target && !strcmp(target,name))
+       {
+@@ -406,6 +417,8 @@
+       err = -1;
+     }
++  out:
++    free(line);
+     fclose(fh);
+     return err;
+ }
diff --git a/packages/net-tools/files/net-tools-1.60-ipx.patch b/packages/net-tools/files/net-tools-1.60-ipx.patch
new file mode 100644 (file)
index 0000000..d4458b9
--- /dev/null
@@ -0,0 +1,36 @@
+diff -urN net-tools-1.60/lib/ipx_gr.c net-tools-1.60.new/lib/ipx_gr.c
+--- net-tools-1.60/lib/ipx_gr.c        2000-10-28 12:59:42.000000000 +0200
++++ net-tools-1.60.new/lib/ipx_gr.c    2003-05-20 10:54:37.000000000 +0200
+@@ -64,7 +64,7 @@
+           continue;
+       /* Fetch and resolve the Destination */
+-      (void) ap->input(5, net, &sa);
++      (void) ap->input(1, net, &sa);
+       strcpy(net, ap->sprint(&sa, numeric));
+       /* Fetch and resolve the Router Net */
+diff -urN net-tools-1.60/netstat.c net-tools-1.60.new/netstat.c
+--- net-tools-1.60/netstat.c   2003-05-20 11:00:57.000000000 +0200
++++ net-tools-1.60.new/netstat.c       2003-05-20 10:58:25.000000000 +0200
+@@ -1412,13 +1412,13 @@
+       }
+       /* Fetch and resolve the Source */
+-      (void) ap->input(4, sad, &sa);
++      (void) ap->input(0, sad, &sa);
+       safe_strncpy(buf, ap->sprint(&sa, flag_not), sizeof(buf));
+       snprintf(sad, sizeof(sad), "%s:%04X", buf, sport);
+       if (!nc) {
+           /* Fetch and resolve the Destination */
+-          (void) ap->input(4, dad, &sa);
++          (void) ap->input(0, dad, &sa);
+           safe_strncpy(buf, ap->sprint(&sa, flag_not), sizeof(buf));
+           snprintf(dad, sizeof(dad), "%s:%04X", buf, dport);
+       } else
+diff -urN net-tools-1.60/version.h net-tools-1.60.new/version.h
+--- net-tools-1.60/version.h   1970-01-01 01:00:00.000000000 +0100
++++ net-tools-1.60.new/version.h       2003-05-19 16:07:49.000000000 +0200
+@@ -0,0 +1 @@
++#define RELEASE "net-tools 1.60"
diff --git a/packages/net-tools/files/net-tools-1.60-isofix.patch b/packages/net-tools/files/net-tools-1.60-isofix.patch
new file mode 100644 (file)
index 0000000..4bbaff1
--- /dev/null
@@ -0,0 +1,33 @@
+--- net-tools-1.60/po/de.po.isofix     2000-10-28 12:59:43.000000000 +0200
++++ net-tools-1.60/po/de.po    2005-01-10 11:29:29.407639208 +0100
+@@ -9,7 +9,7 @@
+ "Last-Translator: Ralf Bächle <ralf@gnu.org>\n"
+ "Language-Team:\n"
+ "MIME-Version: 1.0\n"
+-"Content-Type: text/plain; charset=iso8859-1\n"
++"Content-Type: text/plain; charset=iso-8859-1\n"
+ "Content-Transfer-Encoding: 8bit\n"
+ #: ../arp.c:110 ../arp.c:269
+--- net-tools-1.60/po/fr.po.isofix     2000-02-20 22:47:00.000000000 +0100
++++ net-tools-1.60/po/fr.po    2005-01-10 11:29:23.613520048 +0100
+@@ -9,7 +9,7 @@
+ "Last-Translator: J.M.Vansteene <vanstee@worldnet.fr>\n"
+ "Language-Team:\n"
+ "MIME-Version: 1.0\n"
+-"Content-Type: text/plain; charset=iso8859-1\n"
++"Content-Type: text/plain; charset=iso-8859-1\n"
+ "Content-Transfer-Encoding: 8bit\n"
+ #: ../arp.c:110 ../arp.c:269
+--- net-tools-1.60/po/pt_BR.po.isofix  2000-02-20 22:47:06.000000000 +0100
++++ net-tools-1.60/po/pt_BR.po 2005-01-10 11:29:16.294632688 +0100
+@@ -14,7 +14,7 @@
+ "PO-Revision-Date: 1999-03-01 02:38+0100\n"
+ "Last-Translator: Arnaldo Carvalho de Melo <acme@conectiva.com.br>\n"
+ "MIME-Version: 1.0\n"
+-"Content-Type: text/plain; charset=ISO8859-9\n"
++"Content-Type: text/plain; charset=iso-8859-9\n"
+ "Content-Transfer-Encoding: 8bit\n"
+ #: ../arp.c:110 ../arp.c:269
diff --git a/packages/net-tools/files/net-tools-1.60-man.patch b/packages/net-tools/files/net-tools-1.60-man.patch
new file mode 100644 (file)
index 0000000..2deac4a
--- /dev/null
@@ -0,0 +1,132 @@
+--- net-tools-1.60/man/en_US/ifconfig.8.man    2000-10-28 12:59:42.000000000 +0200
++++ net-tools-1.60/man/en_US/ifconfig.8        2003-05-22 16:58:41.000000000 +0200
+@@ -177,7 +177,7 @@
+ command.
+ .LP
+ Interrupt problems with Ethernet device drivers fail with EAGAIN. See
+-.I http://cesdis.gsfc.nasa.gov/linux/misc/irq-conflict.html
++.I http://www.scyld.com/expert/irq-conflict.html
+ for more information.
+ .SH FILES
+ .I /proc/net/socket 
+--- net-tools-1.60/man/en_US/hostname.1.man    1999-02-27 13:11:14.000000000 +0100
++++ net-tools-1.60/man/en_US/hostname.1        2003-05-22 17:04:30.000000000 +0200
+@@ -10,8 +10,6 @@
+ nisdomainname \- show or set system's NIS/YP domain name
+ .br
+ ypdomainname \- show or set the system's NIS/YP domain name
+-.br
+-nodename \- show or set the system's DECnet node name
+ .SH SYNOPSIS
+ .B hostname
+@@ -96,12 +94,6 @@
+ function. This is also known as the YP/NIS domain name of the system.
+ .LP
+-.B nodename
+-will print the DECnet node name of the system as returned by the
+-.BR getnodename (2)
+-function.
+-
+-.LP
+ .B dnsdomainname
+ will print the domain part of the FQDN (Fully Qualified Domain Name). The
+ complete FQDN of the system is returned with
+@@ -184,11 +176,6 @@
+ .I "\-i, \-\-ip-address"
+ Display the IP address(es) of the host.
+ .TP
+-.I "\-n, \-\-node"
+-Display the DECnet node name. If a parameter is given (or
+-.B \-\-file name
+-) the root can also set a new node name.
+-.TP
+ .I "\-s, \-\-short"
+ Display the short host name. This is the host name cut at the first dot.
+ .TP
+--- net-tools-1.60/man/fr_FR/hostname.1.man    1999-04-18 21:23:46.000000000 +0200
++++ net-tools-1.60/man/fr_FR/hostname.1        2003-05-22 17:05:04.000000000 +0200
+@@ -9,8 +9,6 @@
+ nisdomainname \- affiche ou définit le nom de domaine NIS/YP du système
+ .br
+ ypdomainname \- affiche ou définit le nom de domaine NIS/YP du système
+-.br
+-nodename \- affiche ou définit le nom de domaine DECnet du système
+ .SH SYNOPSIS
+ .B hostname
+@@ -87,14 +85,6 @@
+ .BR getdomainname (2)
+ . Ceci est connu comme nom de domaine YP/NIS du système.
+-
+-.LP
+-.B nodename
+-fournit le nom de noeud DECnet du système tel qu'il est retourné par la
+-fonction
+-.BR getnodename (2)
+-.
+-
+ .LP
+ .B dnsdomainname
+ fournit la partie domaine du nom complètement qualifié - FQDN (Fully
+@@ -180,11 +170,6 @@
+ .I "\-i, \-\-ip-address"
+ Affiche la (les) adresse(s) IP de l'hôte.
+ .TP
+-.I "\-n, \-\-node"
+-Affiche le nom de noeud DECnet. Si un paramètre est fourni (ou
+-.B \-\-file nom_fichier
+-) le super-utilisateur peut également définir un nouveau nom de neud.
+-.TP
+ .I "\-s, \-\-short"
+ Affiche le nom d'hôte en format court. Il s'agit du nom d'hôte coupé au
+ premier point.
+--- net-tools-1.60/man/de_DE/hostname.1.man    1999-03-15 21:31:16.000000000 +0100
++++ net-tools-1.60/man/de_DE/hostname.1        2003-05-22 17:06:01.000000000 +0200
+@@ -15,8 +15,6 @@
+ nisdomainname \- den NIS/YP Domainnamen anzeigen oder setzen
+ .br
+ ypdomainname \- den NIS/YP Domainnamen anzeigen oder setzen
+-.br
+-nodename \- den DECnet-Knotennamen anzeigen oder setzen
+ .SH SYNOPSIS
+ .B hostname
+@@ -101,12 +99,6 @@
+ des Systems genannt.
+ .LP
+-.B nodename
+-druckt den DECnet-Knotennamen des Systems, wie er von der
+-.BR getnodename (2)
+-Function ermittelt wird, aus.
+-
+-.LP
+ .B dnsdomainname
+ druckt den Domainteil des FQDN (Fully Qualified Domain Name oder zu deutsch
+ vollst\(:andig spezifizierter Domainname) aus.  Der vollst\(:andige FQDN
+@@ -117,8 +109,8 @@
+ .SS "NAME SETZEN"
+ Wenn mit nur einem Argument oder mit der
+ .B \-\-file
+-Option aufgerufen, dann setzen diese Kommandos den Rechnernamen, den NIS/YP
+-Domainnamen oder den DECnet-Knotennamen.
++Option aufgerufen, dann setzen diese Kommandos den Rechnernamen oder den NIS/YP
++Domainnamen.
+ .LP
+ Nur der Superuser darf den Namen \(:andern.
+@@ -198,11 +190,6 @@
+ .I "\-i, \-\-ip-address"
+ Die IP-Adresse(n) des Rechners anzeigen und beenden.
+ .TP
+-.I "\-n, \-\-node"
+-Den DECnet-Knotennamen anzeigen.  Wenn ein Argument oder die
+-.B \-\-file name
+-Option angegeben wird, dann kann Root auch einen neuen Knotennamen setzen.
+-.TP
+ .I "\-s, \-\-short"
+ Den Kurznamen anzeigen.  Dies ist der ab dem ersten Punkt abgeschnittene
+ Rechnername.
diff --git a/packages/net-tools/files/net-tools-1.60-manydevs.patch b/packages/net-tools/files/net-tools-1.60-manydevs.patch
new file mode 100644 (file)
index 0000000..d07ffba
--- /dev/null
@@ -0,0 +1,13 @@
+--- lib/nstrcmp.c.bak  Fri Apr 12 00:15:01 2002
++++ lib/nstrcmp.c      Fri Apr 12 00:15:29 2002
+@@ -16,8 +16,8 @@
+       b++;
+     }
+     if (isdigit(*a)) {
+-      if (!isdigit(*b))
+-          return -1;
++        if (!isdigit(*b))
++          return 1;
+       while (a > astr) {
+           a--;
+           if (!isdigit(*a)) {
diff --git a/packages/net-tools/files/net-tools-1.60-mii-tool-obsolete.patch b/packages/net-tools/files/net-tools-1.60-mii-tool-obsolete.patch
new file mode 100644 (file)
index 0000000..efb7f27
--- /dev/null
@@ -0,0 +1,25 @@
+--- net-tools-1.60/man/en_US/mii-tool.8.obsolete       2000-05-21 16:21:38.000000000 +0200
++++ net-tools-1.60/man/en_US/mii-tool.8        2004-11-11 10:45:51.155113000 +0100
+@@ -18,6 +18,12 @@
+ [\fB\-F\fR, \fB\-\-force=\fImedia\fR]
+ .RI [ "interface\ ..." ]
++.SH NOTE
++.P 
++This program is obsolete. Valid media are only \fB100baseT4\fR, 
++\fB100baseTx-FD\fR,\fB100baseTx-HD\fR, \fB10baseT-FD\fR and 
++\fB10baseT-HD\fR ethernet cards. For replacement check \fBethtool\fB.
++
+ .SH DESCRIPTION
+ This utility checks or sets the status of a network interface's Media
+ Independent Interface (MII) unit.  Most fast ethernet adapters use an
+@@ -72,6 +78,9 @@
+ commas.  Valid media are \fB100baseT4\fR, \fB100baseTx-FD\fR,
+ \fB100baseTx-HD\fR, \fB10baseT-FD\fR, and \fB10baseT-HD\fR.
++.SH SEE ALSO
++ethtool(8)
++
+ .SH AUTHORS
+ David Hinds \- dhinds@pcmcia.sourceforge.org
+ .br
diff --git a/packages/net-tools/files/net-tools-1.60-miiioctl.patch b/packages/net-tools/files/net-tools-1.60-miiioctl.patch
new file mode 100644 (file)
index 0000000..4859273
--- /dev/null
@@ -0,0 +1,17 @@
+--- net-tools-1.60/include/mii.h.bar   Tue Jul 31 11:49:39 2001
++++ net-tools-1.60/include/mii.h       Tue Jul 31 11:49:33 2001
+@@ -11,11 +11,9 @@
+ /* network interface ioctl's for MII commands */
+ #ifndef SIOCGMIIPHY
+-#define SIOCGMIIPHY (SIOCDEVPRIVATE)  /* Read from current PHY */
+-#define SIOCGMIIREG (SIOCDEVPRIVATE+1)        /* Read any PHY register */
+-#define SIOCSMIIREG (SIOCDEVPRIVATE+2)        /* Write any PHY register */
+-#define SIOCGPARAMS (SIOCDEVPRIVATE+3)        /* Read operational parameters */
+-#define SIOCSPARAMS (SIOCDEVPRIVATE+4)        /* Set operational parameters */
++#define SIOCGMIIPHY 0x8947    /* Read from current PHY */
++#define SIOCGMIIREG 0x8948    /* Read any PHY register */
++#define SIOCSMIIREG 0x8949    /* Write any PHY register */
+ #endif
+ #include <linux/types.h>
diff --git a/packages/net-tools/files/net-tools-1.60-nameif.patch b/packages/net-tools/files/net-tools-1.60-nameif.patch
new file mode 100644 (file)
index 0000000..7ba1f00
--- /dev/null
@@ -0,0 +1,67 @@
+--- net-tools-1.60/nameif.c.nameif     2000-10-18 19:26:29.000000000 +0200
++++ net-tools-1.60/nameif.c    2003-03-19 11:02:01.000000000 +0100
+@@ -3,7 +3,7 @@
+  * Writen 2000 by Andi Kleen.
+  * Subject to the Gnu Public License, version 2.  
+  * TODO: make it support token ring etc.
+- * $Id: nameif.c,v 1.1 2000/10/18 17:26:29 ak Exp $
++ * $Id: nameif.c,v 1.3 2003/03/06 23:26:52 ecki Exp $
+  */ 
+ #ifndef _GNU_SOURCE 
+ #define _GNU_SOURCE
+@@ -117,7 +117,8 @@
+ }
+ struct change { 
+-      struct change *next,**pprev;
++      struct change *next;
++      int found;
+       char ifname[IFNAMSIZ+1];
+       unsigned char mac[6];
+ }; 
+@@ -139,10 +140,7 @@
+                       ch->ifname, pos); 
+       if (parsemac(p,ch->mac) < 0) 
+               complain(_("cannot parse MAC `%s' at %s"), p, pos); 
+-      if (clist) 
+-              clist->pprev = &ch->next;
+       ch->next = clist;
+-      ch->pprev = &clist;
+       clist = ch;
+       return 0; 
+ }
+@@ -200,7 +198,7 @@
+ void usage(void)
+ {
+-      fprintf(stderr, _("usage: nameif [-c configurationfile] [-s] {ifname macaddress}")); 
++      fprintf(stderr, _("usage: nameif [-c configurationfile] [-s] {ifname macaddress}\n")); 
+       exit(1); 
+ }
+@@ -277,21 +275,21 @@
+               ch = lookupmac(mac); 
+               if (!ch) 
+                       continue;
+-                      
+-              *ch->pprev = ch->next;
++              
++              ch->found = 1;  
+               if (strcmp(p, ch->ifname)) { 
+                       if (setname(p, ch->ifname) < 0)  
+                               complain(_("cannot change name of %s to %s: %s"),
+                                               p, ch->ifname, strerror(errno)); 
+               } 
+-              free(ch);
+       } 
+       fclose(ifh); 
+       
+       while (clist) { 
+               struct change *ch = clist;
+               clist = clist->next;
+-              warning(_("interface '%s' not found"), ch->ifname); 
++              if (!ch->found)
++                      warning(_("interface '%s' not found"), ch->ifname); 
+               free(ch); 
+       }
diff --git a/packages/net-tools/files/net-tools-1.60-netmask.patch b/packages/net-tools/files/net-tools-1.60-netmask.patch
new file mode 100644 (file)
index 0000000..532898a
--- /dev/null
@@ -0,0 +1,61 @@
+--- net-tools-1.60/ifconfig.c.netmask  2001-04-13 20:25:18.000000000 +0200
++++ net-tools-1.60/ifconfig.c  2004-11-02 15:31:56.454594456 +0100
+@@ -23,6 +23,7 @@
+  *        20001008 - Bernd Eckenfels, Patch from RH for setting mtu 
+  *                    (default AF was wrong)
+  *          20010404 - Arnaldo Carvalho de Melo, use setlocale
++ *          20040831 - Florin Malita <fmalita@glenayre.com> delayed CIDR netmask
+  */
+ #define DFLT_AF "inet"
+@@ -227,13 +228,13 @@
+ int main(int argc, char **argv)
+ {
+-    struct sockaddr sa;
++    struct sockaddr sa, sa_netmask;
+     struct sockaddr_in sin;
+     char host[128];
+     struct aftype *ap;
+     struct hwtype *hw;
+     struct ifreq ifr;
+-    int goterr = 0, didnetmask = 0;
++    int goterr = 0, didnetmask = 0, donetmask = 0;
+     char **spp;
+     int fd;
+ #if HAVE_AFINET6
+@@ -903,16 +904,16 @@
+       /* FIXME: sa is too small for INET6 addresses, inet6 should use that too, 
+          broadcast is unexpected */
+       if (ap->getmask) {
+-          switch (ap->getmask(host, &sa, NULL)) {
++          switch (ap->getmask(host, &sa_netmask, NULL)) {
+           case -1:
+               usage();
+               break;
+           case 1:
+               if (didnetmask)
+                   usage();
+-
+-              goterr = set_netmask(skfd, &ifr, &sa);
+-              didnetmask++;
++              
++              /* delay setting the CIDR netmask till after setting the addr */
++              donetmask = 1;
+               break;
+           }
+       }
+@@ -960,6 +961,13 @@
+           }
+       }
++      /* set CIDR netmask */
++      if (donetmask) {
++              donetmask = 0;
++              goterr = set_netmask(skfd, &ifr, &sa_netmask);
++              didnetmask++;
++      }
++
+        /*
+         * Don't do the set_flag() if the address is an alias with a - at the
+         * end, since it's deleted already! - Roman
diff --git a/packages/net-tools/files/net-tools-1.60-netstat_stop_trim.patch b/packages/net-tools/files/net-tools-1.60-netstat_stop_trim.patch
new file mode 100644 (file)
index 0000000..425b5c6
--- /dev/null
@@ -0,0 +1,80 @@
+--- net-tools-1.60/man/en_US/netstat.8.old     2006-02-10 11:18:11.000000000 +0100
++++ net-tools-1.60/man/en_US/netstat.8 2006-02-10 11:22:19.000000000 +0100
+@@ -176,6 +176,10 @@
+ Print routing information from the FIB.  (This is the default.)
+ .SS "\-C"
+ Print routing information from the route cache.
++.SS "\-Z \-\-context"
++If SELinux enabled print SELinux context.
++.SS "\-T \-\-trim"
++Stop trimming long addresses.
+ .SS delay
+ Netstat will cycle printing through statistics every 
+ .B delay 
+--- net-tools-1.60/netstat.c.old       2006-02-10 11:18:12.000000000 +0100
++++ net-tools-1.60/netstat.c   2006-02-10 11:13:50.000000000 +0100
+@@ -157,6 +157,9 @@
+ int flag_arg = 0;
+ int flag_ver = 0;
+ int flag_selinux = 0;
++int flag_trim = 0;
++
++
+ FILE *procinfo;
+@@ -980,17 +983,21 @@
+                get_sname(htons(local_port), "tcp",
+                          flag_not & FLAG_NUM_PORT));
+-      if ((strlen(local_addr) + strlen(buffer)) >= 27)
+-          local_addr[27 - strlen(buffer) - 1] = '\0';
++      if (!flag_trim) {
++          if ((strlen(local_addr) + strlen(buffer)) >= 27)
++              local_addr[27 - strlen(buffer) - 1] = '\0';
++      }
+       strcat(local_addr, ":");
+       strncat(local_addr, buffer, sizeof(local_addr));
+       local_addr[sizeof(local_addr)-1] = 0;
+       snprintf(buffer, sizeof(buffer), "%s",
+                get_sname(htons(rem_port), "tcp", flag_not & FLAG_NUM_PORT));
+-
+-      if ((strlen(rem_addr) + strlen(buffer)) >= 27)
+-          rem_addr[27 - strlen(buffer) - 1] = '\0';
++      
++      if (!flag_trim) {
++          if ((strlen(rem_addr) + strlen(buffer)) >= 27)
++              rem_addr[27 - strlen(buffer) - 1] = '\0';
++      }
+       strcat(rem_addr, ":");
+       strncat(rem_addr, buffer, sizeof(rem_addr));
+@@ -1776,6 +1783,7 @@
+       {"fib", 0, 0, 'F'},
+       {"groups", 0, 0, 'g'},
+       {"context", 0, 0, 'Z'},
++      {"trim", 0, 0, 'T'},
+       {NULL, 0, 0, 0}
+     };
+@@ -1788,7 +1796,7 @@
+     afname[0] = '\0';
+-    while ((i = getopt_long(argc, argv, "MCFA:acdegphiI::nNorstuVv?wxlZ", longopts, &lop)) != EOF)
++    while ((i = getopt_long(argc, argv, "MCFA:acdegphiI::nNorstuVv?wxlZT", longopts, &lop)) != EOF)
+       switch (i) {
+       case -1:
+           break;
+@@ -1904,6 +1912,10 @@
+           usage();
+       case 's':
+           flag_sta++;
++          break;
++      case 'T':
++          flag_trim++;
++          break;
+       }
+     if(argc == optind + 1) {
diff --git a/packages/net-tools/files/net-tools-1.60-netstat_ulong.patch b/packages/net-tools/files/net-tools-1.60-netstat_ulong.patch
new file mode 100644 (file)
index 0000000..56869dc
--- /dev/null
@@ -0,0 +1,11 @@
+--- net-tools-1.60/netstat.c.netstat_ulong     2004-11-11 14:28:44.000000000 +0100
++++ net-tools-1.60/netstat.c   2004-11-11 14:31:14.099313000 +0100
+@@ -273,7 +273,7 @@
+     strcpy(pn->name,name);
+ }
+-static const char *prg_cache_get(int inode)
++static const char *prg_cache_get(unsigned long inode)
+ {
+     unsigned hi=PRG_HASHIT(inode);
+     struct prg_node *pn;
diff --git a/packages/net-tools/files/net-tools-1.60-note.patch b/packages/net-tools/files/net-tools-1.60-note.patch
new file mode 100644 (file)
index 0000000..4853ccd
--- /dev/null
@@ -0,0 +1,13 @@
+--- net-tools-1.60/man/en_US/hostname.1.note   2004-11-24 12:09:28.000000000 +0100
++++ net-tools-1.60/man/en_US/hostname.1        2004-11-24 12:16:41.121050760 +0100
+@@ -191,6 +191,10 @@
+ ) then root can also set a new NIS domain.
+ .SH FILES
+ .B /etc/hosts
++.B /etc/sysconfig/network
++.SH NOTE
++Note that hostname doesn't change anything permanently. After reboot
++original names from \fI/etc/hosts\fR are used again. 
+ .SH AUTHOR
+ Peter Tobias, <tobias@et-inf.fho-emden.de>
+ .br
diff --git a/packages/net-tools/files/net-tools-1.60-num-ports.patch b/packages/net-tools/files/net-tools-1.60-num-ports.patch
new file mode 100644 (file)
index 0000000..829c9d6
--- /dev/null
@@ -0,0 +1,78 @@
+--- net-tools-1.60/netstat.c.num-ports 2004-11-24 12:19:24.000000000 +0100
++++ net-tools-1.60/netstat.c   2004-11-25 16:00:45.208367104 +0100
+@@ -765,8 +765,8 @@
+       txq = 0L;
+     }
+     safe_strncpy(local_addr, ap->sprint((struct sockaddr *) &localaddr, 
+-                                      flag_not), sizeof(local_addr));
+-    safe_strncpy(rem_addr, ap->sprint((struct sockaddr *) &remaddr, flag_not),
++                                      flag_not & FLAG_NUM_HOST), sizeof(local_addr));
++    safe_strncpy(rem_addr, ap->sprint((struct sockaddr *) &remaddr, flag_not & FLAG_NUM_HOST),
+                sizeof(rem_addr));
+     if (flag_all || (flag_lst && !rem_port) || (!flag_lst && rem_port)) {
+       snprintf(buffer, sizeof(buffer), "%s",
+@@ -921,11 +921,11 @@
+     if (flag_all || (notnull(remaddr) && !flag_lst) || (!notnull(remaddr) && flag_lst))
+     {
+         safe_strncpy(local_addr, ap->sprint((struct sockaddr *) &localaddr, 
+-                                          flag_not), sizeof(local_addr));
++                                          flag_not & FLAG_NUM_HOST), sizeof(local_addr));
+       snprintf(buffer, sizeof(buffer), "%s",
+                get_sname(htons(local_port), "udp",
+                          flag_not & FLAG_NUM_PORT));
+-      if ((strlen(local_addr) + strlen(buffer)) > 22)
++      if ((strlen(local_addr) + strlen(buffer)) >= 27)
+           local_addr[22 - strlen(buffer)] = '\0';
+       strcat(local_addr, ":");
+       strncat(local_addr, buffer, sizeof(local_addr));
+@@ -934,8 +934,8 @@
+       snprintf(buffer, sizeof(buffer), "%s",
+                get_sname(htons(rem_port), "udp", flag_not & FLAG_NUM_PORT));
+         safe_strncpy(rem_addr, ap->sprint((struct sockaddr *) &remaddr, 
+-                                        flag_not), sizeof(rem_addr));
+-      if ((strlen(rem_addr) + strlen(buffer)) > 22)
++                                        flag_not & FLAG_NUM_HOST), sizeof(rem_addr));
++      if ((strlen(rem_addr) + strlen(buffer)) >= 27)
+           rem_addr[22 - strlen(buffer)] = '\0';
+       strcat(rem_addr, ":");
+       strncat(rem_addr, buffer, sizeof(rem_addr));
+@@ -958,7 +958,7 @@
+                        retr, timeout);
+               break;
+           }
+-      printf("udp   %6ld %6ld %-23s %-23s %-12s",
++      printf("udp   %6ld %6ld %-27s %-27s %-12s",
+              rxq, txq, local_addr, rem_addr, udp_state);
+       finish_this_one(uid,inode,timers);
+@@ -1045,8 +1045,8 @@
+                get_sname(htons(local_port), "raw",
+                          flag_not & FLAG_NUM_PORT));
+         safe_strncpy(local_addr, ap->sprint((struct sockaddr *) &localaddr, 
+-                                          flag_not), sizeof(local_addr));
+-      if ((strlen(local_addr) + strlen(buffer)) > 22)
++                                          flag_not & FLAG_NUM_HOST), sizeof(local_addr));
++      if ((strlen(local_addr) + strlen(buffer)) >= 27)
+           local_addr[22 - strlen(buffer)] = '\0';
+       strcat(local_addr, ":");
+       strncat(local_addr, buffer, sizeof(local_addr));
+@@ -1055,8 +1055,8 @@
+       snprintf(buffer, sizeof(buffer), "%s",
+                get_sname(htons(rem_port), "raw", flag_not & FLAG_NUM_PORT));
+         safe_strncpy(rem_addr, ap->sprint((struct sockaddr *) &remaddr, 
+-                                        flag_not), sizeof(rem_addr));
+-      if ((strlen(rem_addr) + strlen(buffer)) > 22)
++                                        flag_not & FLAG_NUM_HOST), sizeof(rem_addr));
++      if ((strlen(rem_addr) + strlen(buffer)) >= 27)
+           rem_addr[22 - strlen(buffer)] = '\0';
+       strcat(rem_addr, ":");
+       strncat(rem_addr, buffer, sizeof(rem_addr));
+@@ -1081,7 +1081,7 @@
+                        retr, timeout);
+               break;
+           }
+-      printf("raw   %6ld %6ld %-23s %-23s %-12d",
++      printf("raw   %6ld %6ld %-27s %-27s %-12d",
+              rxq, txq, local_addr, rem_addr, state);
+       finish_this_one(uid,inode,timers);
diff --git a/packages/net-tools/files/net-tools-1.60-overflow.patch b/packages/net-tools/files/net-tools-1.60-overflow.patch
new file mode 100644 (file)
index 0000000..d363149
--- /dev/null
@@ -0,0 +1,63 @@
+diff -ur net-tools-1.60.orig/netstat.c net-tools-1.60/netstat.c
+--- net-tools-1.60.orig/netstat.c      2004-04-07 11:47:05.000000000 -0400
++++ net-tools-1.60/netstat.c   2004-04-07 16:47:15.000000000 -0400
+@@ -777,7 +777,8 @@
+           local_addr[22 - strlen(buffer)] = '\0';
+       strcat(local_addr, ":");
+-      strcat(local_addr, buffer);
++      strncat(local_addr, buffer, sizeof(local_addr));
++      local_addr[sizeof(local_addr)-1] = 0;
+       snprintf(buffer, sizeof(buffer), "%s",
+                get_sname(htons(rem_port), "tcp", flag_not & FLAG_NUM_PORT));
+@@ -785,7 +786,8 @@
+           rem_addr[22 - strlen(buffer)] = '\0';
+       strcat(rem_addr, ":");
+-      strcat(rem_addr, buffer);
++      strncat(rem_addr, buffer, sizeof(rem_addr));
++      rem_addr[sizeof(rem_addr)-1] = 0;
+       timers[0] = '\0';
+       if (flag_opt)
+@@ -926,7 +928,8 @@
+       if ((strlen(local_addr) + strlen(buffer)) > 22)
+           local_addr[22 - strlen(buffer)] = '\0';
+       strcat(local_addr, ":");
+-      strcat(local_addr, buffer);
++      strncat(local_addr, buffer, sizeof(local_addr));
++      local_addr[sizeof(local_addr)-1] = 0;
+       snprintf(buffer, sizeof(buffer), "%s",
+                get_sname(htons(rem_port), "udp", flag_not & FLAG_NUM_PORT));
+@@ -935,7 +938,8 @@
+       if ((strlen(rem_addr) + strlen(buffer)) > 22)
+           rem_addr[22 - strlen(buffer)] = '\0';
+       strcat(rem_addr, ":");
+-      strcat(rem_addr, buffer);
++      strncat(rem_addr, buffer, sizeof(rem_addr));
++      rem_addr[sizeof(rem_addr)-1] = 0;
+       timers[0] = '\0';
+       if (flag_opt)
+@@ -1045,7 +1049,8 @@
+       if ((strlen(local_addr) + strlen(buffer)) > 22)
+           local_addr[22 - strlen(buffer)] = '\0';
+       strcat(local_addr, ":");
+-      strcat(local_addr, buffer);
++      strncat(local_addr, buffer, sizeof(local_addr));
++      local_addr[sizeof(local_addr)-1] = 0;
+       snprintf(buffer, sizeof(buffer), "%s",
+                get_sname(htons(rem_port), "raw", flag_not & FLAG_NUM_PORT));
+@@ -1054,7 +1059,8 @@
+       if ((strlen(rem_addr) + strlen(buffer)) > 22)
+           rem_addr[22 - strlen(buffer)] = '\0';
+       strcat(rem_addr, ":");
+-      strcat(rem_addr, buffer);
++      strncat(rem_addr, buffer, sizeof(rem_addr));
++      rem_addr[sizeof(rem_addr)-1] = 0;
+       timers[0] = '\0';
+       if (flag_opt)
diff --git a/packages/net-tools/files/net-tools-1.60-parse.patch b/packages/net-tools/files/net-tools-1.60-parse.patch
new file mode 100644 (file)
index 0000000..25890f1
--- /dev/null
@@ -0,0 +1,70 @@
+--- net-tools-1.60/statistics.c.parse  2004-09-06 10:45:35.595130240 +0200
++++ net-tools-1.60/statistics.c        2004-09-06 10:43:11.000000000 +0200
+@@ -289,7 +289,7 @@
+       return &dummytab;
+ }
+-void process_fd(FILE *f)
++void process_fd(FILE *f,int file_desc)   // added file_desc to show propriate error mesg
+ {
+     char buf1[1024], buf2[1024];
+     char *sp, *np, *p;
+@@ -297,12 +297,16 @@
+       int endflag;
+       struct tabtab *tab;
++      if (strcmp(buf1,"\n") == 0)  // cut leading break
++          if (!fgets(buf1, sizeof buf1, f))
++          break;
+       if (!fgets(buf2, sizeof buf2, f))
+           break;
++
+       sp = strchr(buf1, ':');
+-      np = strchr(buf2, ':');
+-      if (!np || !sp)
+-          goto formaterr;
++      np = strchr(buf2, ':'); 
++      if (!np || !sp) 
++          goto formaterr; 
+       *sp = '\0';
+       tab = newtable(snmptabs, buf1);
+@@ -333,7 +337,12 @@
+   return;
+   
+ formaterr:
+-  perror(_("error parsing /proc/net/snmp"));
++ switch(file_desc) {
++    case 0: perror(_("error parsing /proc/net/snmp"));
++      break;
++    case 1: perror(_("error parsing /proc/net/netstat"));
++      break;
++  }
+   return;
+ }
+@@ -343,13 +352,13 @@
+     FILE *f;
+     f_raw = flag_raw; f_tcp = flag_tcp; f_udp = flag_udp;
+-    
++
+     f = fopen("/proc/net/snmp", "r");
+     if (!f) {
+       perror(_("cannot open /proc/net/snmp"));
+       return(1);
+     }
+-    process_fd(f);
++    process_fd(f,0);
+     if (ferror(f)) {
+       perror("/proc/net/snmp");
+@@ -361,7 +370,7 @@
+     f = fopen("/proc/net/netstat", "r");
+     if (f) {
+-      process_fd(f);
++      process_fd(f,1);
+         if (ferror(f)) {
+         perror("/proc/net/netstat");
diff --git a/packages/net-tools/files/net-tools-1.60-pie.patch b/packages/net-tools/files/net-tools-1.60-pie.patch
new file mode 100644 (file)
index 0000000..d4496ff
--- /dev/null
@@ -0,0 +1,13 @@
+--- net-tools-1.60/Makefile.pie        2001-04-15 16:34:31.000000000 +0200
++++ net-tools-1.60/Makefile    2005-02-28 12:41:15.337127680 +0100
+@@ -113,8 +113,8 @@
+ NET_LIB = $(NET_LIB_PATH)/lib$(NET_LIB_NAME).a
+-CFLAGS        = $(COPTS) -I. -idirafter ./include/ -I$(NET_LIB_PATH)
+-LDFLAGS       = $(LOPTS) -L$(NET_LIB_PATH)
++CFLAGS        += $(COPTS) -I. -idirafter ./include/ -I$(NET_LIB_PATH)
++LDFLAGS       += $(LOPTS) -L$(NET_LIB_PATH)
+ SUBDIRS       = man/ $(NET_LIB_PATH)/
diff --git a/packages/net-tools/files/net-tools-1.60-return.patch b/packages/net-tools/files/net-tools-1.60-return.patch
new file mode 100644 (file)
index 0000000..8ef10f5
--- /dev/null
@@ -0,0 +1,28 @@
+--- net-tools-1.60/nameif.c.return     2004-08-03 18:01:37.000000000 +0900
++++ net-tools-1.60/nameif.c    2004-08-03 18:03:37.000000000 +0900
+@@ -27,6 +27,7 @@
+ const char *fname = default_conf; 
+ int use_syslog; 
+ int ctl_sk = -1; 
++int frag = 0;
+ void err(char *msg) 
+ { 
+@@ -288,13 +289,15 @@
+       while (clist) { 
+               struct change *ch = clist;
+               clist = clist->next;
+-              if (!ch->found)
++              if (!ch->found){
+                       warning(_("interface '%s' not found"), ch->ifname); 
++                      frag = 1;
++              }
+               free(ch); 
+       }
+       if (use_syslog)
+               closelog();
+-      return 0;
++      return frag;
+ } 
diff --git a/packages/net-tools/files/net-tools-1.60-selinux.patch b/packages/net-tools/files/net-tools-1.60-selinux.patch
new file mode 100644 (file)
index 0000000..d026669
--- /dev/null
@@ -0,0 +1,205 @@
+--- net-tools-1.60/Makefile~   2005-12-24 06:56:57.000000000 -0500
++++ net-tools-1.60/Makefile    2005-12-29 16:54:06.000000000 -0500
+@@ -113,6 +113,12 @@
+ NET_LIB = $(NET_LIB_PATH)/lib$(NET_LIB_NAME).a
++ifeq ($(HAVE_SELINUX),1)
++LDFLAGS += -lselinux
++CFLAGS += -DHAVE_SELINUX
++else
++endif
++
+ CFLAGS        += $(COPTS) -I. -idirafter ./include/ -I$(NET_LIB_PATH)
+ LDFLAGS       += $(LOPTS) -L$(NET_LIB_PATH)
+--- net-tools-1.60/netstat.c~  2005-12-24 06:56:57.000000000 -0500
++++ net-tools-1.60/netstat.c   2005-12-29 16:54:07.000000000 -0500
+@@ -86,6 +86,11 @@
+ #include <net/if.h>
+ #include <dirent.h>
++#if HAVE_SELINUX
++#include <selinux/selinux.h>
++#else
++#define security_context_t char*
++#endif
+ #include "net-support.h"
+ #include "pathnames.h"
+ #include "version.h"
+@@ -96,6 +101,7 @@
+ #include "util.h"
+ #define PROGNAME_WIDTH 20
++#define SELINUX_WIDTH 50
+ #if !defined(s6_addr32) && defined(in6a_words)
+ #define s6_addr32 in6a_words  /* libinet6                     */
+@@ -150,6 +156,7 @@
+ int flag_prg = 0;
+ int flag_arg = 0;
+ int flag_ver = 0;
++int flag_selinux = 0;
+ FILE *procinfo;
+@@ -213,12 +220,17 @@
+ #define PROGNAME_WIDTH1(s) PROGNAME_WIDTH2(s)
+ #define PROGNAME_WIDTH2(s) #s
++#define SELINUX_WIDTHs SELINUX_WIDTH1(SELINUX_WIDTH)
++#define SELINUX_WIDTH1(s) SELINUX_WIDTH2(s)
++#define SELINUX_WIDTH2(s) #s
++
+ #define PRG_HASH_SIZE 211
+ static struct prg_node {
+     struct prg_node *next;
+     int inode;
+     char name[PROGNAME_WIDTH];
++    char scon[SELINUX_WIDTH];
+ } *prg_hash[PRG_HASH_SIZE];
+ static char prg_cache_loaded = 0;
+@@ -226,9 +238,12 @@
+ #define PRG_HASHIT(x) ((x) % PRG_HASH_SIZE)
+ #define PROGNAME_BANNER "PID/Program name"
++#define SELINUX_BANNER "Security Context"
+ #define print_progname_banner() do { if (flag_prg) printf("%-" PROGNAME_WIDTHs "s"," " PROGNAME_BANNER); } while (0)
++#define print_selinux_banner() do { if (flag_selinux) printf("%-" SELINUX_WIDTHs "s"," " SELINUX_BANNER); } while (0)
++
+ #define PRG_LOCAL_ADDRESS "local_address"
+ #define PRG_INODE      "inode"
+ #define PRG_SOCKET_PFX    "socket:["
+@@ -250,7 +265,7 @@
+ /* NOT working as of glibc-2.0.7: */
+ #undef  DIRENT_HAVE_D_TYPE_WORKS
+-static void prg_cache_add(int inode, char *name)
++static void prg_cache_add(int inode, char *name, char *scon)
+ {
+     unsigned hi = PRG_HASHIT(inode);
+     struct prg_node **pnp,*pn;
+@@ -271,6 +286,14 @@
+     if (strlen(name)>sizeof(pn->name)-1) 
+       name[sizeof(pn->name)-1]='\0';
+     strcpy(pn->name,name);
++
++    {
++       int len=(strlen(scon)-sizeof(pn->scon))+1;
++       if (len > 0) 
++           strcpy(pn->scon,&scon[len+1]);
++       else
++         strcpy(pn->scon,scon);
++    }
+ }
+ static const char *prg_cache_get(unsigned long inode)
+@@ -283,6 +306,16 @@
+     return("-");
+ }
++static const char *prg_cache_get_con(unsigned long inode)
++{
++    unsigned hi=PRG_HASHIT(inode);
++    struct prg_node *pn;
++
++    for (pn=prg_hash[hi];pn;pn=pn->next)
++          if (pn->inode==inode) return(pn->scon);
++    return("-");
++}
++
+ static void prg_cache_clear(void)
+ {
+     struct prg_node **pnp,*pn;
+@@ -348,6 +381,7 @@
+     const char *cs,*cmdlp;
+     DIR *dirproc=NULL,*dirfd=NULL;
+     struct dirent *direproc,*direfd;
++    security_context_t scon=NULL;
+     if (prg_cache_loaded || !flag_prg) return;
+     prg_cache_loaded=1;
+@@ -415,7 +449,15 @@
+           }
+           snprintf(finbuf, sizeof(finbuf), "%s/%s", direproc->d_name, cmdlp);
+-          prg_cache_add(inode, finbuf);
++#if HAVE_SELINUX
++          if (getpidcon(atoi(direproc->d_name), &scon) == -1) {
++                  scon=strdup("-");
++          }
++          prg_cache_add(inode, finbuf, scon);
++          freecon(scon);
++#else
++          prg_cache_add(inode, finbuf, "-");
++#endif
+       }
+       closedir(dirfd); 
+       dirfd = NULL;
+@@ -1385,6 +1428,8 @@
+       printf("-      ");
+     if (flag_prg)
+       printf("%-" PROGNAME_WIDTHs "s",(has & HAS_INODE?prg_cache_get(inode):"-"));
++    if (flag_selinux)
++      printf("%-" SELINUX_WIDTHs "s",(has & HAS_INODE?prg_cache_get_con(inode):"-"));
+     puts(path);
+ }
+@@ -1403,6 +1448,7 @@
+     printf(_("\nProto RefCnt Flags       Type       State         I-Node"));
+     print_progname_banner();
++    print_selinux_banner();
+     printf(_(" Path\n"));     /* xxx */
+     {
+@@ -1682,6 +1728,7 @@
+     fprintf(stderr, _("        -o, --timers               display timers\n"));
+     fprintf(stderr, _("        -F, --fib                  display Forwarding Information Base (default)\n"));
+     fprintf(stderr, _("        -C, --cache                display routing cache instead of FIB\n\n"));
++    fprintf(stderr, _("        -Z, --context              display SELinux security context for sockets\n\n"));
+     fprintf(stderr, _("  <Iface>: Name of interface to monitor/list.\n"));
+     fprintf(stderr, _("  <Socket>={-t|--tcp} {-u|--udp} {-w|--raw} {-x|--unix} --ax25 --ipx --netrom\n"));
+@@ -1729,6 +1776,7 @@
+       {"cache", 0, 0, 'C'},
+       {"fib", 0, 0, 'F'},
+       {"groups", 0, 0, 'g'},
++      {"context", 0, 0, 'Z'},
+       {NULL, 0, 0, 0}
+     };
+@@ -1741,7 +1789,7 @@
+     afname[0] = '\0';
+-    while ((i = getopt_long(argc, argv, "MCFA:acdegphiI::nNorstuVv?wxl", longopts, &lop)) != EOF)
++    while ((i = getopt_long(argc, argv, "MCFA:acdegphiI::nNorstuVv?wxlZ", longopts, &lop)) != EOF)
+       switch (i) {
+       case -1:
+           break;
+@@ -1838,6 +1886,20 @@
+           if (aftrans_opt("unix"))
+               exit(1);
+           break;
++      case 'Z':
++#if HAVE_SELINUX
++          if (is_selinux_enabled() <= 0) {
++              fprintf(stderr, _("SELinux is not enabled on this machine.\n"));
++              exit(1);
++          }
++          flag_prg++;
++          flag_selinux++;
++#else
++            fprintf(stderr, _("SELinux is not enabled for this application.\n"));
++          exit(1);
++#endif
++
++          break;
+       case '?':
+       case 'h':
+           usage();
diff --git a/packages/net-tools/files/net-tools-1.60-siunits.patch b/packages/net-tools/files/net-tools-1.60-siunits.patch
new file mode 100644 (file)
index 0000000..cf6d89c
--- /dev/null
@@ -0,0 +1,80 @@
+--- net-tools-1.60/lib/interface.c.siunits     2004-03-14 12:11:22.000000000 -0600
++++ net-tools-1.60/lib/interface.c     2004-03-14 12:27:31.990679464 -0600
+@@ -262,7 +262,7 @@
+              &ife->stats.tx_compressed);
+       break;
+     case 2:
+-      sscanf(bp, "%llu %llu %lu %lu %lu %lu %llu %llu %lu %lu %lu %lu %lu",
++      sscanf(bp, "%Lu %llu %lu %lu %lu %lu %Lu %Lu %lu %lu %lu %lu %lu",
+              &ife->stats.rx_bytes,
+              &ife->stats.rx_packets,
+              &ife->stats.rx_errors,
+@@ -280,7 +280,7 @@
+       ife->stats.rx_multicast = 0;
+       break;
+     case 1:
+-      sscanf(bp, "%llu %lu %lu %lu %lu %llu %lu %lu %lu %lu %lu",
++      sscanf(bp, "%Lu %lu %lu %lu %lu %Lu %lu %lu %lu %lu %lu",
+              &ife->stats.rx_packets,
+              &ife->stats.rx_errors,
+              &ife->stats.rx_dropped,
+@@ -675,8 +675,8 @@
+     int hf;
+     int can_compress = 0;
+     unsigned long long rx, tx, short_rx, short_tx;
+-    char Rext[5]="b";
+-    char Text[5]="b";
++    const char *Rext = "b";
++    const char *Text = "b";
+ #if HAVE_AFIPX
+     static struct aftype *ipxtype = NULL;
+@@ -882,10 +882,44 @@
+       tx = ptr->stats.tx_bytes;
+       short_rx = rx * 10;  
+       short_tx = tx * 10;
+-      if (rx > 1048576) { short_rx /= 1048576;  strcpy(Rext, "Mb"); }
+-      else if (rx > 1024) { short_rx /= 1024;  strcpy(Rext, "Kb"); }
+-      if (tx > 1048576) { short_tx /= 1048576;  strcpy(Text, "Mb"); }
+-      else if (tx > 1024) { short_tx /= 1024;  strcpy(Text, "Kb"); }
++      if (rx > 1152921504606846976ull) {
++          short_rx /= 1152921504606846976ull;
++          Rext = "EiB";
++      } else if (rx > 1125899906842624ull) {
++          short_rx /= 1125899906842624ull;
++          Rext = "PiB";
++      } else if (rx > 1099511627776ull) {
++          short_rx /= 1099511627776ull;
++          Rext = "TiB";
++      } else if (rx > 1073741824ull) {
++          short_rx /= 1073741824ull;
++          Rext = "GiB";
++      } else if (rx > 1048576) {
++          short_rx /= 1048576;
++          Rext = "MiB";
++      } else if (rx > 1024) {
++          short_rx /= 1024;
++          Rext = "KiB";
++      }
++      if (tx > 1152921504606846976ull) {
++          short_tx /= 1152921504606846976ull;
++          Text = "EiB";
++      } else if (tx > 1125899906842624ull) {
++          short_tx /= 1125899906842624ull;
++          Text = "PiB";
++      } else if (tx > 1099511627776ull) {
++          short_tx /= 1099511627776ull;
++          Text = "TiB";
++      } else if (tx > 1073741824ull) {
++          short_tx /= 1073741824ull;
++          Text = "GiB";
++      } else if (tx > 1048576) {
++          short_tx /= 1048576;
++          Text = "MiB";
++      } else if (tx > 1024) {
++          short_tx /= 1024;
++          Text = "KiB";
++      }
+       printf("          ");
+       printf(_("TX packets:%llu errors:%lu dropped:%lu overruns:%lu carrier:%lu\n"),
diff --git a/packages/net-tools/files/net-tools-1.60-statalias.patch b/packages/net-tools/files/net-tools-1.60-statalias.patch
new file mode 100644 (file)
index 0000000..7c74f74
--- /dev/null
@@ -0,0 +1,15 @@
+--- net-tools-1.60/lib/interface.c.statalias   2005-01-07 12:49:14.084104032 +0100
++++ net-tools-1.60/lib/interface.c     2005-01-07 12:49:38.527388088 +0100
+@@ -395,9 +395,11 @@
+       char *s, name[IFNAMSIZ];
+       s = get_name(name, buf);    
+       get_dev_fields(s, ife);
+-      ife->statistics_valid = 1;
+       if (target && !strcmp(target,name))
++      {
++              ife->statistics_valid = 1;
+               break;
++      }
+     }
+     if (ferror(fh)) {
+       perror(_PATH_PROCNET_DEV);
diff --git a/packages/net-tools/files/net-tools-1.60-statistics.patch b/packages/net-tools/files/net-tools-1.60-statistics.patch
new file mode 100644 (file)
index 0000000..d3a5649
--- /dev/null
@@ -0,0 +1,65 @@
+--- net-tools-1.60/statistics.c.tcpdata        2005-04-26 10:38:10.000000000 +0200
++++ net-tools-1.60/statistics.c        2005-04-26 10:36:19.000000000 +0200
+@@ -1,6 +1,6 @@
+ /*
+  * Copyright 1997,1999,2000 Andi Kleen. Subject to the GPL. 
+- * $Id: statistics.c,v 1.14 2001/02/02 18:01:23 pb Exp $
++ * $Id: statistics.c,v 1.17 2002/04/28 15:41:01 ak Exp $
+  * 19980630 - i18n - Arnaldo Carvalho de Melo <acme@conectiva.com.br> 
+  * 19981113 - i18n fixes - Arnaldo Carvalho de Melo <acme@conectiva.com.br> 
+  * 19990101 - added net/netstat, -t, -u, -w supprt - Bernd Eckenfels 
+@@ -185,6 +185,44 @@
+                           "directly queued to user"), opt_number },
+     { "SockMallocOOM", N_("Ran %lu times out of system memory during " 
+                         "packet sending"), opt_number }, 
++     { "TCPPureAcks", N_("%u acknowledgments not containing data received"), opt_number },
++     { "TCPHPAcks", N_("%u predicted acknowledgments"), opt_number },
++     { "TCPRenoRecovery", N_("%u times recovered from packet loss due to fast retransmit"), opt_number },
++     { "TCPSackRecovery", N_("%u times recovered from packet loss due to SACK data"), opt_number },
++     { "TCPSACKReneging", N_("%u bad SACKs received"), opt_number },
++     { "TCPFACKReorder", N_("Detected reordering %u times using FACK"), opt_number },
++     { "TCPSACKReorder", N_("Detected reordering %u times using SACK"), opt_number },
++     { "TCPTSReorder", N_("Detected reordering %u times using time stamp"), opt_number },
++     { "TCPRenoReorder", N_("Detected reordering %u times using reno fast retransmit"), opt_number },
++     { "TCPFullUndo", N_("%u congestion windows fully recovered"), opt_number }, 
++     { "TCPPartialUndo", N_("%u congestion windows partially recovered using Hoe heuristic"), opt_number },
++     { "TCPDSackUndo", N_("%u congestion window recovered using DSACK"), opt_number },
++     { "TCPLossUndo", N_("%u congestion windows recovered after partial ack"), opt_number },
++     { "TCPLostRetransmits", N_("%u retransmits lost"), opt_number },
++     { "TCPRenoFailures",  N_("%u timeouts after reno fast retransmit"), opt_number },
++     { "TCPSackFailures",  N_("%u timeouts after SACK recovery"), opt_number },
++     { "TCPLossFailures",  N_("%u timeouts in loss state"), opt_number },
++     { "TCPFastRetrans", N_("%u fast retransmits"), opt_number },
++     { "TCPForwardRetrans", N_("%u forward retransmits"), opt_number }, 
++     { "TCPSlowStartRetrans", N_("%u retransmits in slow start"), opt_number },
++     { "TCPTimeouts", N_("%u other TCP timeouts"), opt_number },
++     { "TCPRenoRecoveryFailed", N_("%u reno fast retransmits failed"), opt_number },
++     { "TCPSackRecoveryFail", N_("%u sack retransmits failed"), opt_number },
++     { "TCPSchedulerFailed", N_("%u times receiver scheduled too late for direct processing"), opt_number },
++     { "TCPRcvCollapsed", N_("%u packets collapsed in receive queue due to low socket buffer"), opt_number },
++     { "TCPDSACKOldSent", N_("%u DSACKs sent for old packets"), opt_number },
++     { "TCPDSACKOfoSent", N_("%u DSACKs sent for out of order packets"), opt_number },
++     { "TCPDSACKRecv", N_("%u DSACKs received"), opt_number },
++     { "TCPDSACKOfoRecv", N_("%u DSACKs for out of order packets received"), opt_number },
++     { "TCPAbortOnSyn", N_("%u connections reset due to unexpected SYN"), opt_number },
++     { "TCPAbortOnData", N_("%u connections reset due to unexpected data"), opt_number },
++     { "TCPAbortOnClose", N_("%u connections reset due to early user close"), opt_number },
++     { "TCPAbortOnMemory", N_("%u connections aborted due to memory pressure"), opt_number },
++     { "TCPAbortOnTimeout", N_("%u connections aborted due to timeout"), opt_number },
++     { "TCPAbortOnLinger", N_("%u connections aborted after user close in linger timeout"), opt_number },
++     { "TCPAbortFailed", N_("%u times unabled to send RST due to no memory"), opt_number }, 
++     { "TCPMemoryPressures", N_("TCP ran low on memory %u times"), opt_number }, 
++     { "TCPLoss", N_("%u TCP data loss events") },
+ };
+ struct tabtab {
+@@ -222,7 +260,8 @@
+           ent = bsearch(&key, tab->tab, tab->size / sizeof(struct entry),
+                         sizeof(struct entry), cmpentries);
+     if (!ent) {                       /* try our best */
+-      printf("%*s%s: %d\n", states[state].indent, "", title, val);
++      if (val) 
++              printf("%*s%s: %d\n", states[state].indent, "", title, val);
+       return;
+     }
+     type = ent->type;
diff --git a/packages/net-tools/files/net-tools-1.60-stdo.patch b/packages/net-tools/files/net-tools-1.60-stdo.patch
new file mode 100644 (file)
index 0000000..4c9d93e
--- /dev/null
@@ -0,0 +1,11 @@
+diff -urN net-tools-1.60/mii-tool.c net-tools-1.60.new/mii-tool.c
+--- net-tools-1.60/mii-tool.c  2000-05-21 16:31:17.000000000 +0200
++++ net-tools-1.60.new/mii-tool.c      2005-03-29 13:00:18.000000000 +0200
+@@ -302,6 +302,7 @@
+           printf("\n  link partner:%s", media_list(lkpar, 0));
+       printf("\n");
+     }
++    fflush(stdout);
+     return 0;
+ }
diff --git a/packages/net-tools/files/net-tools-1.60-trailingblank.patch b/packages/net-tools/files/net-tools-1.60-trailingblank.patch
new file mode 100644 (file)
index 0000000..8c75228
--- /dev/null
@@ -0,0 +1,26 @@
+--- net-tools-1.60/hostname.c.trailingblank    2001-04-08 19:04:23.000000000 +0200
++++ net-tools-1.60/hostname.c  2003-08-19 14:21:17.000000000 +0200
+@@ -153,13 +153,19 @@
+     switch (c) {
+     case 'a':
+-      while (hp->h_aliases[0])
+-          printf("%s ", *hp->h_aliases++);
++      while (hp->h_aliases[0]) {
++          printf("%s", *hp->h_aliases++);
++          if (hp->h_aliases[0])
++                printf(" ");
++      }
+       printf("\n");
+       break;
+     case 'i':
+-      while (hp->h_addr_list[0])
+-          printf("%s ", inet_ntoa(*(struct in_addr *) *hp->h_addr_list++));
++      while (hp->h_addr_list[0]) {
++          printf("%s", inet_ntoa(*(struct in_addr *) *hp->h_addr_list++));
++          if (hp->h_addr_list[0])
++                printf(" ");
++      }
+       printf("\n");
+       break;
+     case 'd':
diff --git a/packages/net-tools/files/net-tools-1.60-trim_iface.patch b/packages/net-tools/files/net-tools-1.60-trim_iface.patch
new file mode 100644 (file)
index 0000000..150722c
--- /dev/null
@@ -0,0 +1,31 @@
+--- net-tools-1.60/ifconfig.c.old      2005-03-30 10:14:03.000000000 +0200
++++ net-tools-1.60/ifconfig.c  2005-03-30 10:40:50.000000000 +0200
+@@ -177,7 +177,7 @@
+ static void usage(void)
+ {
+-    fprintf(stderr, _("Usage:\n  ifconfig [-a] [-i] [-v] [-s] <interface> [[<AF>] <address>]\n"));
++    fprintf(stderr, _("Usage:\n  ifconfig [-a] [-v] [-s] <interface> [[<AF>] <address>]\n"));
+ #if HAVE_AFINET
+     fprintf(stderr, _("  [add <address>[/<prefixlen>]]\n"));
+     fprintf(stderr, _("  [del <address>[/<prefixlen>]]\n"));
+--- net-tools-1.60/lib/interface.c.old 2005-03-30 10:14:03.000000000 +0200
++++ net-tools-1.60/lib/interface.c     2005-03-30 11:05:38.000000000 +0200
+@@ -620,7 +620,7 @@
+ void ife_print_short(struct interface *ptr)
+ {
+-    printf("%-9.9s ", ptr->name);
++    printf("%-9s ", ptr->name);
+     printf("%5d %3d ", ptr->mtu, ptr->metric);
+     /* If needed, display the interface statistics. */
+     if (ptr->statistics_valid) {
+@@ -711,7 +711,7 @@
+     if (hw == NULL)
+       hw = get_hwntype(-1);
+-    printf(_("%-9.9s Link encap:%s  "), ptr->name, hw->title);
++    printf(_("%-9s Link encap:%s  "), ptr->name, hw->title);
+     /* For some hardware types (eg Ash, ATM) we don't print the 
+        hardware address if it's null.  */
+     if (hw->print != NULL && (! (hw_null_address(hw, ptr->hwaddr) &&
diff --git a/packages/net-tools/files/net-tools-1.60-trunc.patch b/packages/net-tools/files/net-tools-1.60-trunc.patch
new file mode 100644 (file)
index 0000000..9ff3c0b
--- /dev/null
@@ -0,0 +1,42 @@
+--- net-tools-1.60/netstat.c.trunc     2004-08-31 12:42:08.595426960 +0200
++++ net-tools-1.60/netstat.c   2004-08-31 12:59:55.766192344 +0200
+@@ -773,8 +773,8 @@
+                get_sname(htons(local_port), "tcp",
+                          flag_not & FLAG_NUM_PORT));
+-      if ((strlen(local_addr) + strlen(buffer)) > 22)
+-          local_addr[22 - strlen(buffer)] = '\0';
++      if ((strlen(local_addr) + strlen(buffer)) >= 27)
++          local_addr[27 - strlen(buffer) - 1] = '\0';
+       strcat(local_addr, ":");
+       strncat(local_addr, buffer, sizeof(local_addr));
+@@ -782,8 +782,8 @@
+       snprintf(buffer, sizeof(buffer), "%s",
+                get_sname(htons(rem_port), "tcp", flag_not & FLAG_NUM_PORT));
+-      if ((strlen(rem_addr) + strlen(buffer)) > 22)
+-          rem_addr[22 - strlen(buffer)] = '\0';
++      if ((strlen(rem_addr) + strlen(buffer)) >= 27)
++          rem_addr[27 - strlen(buffer) - 1] = '\0';
+       strcat(rem_addr, ":");
+       strncat(rem_addr, buffer, sizeof(rem_addr));
+@@ -816,7 +816,7 @@
+                        timer_run, (double) time_len / HZ, retr, timeout);
+               break;
+           }
+-      printf("tcp   %6ld %6ld %-23s %-23s %-12s",
++      printf("tcp   %6ld %6ld %-27s %-27s %-12s",
+              rxq, txq, local_addr, rem_addr, _(tcp_state[state]));
+       finish_this_one(uid,inode,timers);
+@@ -1770,7 +1770,7 @@
+             else
+               printf(_("(w/o servers)"));
+           }
+-          printf(_("\nProto Recv-Q Send-Q Local Address           Foreign Address         State      "));     /* xxx */
++          printf(_("\nProto Recv-Q Send-Q Local Address               Foreign Address             State      "));     /* xxx */
+           if (flag_exp > 1)
+               printf(_(" User       Inode     "));
+           print_progname_banner();
diff --git a/packages/net-tools/files/net-tools-1.60-ulong.patch b/packages/net-tools/files/net-tools-1.60-ulong.patch
new file mode 100644 (file)
index 0000000..bc7df29
--- /dev/null
@@ -0,0 +1,215 @@
+diff -urN net-tools-1.60/statistics.c net-tools-1.60-patch/statistics.c
+--- net-tools-1.60/statistics.c        2001-02-02 10:01:23.000000000 -0800
++++ net-tools-1.60-patch/statistics.c  2004-06-15 11:09:44.000000000 -0700
+@@ -63,54 +63,54 @@
+ struct entry Iptab[] =
+ {
+     {"Forwarding", N_("Forwarding is %s"), i_forward | I_STATIC},
+-    {"DefaultTTL", N_("Default TTL is %u"), number | I_STATIC},
+-    {"InReceives", N_("%u total packets received"), number},
+-    {"InHdrErrors", N_("%u with invalid headers"), opt_number},
+-    {"InAddrErrors", N_("%u with invalid addresses"), opt_number},
+-    {"ForwDatagrams", N_("%u forwarded"), number},
+-    {"InUnknownProtos", N_("%u with unknown protocol"), opt_number},
+-    {"InDiscards", N_("%u incoming packets discarded"), number},
+-    {"InDelivers", N_("%u incoming packets delivered"), number},
+-    {"OutRequests", N_("%u requests sent out"), number},      /*? */
+-    {"OutDiscards", N_("%u outgoing packets dropped"), opt_number},
+-    {"OutNoRoutes", N_("%u dropped because of missing route"), opt_number},
+-    {"ReasmTimeout", N_("%u fragments dropped after timeout"), opt_number},
+-    {"ReasmReqds", N_("%u reassemblies required"), opt_number},       /* ? */
+-    {"ReasmOKs", N_("%u packets reassembled ok"), opt_number},
+-    {"ReasmFails", N_("%u packet reassembles failed"), opt_number},
+-    {"FragOKs", N_("%u fragments received ok"), opt_number},
+-    {"FragFails", N_("%u fragments failed"), opt_number},
+-    {"FragCreates", N_("%u fragments created"), opt_number}
++    {"DefaultTTL", N_("Default TTL is %lu"), number | I_STATIC},
++    {"InReceives", N_("%lu total packets received"), number},
++    {"InHdrErrors", N_("%lu with invalid headers"), opt_number},
++    {"InAddrErrors", N_("%lu with invalid addresses"), opt_number},
++    {"ForwDatagrams", N_("%lu forwarded"), number},
++    {"InUnknownProtos", N_("%lu with unknown protocol"), opt_number},
++    {"InDiscards", N_("%lu incoming packets discarded"), number},
++    {"InDelivers", N_("%lu incoming packets delivered"), number},
++    {"OutRequests", N_("%lu requests sent out"), number},     /*? */
++    {"OutDiscards", N_("%lu outgoing packets dropped"), opt_number},
++    {"OutNoRoutes", N_("%lu dropped because of missing route"), opt_number},
++    {"ReasmTimeout", N_("%lu fragments dropped after timeout"), opt_number},
++    {"ReasmReqds", N_("%lu reassemblies required"), opt_number},      /* ? */
++    {"ReasmOKs", N_("%lu packets reassembled ok"), opt_number},
++    {"ReasmFails", N_("%lu packet reassembles failed"), opt_number},
++    {"FragOKs", N_("%lu fragments received ok"), opt_number},
++    {"FragFails", N_("%lu fragments failed"), opt_number},
++    {"FragCreates", N_("%lu fragments created"), opt_number}
+ };
+ struct entry Icmptab[] =
+ {
+-    {"InMsgs", N_("%u ICMP messages received"), number},
+-    {"InErrors", N_("%u input ICMP message failed."), number},
+-    {"InDestUnreachs", N_("destination unreachable: %u"), i_inp_icmp | I_TITLE},
+-    {"InTimeExcds", N_("timeout in transit: %u"), i_inp_icmp | I_TITLE},
+-    {"InParmProbs", N_("wrong parameters: %u"), i_inp_icmp | I_TITLE},        /*? */
+-    {"InSrcQuenchs", N_("source quenches: %u"), i_inp_icmp | I_TITLE},
+-    {"InRedirects", N_("redirects: %u"), i_inp_icmp | I_TITLE},
+-    {"InEchos", N_("echo requests: %u"), i_inp_icmp | I_TITLE},
+-    {"InEchoReps", N_("echo replies: %u"), i_inp_icmp | I_TITLE},
+-    {"InTimestamps", N_("timestamp request: %u"), i_inp_icmp | I_TITLE},
+-    {"InTimestampReps", N_("timestamp reply: %u"), i_inp_icmp | I_TITLE},
+-    {"InAddrMasks", N_("address mask request: %u"), i_inp_icmp | I_TITLE},    /*? */
+-    {"InAddrMaskReps", N_("address mask replies: %u"), i_inp_icmp | I_TITLE}, /*? */
+-    {"OutMsgs", N_("%u ICMP messages sent"), number},
+-    {"OutErrors", N_("%u ICMP messages failed"), number},
+-    {"OutDestUnreachs", N_("destination unreachable: %u"), i_outp_icmp | I_TITLE},
+-    {"OutTimeExcds", N_("time exceeded: %u"), i_outp_icmp | I_TITLE},
+-    {"OutParmProbs", N_("wrong parameters: %u"), i_outp_icmp | I_TITLE},      /*? */
+-    {"OutSrcQuenchs", N_("source quench: %u"), i_outp_icmp | I_TITLE},
+-    {"OutRedirects", N_("redirect: %u"), i_outp_icmp | I_TITLE},
+-    {"OutEchos", N_("echo request: %u"), i_outp_icmp | I_TITLE},
+-    {"OutEchoReps", N_("echo replies: %u"), i_outp_icmp | I_TITLE},
+-    {"OutTimestamps", N_("timestamp requests: %u"), i_outp_icmp | I_TITLE},
+-    {"OutTimestampReps", N_("timestamp replies: %u"), i_outp_icmp | I_TITLE},
+-    {"OutAddrMasks", N_("address mask requests: %u"), i_outp_icmp | I_TITLE},
+-    {"OutAddrMaskReps", N_("address mask replies: %u"), i_outp_icmp | I_TITLE},
++    {"InMsgs", N_("%lu ICMP messages received"), number},
++    {"InErrors", N_("%lu input ICMP message failed."), number},
++    {"InDestUnreachs", N_("destination unreachable: %lu"), i_inp_icmp | I_TITLE},
++    {"InTimeExcds", N_("timeout in transit: %lu"), i_inp_icmp | I_TITLE},
++    {"InParmProbs", N_("wrong parameters: %lu"), i_inp_icmp | I_TITLE},       /*? */
++    {"InSrcQuenchs", N_("source quenches: %lu"), i_inp_icmp | I_TITLE},
++    {"InRedirects", N_("redirects: %lu"), i_inp_icmp | I_TITLE},
++    {"InEchos", N_("echo requests: %lu"), i_inp_icmp | I_TITLE},
++    {"InEchoReps", N_("echo replies: %lu"), i_inp_icmp | I_TITLE},
++    {"InTimestamps", N_("timestamp request: %lu"), i_inp_icmp | I_TITLE},
++    {"InTimestampReps", N_("timestamp reply: %lu"), i_inp_icmp | I_TITLE},
++    {"InAddrMasks", N_("address mask request: %lu"), i_inp_icmp | I_TITLE},   /*? */
++    {"InAddrMaskReps", N_("address mask replies: %lu"), i_inp_icmp | I_TITLE},        /*? */
++    {"OutMsgs", N_("%lu ICMP messages sent"), number},
++    {"OutErrors", N_("%lu ICMP messages failed"), number},
++    {"OutDestUnreachs", N_("destination unreachable: %lu"), i_outp_icmp | I_TITLE},
++    {"OutTimeExcds", N_("time exceeded: %lu"), i_outp_icmp | I_TITLE},
++    {"OutParmProbs", N_("wrong parameters: %lu"), i_outp_icmp | I_TITLE},     /*? */
++    {"OutSrcQuenchs", N_("source quench: %lu"), i_outp_icmp | I_TITLE},
++    {"OutRedirects", N_("redirect: %lu"), i_outp_icmp | I_TITLE},
++    {"OutEchos", N_("echo request: %lu"), i_outp_icmp | I_TITLE},
++    {"OutEchoReps", N_("echo replies: %lu"), i_outp_icmp | I_TITLE},
++    {"OutTimestamps", N_("timestamp requests: %lu"), i_outp_icmp | I_TITLE},
++    {"OutTimestampReps", N_("timestamp replies: %lu"), i_outp_icmp | I_TITLE},
++    {"OutAddrMasks", N_("address mask requests: %lu"), i_outp_icmp | I_TITLE},
++    {"OutAddrMaskReps", N_("address mask replies: %lu"), i_outp_icmp | I_TITLE},
+ };
+ struct entry Tcptab[] =
+@@ -119,71 +119,71 @@
+     {"RtoMin", "", number},
+     {"RtoMax", "", number},
+     {"MaxConn", "", number},
+-    {"ActiveOpens", N_("%u active connections openings"), number},
+-    {"PassiveOpens", N_("%u passive connection openings"), number},
+-    {"AttemptFails", N_("%u failed connection attempts"), number},
+-    {"EstabResets", N_("%u connection resets received"), number},
+-    {"CurrEstab", N_("%u connections established"), number},
+-    {"InSegs", N_("%u segments received"), number},
+-    {"OutSegs", N_("%u segments send out"), number},
+-    {"RetransSegs", N_("%u segments retransmited"), number},
+-    {"InErrs", N_("%u bad segments received."), number},
+-    {"OutRsts", N_("%u resets sent"), number},
++    {"ActiveOpens", N_("%lu active connections openings"), number},
++    {"PassiveOpens", N_("%lu passive connection openings"), number},
++    {"AttemptFails", N_("%lu failed connection attempts"), number},
++    {"EstabResets", N_("%lu connection resets received"), number},
++    {"CurrEstab", N_("%lu connections established"), number},
++    {"InSegs", N_("%lu segments received"), number},
++    {"OutSegs", N_("%lu segments send out"), number},
++    {"RetransSegs", N_("%lu segments retransmited"), number},
++    {"InErrs", N_("%lu bad segments received."), number},
++    {"OutRsts", N_("%lu resets sent"), number},
+ };
+ struct entry Udptab[] =
+ {
+-    {"InDatagrams", N_("%u packets received"), number},
+-    {"NoPorts", N_("%u packets to unknown port received."), number},
+-    {"InErrors", N_("%u packet receive errors"), number},
+-    {"OutDatagrams", N_("%u packets sent"), number},
++    {"InDatagrams", N_("%lu packets received"), number},
++    {"NoPorts", N_("%lu packets to unknown port received."), number},
++    {"InErrors", N_("%lu packet receive errors"), number},
++    {"OutDatagrams", N_("%lu packets sent"), number},
+ };
+ struct entry Tcpexttab[] =
+ {
+-    {"SyncookiesSent", N_("%u SYN cookies sent"), opt_number},
+-    {"SyncookiesRecv", N_("%u SYN cookies received"), opt_number},
+-    {"SyncookiesFailed", N_("%u invalid SYN cookies received"), opt_number},
++    {"SyncookiesSent", N_("%lu SYN cookies sent"), opt_number},
++    {"SyncookiesRecv", N_("%lu SYN cookies received"), opt_number},
++    {"SyncookiesFailed", N_("%lu invalid SYN cookies received"), opt_number},
+-    { "EmbryonicRsts", N_("%u resets received for embryonic SYN_RECV sockets"),
++    { "EmbryonicRsts", N_("%lu resets received for embryonic SYN_RECV sockets"),
+       opt_number },  
+-    { "PruneCalled", N_("%u packets pruned from receive queue because of socket"
++    { "PruneCalled", N_("%lu packets pruned from receive queue because of socket"
+                       " buffer overrun"), opt_number },  
+     /* obsolete: 2.2.0 doesn't do that anymore */
+-    { "RcvPruned", N_("%u packets pruned from receive queue"), opt_number },
+-    { "OfoPruned", N_("%u packets dropped from out-of-order queue because of"
++    { "RcvPruned", N_("%lu packets pruned from receive queue"), opt_number },
++    { "OfoPruned", N_("%lu packets dropped from out-of-order queue because of"
+                     " socket buffer overrun"), opt_number }, 
+-    { "OutOfWindowIcmps", N_("%u ICMP packets dropped because they were "
++    { "OutOfWindowIcmps", N_("%lu ICMP packets dropped because they were "
+                            "out-of-window"), opt_number }, 
+-    { "LockDroppedIcmps", N_("%u ICMP packets dropped because"
++    { "LockDroppedIcmps", N_("%lu ICMP packets dropped because"
+                            " socket was locked"), opt_number },
+-    { "TW", N_("%u TCP sockets finished time wait in fast timer"), opt_number },
+-    { "TWRecycled", N_("%u time wait sockets recycled by time stamp"), opt_number }, 
+-    { "TWKilled", N_("%u TCP sockets finished time wait in slow timer"), opt_number },
+-    { "PAWSPassive", N_("%u passive connections rejected because of"
++    { "TW", N_("%lu TCP sockets finished time wait in fast timer"), opt_number },
++    { "TWRecycled", N_("%lu time wait sockets recycled by time stamp"), opt_number }, 
++    { "TWKilled", N_("%lu TCP sockets finished time wait in slow timer"), opt_number },
++    { "PAWSPassive", N_("%lu passive connections rejected because of"
+                       " time stamp"), opt_number },
+-    { "PAWSActive", N_("%u active connections rejected because of "
++    { "PAWSActive", N_("%lu active connections rejected because of "
+                      "time stamp"), opt_number },
+-    { "PAWSEstab", N_("%u packets rejects in established connections because of"
++    { "PAWSEstab", N_("%lu packets rejects in established connections because of"
+                     " timestamp"), opt_number },
+-    { "DelayedACKs", N_("%u delayed acks sent"), opt_number },
+-    { "DelayedACKLocked", N_("%u delayed acks further delayed because of"
++    { "DelayedACKs", N_("%lu delayed acks sent"), opt_number },
++    { "DelayedACKLocked", N_("%lu delayed acks further delayed because of"
+                            " locked socket"), opt_number },
+-    { "DelayedACKLost", N_("Quick ack mode was activated %u times"), opt_number },
+-    { "ListenOverflows", N_("%u times the listen queue of a socket overflowed"),
++    { "DelayedACKLost", N_("Quick ack mode was activated %lu times"), opt_number },
++    { "ListenOverflows", N_("%lu times the listen queue of a socket overflowed"),
+       opt_number },
+-    { "ListenDrops", N_("%u SYNs to LISTEN sockets ignored"), opt_number },
+-    { "TCPPrequeued", N_("%u packets directly queued to recvmsg prequeue."), 
++    { "ListenDrops", N_("%lu SYNs to LISTEN sockets ignored"), opt_number },
++    { "TCPPrequeued", N_("%lu packets directly queued to recvmsg prequeue."), 
+       opt_number },
+-    { "TCPDirectCopyFromBacklog", N_("%u packets directly received"
++    { "TCPDirectCopyFromBacklog", N_("%lu packets directly received"
+                                    " from backlog"), opt_number },
+-    { "TCPDirectCopyFromPrequeue", N_("%u packets directly received"
++    { "TCPDirectCopyFromPrequeue", N_("%lu packets directly received"
+                                     " from prequeue"), opt_number },
+-    { "TCPPrequeueDropped", N_("%u packets dropped from prequeue"), opt_number },
+-    { "TCPHPHits", N_("%u packets header predicted"), number },
+-    { "TCPHPHitsToUser", N_("%u packets header predicted and "
++    { "TCPPrequeueDropped", N_("%lu packets dropped from prequeue"), opt_number },
++    { "TCPHPHits", N_("%lu packets header predicted"), number },
++    { "TCPHPHitsToUser", N_("%lu packets header predicted and "
+                           "directly queued to user"), opt_number },
+-    { "SockMallocOOM", N_("Ran %u times out of system memory during " 
++    { "SockMallocOOM", N_("Ran %lu times out of system memory during " 
+                         "packet sending"), opt_number }, 
+ };
diff --git a/packages/net-tools/files/net-tools-1.60-virtualname.patch b/packages/net-tools/files/net-tools-1.60-virtualname.patch
new file mode 100644 (file)
index 0000000..326df1d
--- /dev/null
@@ -0,0 +1,36 @@
+--- net-tools-1.60/lib/interface.c.virtualname 2001-02-10 20:31:15.000000000 +0100
++++ net-tools-1.60/lib/interface.c     2003-08-19 13:18:01.000000000 +0200
+@@ -579,18 +579,18 @@
+ void ife_print_short(struct interface *ptr)
+ {
+-    printf("%-5.5s ", ptr->name);
+-    printf("%5d %3d", ptr->mtu, ptr->metric);
++    printf("%-9.9s ", ptr->name);
++    printf("%5d %3d ", ptr->mtu, ptr->metric);
+     /* If needed, display the interface statistics. */
+     if (ptr->statistics_valid) {
+-      printf("%8llu %6lu %6lu %6lu",
++      printf("%8llu %6lu %6lu %6lu ",
+              ptr->stats.rx_packets, ptr->stats.rx_errors,
+              ptr->stats.rx_dropped, ptr->stats.rx_fifo_errors);
+       printf("%8llu %6lu %6lu %6lu ",
+              ptr->stats.tx_packets, ptr->stats.tx_errors,
+              ptr->stats.tx_dropped, ptr->stats.tx_fifo_errors);
+     } else {
+-      printf("%-56s", _("     - no statistics available -"));
++      printf("%-60s", _("     - no statistics available -"));
+     }
+     /* DONT FORGET TO ADD THE FLAGS IN ife_print_long, too */
+     if (ptr->flags == 0)
+--- net-tools-1.60/netstat.c.virtualname       2001-04-15 16:41:17.000000000 +0200
++++ net-tools-1.60/netstat.c   2003-08-19 13:18:34.000000000 +0200
+@@ -1449,7 +1449,7 @@
+     }
+     if (flag_exp < 2) {
+       ife_short = 1;
+-      printf(_("Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR   TX-OK TX-ERR TX-DRP TX-OVR Flg\n"));
++      printf(_("Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg\n"));
+     }
+     if (for_all_interfaces(do_if_print, &flag_all) < 0) {
diff --git a/packages/net-tools/net-tools_1.60.bb b/packages/net-tools/net-tools_1.60.bb
new file mode 100644 (file)
index 0000000..606afcb
--- /dev/null
@@ -0,0 +1,90 @@
+SUMMARY="Basic networking tools"
+LICENSE="GPL"
+MAINTAINER="Freyther <freyther@handhelds.org>"
+
+
+#
+# NOTE:
+#   This code currently disbles gettext/i18n! This can be fixed by rerunning
+#   make config and say NO to gettext. I will leave this excercise for someone
+#   else.
+#   Change/generate net-tools-1.60-config.{h,make} to enable/disable features
+#   and gettext
+#
+#
+
+SRC_URI = "http://download.berlios.de/${PN}/${PN}-${PV}.tar.bz2;md5sum=888774accab40217dde927e21979c165 \
+           file://net-tools-${PV}-config.h \
+           file://net-tools-${PV}-config.make \
+           file://ether-wake.c \
+           file://ether-wake.8 \
+           file://mii-diag.c   \
+           file://mii-diag.8   \
+           file://net-tools-1.57-bug22040.patch;patch=1 \
+           file://net-tools-1.60-miiioctl.patch;patch=1 \
+           file://net-tools-1.60-manydevs.patch;patch=1;pnum=0 \
+           file://net-tools-1.60-virtualname.patch;patch=1 \
+           file://net-tools-1.60-cycle.patch;patch=1 \
+           file://net-tools-1.60-nameif.patch;patch=1 \
+           file://net-tools-1.60-ipx.patch;patch=1 \
+           file://net-tools-1.60-inet6-lookup.patch;patch=1 \
+           file://net-tools-1.60-man.patch;patch=1 \
+           file://net-tools-1.60-gcc33.patch;patch=1 \
+           file://net-tools-1.60-trailingblank.patch;patch=1 \
+           file://net-tools-1.60-interface.patch;patch=1 \
+           file://net-tools-1.60-gcc34.patch;patch=1 \
+           file://net-tools-1.60-overflow.patch;patch=1 \
+           file://net-tools-1.60-siunits.patch;patch=1 \
+           file://net-tools-1.60-trunc.patch;patch=1 \
+           file://net-tools-1.60-return.patch;patch=1 \
+           file://net-tools-1.60-parse.patch;patch=1 \
+           file://net-tools-1.60-netmask.patch;patch=1 \
+           file://net-tools-1.60-ulong.patch;patch=1 \
+           file://net-tools-1.60-bcast.patch;patch=1 \
+           file://net-tools-1.60-mii-tool-obsolete.patch;patch=1 \
+           file://net-tools-1.60-netstat_ulong.patch;patch=1 \
+           file://net-tools-1.60-note.patch;patch=1 \
+           file://net-tools-1.60-num-ports.patch;patch=1 \
+           file://net-tools-1.60-duplicate-tcp.patch;patch=1 \
+           file://net-tools-1.60-statalias.patch;patch=1 \
+           file://net-tools-1.60-isofix.patch;patch=1 \
+           file://net-tools-1.60-ifconfig_ib.patch;patch=1 \
+           file://net-tools-1.60-de.patch;patch=1 \
+           file://net-tools-1.60-pie.patch;patch=1 \
+           file://net-tools-1.60-ifaceopt.patch;patch=1 \
+           file://net-tools-1.60-trim_iface.patch;patch=1 \
+           file://net-tools-1.60-stdo.patch;patch=1 \
+           file://net-tools-1.60-statistics.patch;patch=1 \
+           file://net-tools-1.60-ifconfig.patch;patch=1 \
+           file://net-tools-1.60-arp_overflow.patch;patch=1 \
+           file://net-tools-1.60-hostname_man.patch;patch=1 \
+           file://net-tools-1.60-interface_stack.patch;patch=1;pnum=0 \
+           file://net-tools-1.60-selinux.patch;patch=1 \
+           file://net-tools-1.60-netstat_stop_trim.patch;patch=1 "
+
+
+# Copy config and source over to the source directory
+do_configure() {
+    cp ${WORKDIR}/net-tools-${PV}-config.h    ${S}/config.h
+    cp ${WORKDIR}/net-tools-${PV}-config.make ${S}/config.make
+    cp ${WORKDIR}/ether-wake.c ${S}
+    cp ${WORKDIR}/ether-wake.8 ${S}/man/en_US
+    cp ${WORKDIR}/mii-diag.c   ${S}
+    cp ${WORKDIR}/mii-diag.8   ${S}/man/en_US
+}
+
+do_compile() {
+    export COPTS=$CFLAGS
+    export LOPTS=$LDFLAGS
+    unset CFLAGS
+    unset LDFLAGS
+
+    oe_runmake
+    $CC $CFLAGS -o ether-wake ether-wake.c
+    $CC $CFLAGS -o mii-diag   mii-diag.c
+}
+
+do_install() {
+    oe_runmake 'BASEDIR=${D}' -n install
+    oe_runmake 'BASEDIR=${D}' install
+}