diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e6dd9df --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/net-tools-2.0.20131004git.tar.xz diff --git a/.net-tools.metadata b/.net-tools.metadata new file mode 100644 index 0000000..98d4a9d --- /dev/null +++ b/.net-tools.metadata @@ -0,0 +1 @@ +06bc66ade8fbf84a88409367f111273d2ddb836b SOURCES/net-tools-2.0.20131004git.tar.xz diff --git a/SOURCES/arp-ethers.service b/SOURCES/arp-ethers.service new file mode 100644 index 0000000..76a6474 --- /dev/null +++ b/SOURCES/arp-ethers.service @@ -0,0 +1,14 @@ +[Unit] +Description=Load static arp entries +Documentation=man:arp(8) man:ethers(5) +ConditionPathExists=/etc/ethers +After=network.service +Before=network.target + +[Service] +Type=oneshot +ExecStart=/sbin/arp -f /etc/ethers +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/SOURCES/ether-wake-interfaces.patch b/SOURCES/ether-wake-interfaces.patch new file mode 100644 index 0000000..bf26b04 --- /dev/null +++ b/SOURCES/ether-wake-interfaces.patch @@ -0,0 +1,139 @@ +--- a/ether-wake.c 2013-09-03 18:15:13.000000000 +0200 ++++ b/ether-wake.c 2013-09-03 17:39:02.000000000 +0200 +@@ -22,7 +22,7 @@ + " 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" ++" -i ifname Use interface ifname instead of sending a wake packet to all interfaces.\n" + " -p 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" +@@ -89,6 +89,9 @@ + #include + #include + ++#include "interface.h" ++#include "sockets.h" ++ + /* Grrr, no consistency between include versions. + Enable this if setsockopt() isn't declared with your library. */ + #if 0 +@@ -110,20 +113,29 @@ + static int get_fill(unsigned char *pkt, struct ether_addr *eaddr); + static int get_wol_pw(const char *optarg); + ++typedef struct { ++ int s; ++ int verbose; ++ int pktsize; ++} if_info; ++ ++static int send_wol_packet(char *ifname, int s, int verbose, int pktsize); ++ ++static int do_wake(struct interface *ife, void *cookie) { ++ if_info *info = (if_info *)cookie; ++ send_wol_packet(ife->name, info->s, info->verbose, info->pktsize); ++ return 0; ++} ++ + int main(int argc, char *argv[]) + { +- char *ifname = "eth0"; +- int one = 1; /* True, for socket options. */ ++ char *ifname = NULL; + 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 ++ int c, pktsize; + struct ether_addr eaddr; ++ if_info info; + + while ((c = getopt(argc, argv, "bDi:p:uvV")) != -1) + switch (c) { +@@ -177,13 +189,45 @@ + + pktsize = get_fill(outpack, &eaddr); + ++ if (ifname == NULL) { ++ info.s = s; ++ info.verbose = verbose; ++ info.pktsize = pktsize; ++ ++ /* Create a channel to the NET kernel. */ ++ if ((sockets_open(0)) < 0) { ++ perror("socket"); ++ exit(1); ++ } ++ ++ return for_all_interfaces(do_wake, &info); ++ } ++ ++ return send_wol_packet(ifname, s, verbose, pktsize); ++} ++ ++/* Send a Wake-On-LAN (WOL) "Magic Packet" to Interface IFNAME using ++ Socket S with a packet size PKTSIZE. VERBOSE implies ++ verbosity. */ ++ ++static int send_wol_packet(char *ifname, int s, int verbose, int pktsize) ++{ ++ int i; ++ int one = 1; /* True, for socket options. */ ++#if defined(PF_PACKET) ++ struct sockaddr_ll whereto; ++#else ++ struct sockaddr whereto; /* who to wake up */ ++#endif ++ + /* 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; ++ char *hwaddr = if_hwaddr.ifr_hwaddr.sa_data; + +- strcpy(if_hwaddr.ifr_name, ifname); ++ strncpy(if_hwaddr.ifr_name, ifname, IFNAMSIZ); ++ if_hwaddr.ifr_name[IFNAMSIZ-1] = '\0'; + if (ioctl(s, SIOCGIFHWADDR, &if_hwaddr) < 0) { + fprintf(stderr, "SIOCGIFHWADDR on %s failed: %s\n", ifname, + strerror(errno)); +@@ -220,7 +264,8 @@ + #if defined(PF_PACKET) + { + struct ifreq ifr; +- strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); ++ strncpy(ifr.ifr_name, ifname, IFNAMSIZ); ++ ifr.ifr_name[IFNAMSIZ-1] = '\0'; + if (ioctl(s, SIOCGIFINDEX, &ifr) == -1) { + fprintf(stderr, "SIOCGIFINDEX on %s failed: %s\n", ifname, + strerror(errno)); +--- a/Makefile 2013-09-03 13:15:22.531951613 +0100 ++++ b/Makefile 2013-09-03 13:24:29.659823455 +0100 +@@ -188,6 +188,8 @@ + mii-tool: $(NET_LIB) mii-tool.o + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ mii-tool.o $(NLIB) $(RESLIB) + ++ether-wake: $(NET_LIB) ether-wake.o ++ $(CC) $(LDFLAGS) -o ether-wake ether-wake.o $(NLIB) + installbin: + @echo + @echo "######################################################" +--- a/man/en_US/ether-wake.8 2013-09-03 13:15:22.576952098 +0100 ++++ b/man/en_US/ether-wake.8 2013-09-03 13:14:55.270657575 +0100 +@@ -49,7 +49,7 @@ + Increase the Debug Level. + .TP + .B \-i ifname +-Use interface ifname instead of the default "eth0". ++Use interface ifname instead of sending a wake packet to all interfaces. + .TP + .B \-p passwd + Append a four or six byte password to the packet. Only a few adapters diff --git a/SOURCES/ether-wake.8 b/SOURCES/ether-wake.8 new file mode 100644 index 0000000..f51ec44 --- /dev/null +++ b/SOURCES/ether-wake.8 @@ -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 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\fP and +.\" \fI\fP escape sequences to invoke 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 ether-wake program was written by Donald Becker at Scyld Computing +Corporation for use with the Scyld(\*(Tm) Beowulf System. diff --git a/SOURCES/ether-wake.c b/SOURCES/ether-wake.c new file mode 100644 index 0000000..eef22a7 --- /dev/null +++ b/SOURCES/ether-wake.c @@ -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 ] [-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 ] [-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 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. +*/ + +#include +#include +#include +#include +#include +#include + +#if 0 /* Only exists on some versions. */ +#include +#endif + +#include + +#include +#include +#include + +#include +#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1 +#include +#include +#else +#include +#include +#include +#endif +#include +#include + +/* 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 +#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 + + +/* + * 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/SOURCES/ipmaddr.8 b/SOURCES/ipmaddr.8 new file mode 100644 index 0000000..52dd49c --- /dev/null +++ b/SOURCES/ipmaddr.8 @@ -0,0 +1,34 @@ +.\" Process this file with +.\" groff -man -Tascii ipmaddr.8 +.\" +.TH IPMADDR 8 "SEPTEMBER 2009" "" "" +.\" +.\" Man page written by Jiri Popelka +.\" +.SH NAME +.B ipmaddr +\- adds, deletes, and displays multicast addresses + +.SH SYNOPSIS +.B /usr/sbin/ipmaddr +.RB [< operation >] +.RB [< args >] + +.SH NOTE +.P +This program is obsolete. For replacement check \fBip maddr\fR. + +.SH DESCRIPTION +The \fBipmaddr\fR command can perform one of the following operations: + +.B add +\- add a multicast address + +.B del +\- delete a multicast address + +.B show +\- list multicast addresses + +.SH SEE ALSO +.BR ip (8). diff --git a/SOURCES/iptunnel.8 b/SOURCES/iptunnel.8 new file mode 100644 index 0000000..3f5da84 --- /dev/null +++ b/SOURCES/iptunnel.8 @@ -0,0 +1,41 @@ +.\" Process this file with +.\" groff -man -Tascii iptunnel.8 +.\" +.TH IPTUNNEL 8 "SEPTEMBER 2009" "" "" +.\" +.\" Man page written by Jiri Popelka +.\" +.SH NAME +.B iptunnel +\- creates, deletes, and displays configured tunnels + +.SH SYNOPSIS +.B /usr/sbin/iptunnel +.RB [< operation >] +.RB [< args >] + +.SH NOTE +.P +This program is obsolete. For replacement check \fBip tunnel\fR. + +.SH DESCRIPTION +The \fBiptunnel\fR +command creates configured tunnels for sending and receiving +IPV6 or IPV4 packets that are encapsulated as the payload of an IPV4 +datagram. + +The +.B iptunnel +command can perform one of the following operations: + +.B create +\- create a tunnel interface, which you must subsequently configure. + +.B delete +\- delete a tunnel interface. You must disable the tunnel before you can delete it. + +.B show +\- show the tunnel attributes (name, tunnel end points, next hop for tunneled packets). + +.SH SEE ALSO +.BR ip (8). diff --git a/SOURCES/mii-diag.8 b/SOURCES/mii-diag.8 new file mode 100644 index 0000000..52f35d1 --- /dev/null +++ b/SOURCES/mii-diag.8 @@ -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 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 ] +.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\fP and +.\" \fI\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 +.BR +.B \-F, --fixed-speed + +Speed is one of: 100baseT4, 100baseTx, 100baseTx-FD, 100baseTx-HD, 10baseT, +10baseT-FD, 10baseT-HD. For more precise control an explicit 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 +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 simplified +output. It polls the interface only once a second and the output format +is a single line per link change with three fixed words + +.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/SOURCES/mii-diag.c b/SOURCES/mii-diag.c new file mode 100644 index 0000000..49e05c2 --- /dev/null +++ b/SOURCES/mii-diag.c @@ -0,0 +1,653 @@ +/* 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 + + 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 ] [--watch] \n"; +static const char long_usage_msg[] = +"Usage: %s [-aDfrRvVw] [-AF ] [--watch] \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\ + Frequently used options are\n\ + -A --advertise \n\ + -F --fixed-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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef use_linux_libc5 +#include +#include +#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 interface wasn't specified. */ + if (optind == argc) { + fprintf(stderr, "No interface specified.\n"); + fprintf(stderr, usage_msg, progname); + (void) close(skfd); + return 2; + } else { + /* Copy the interface name. */ + spp = argv + optind; + ifname = *spp++; + } + + if (ifname == NULL) { + fprintf(stderr, "No ifname.\n"); + (void) close(skfd); + return -1; + } + + /* 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); + ifr.ifr_name[IFNAMSIZ-1] = '\0'; + 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<= 11; i--) + if (bmsr & (1<"); + 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<] -r netstat {-V|--version|-h|--help}\n")); + fprintf(stderr, _(" netstat [-vWnNcaeol] [ ...]\n")); +@@ -2100,7 +2100,7 @@ static void usage(void) + fprintf(stderr, _(" =Use '-6|-4' or '-A ' or '--'; default: %s\n"), DFLT_AF); + fprintf(stderr, _(" List of possible address families (which support routing):\n")); + print_aflist(1); /* 1 = routeable */ +- exit(E_USAGE); ++ exit(rc); + } + + +@@ -2292,20 +2292,21 @@ int main + + break; + case '?': ++ usage(E_OPTERR); + case 'h': +- usage(); ++ usage(E_USAGE); + case 's': + flag_sta++; + } + + if(argc == optind + 1) { + if((reptimer = atoi(argv[optind])) <= 0) +- usage(); ++ usage(E_OPTERR); + flag_cnt++; + } + + if (flag_int + flag_rou + flag_mas + flag_sta > 1) +- usage(); ++ usage(E_OPTERR); + + if ((flag_inet || flag_inet6 || flag_sta) && + !(flag_tcp || flag_sctp || flag_udp || flag_udplite || flag_raw)) +diff --git a/arp.c b/arp.c +index 5db71a7..30dd56d 100644 +--- a/arp.c ++++ b/arp.c +@@ -93,7 +93,7 @@ struct hwtype *hw; /* current hardware type */ + int sockfd = 0; /* active socket descriptor */ + int hw_set = 0; /* flag if hw-type was set (-H) */ + char device[16] = ""; /* current device */ +-static void usage(void); ++static void usage(int rc); + + /* Delete an entry from the ARP cache. */ + static int arp_del(char **args) +@@ -169,14 +169,14 @@ static int arp_del(char **args) + } + if (!strcmp(*args, "dev")) { + if (*++args == NULL) +- usage(); ++ usage(E_OPTERR); + safe_strncpy(device, *args, sizeof(device)); + args++; + continue; + } + if (!strcmp(*args, "netmask")) { + if (*++args == NULL) +- usage(); ++ usage(E_OPTERR); + if (strcmp(*args, "255.255.255.255") != 0) { + safe_strncpy(host, *args, (sizeof host)); + if (ap->input(0, host, sa) < 0) { +@@ -190,7 +190,7 @@ static int arp_del(char **args) + args++; + continue; + } +- usage(); ++ usage(E_OPTERR); + } + + // if neighter priv nor pub is given, work on both +@@ -346,14 +346,14 @@ static int arp_set(char **args) + } + if (!strcmp(*args, "dev")) { + if (*++args == NULL) +- usage(); ++ usage(E_OPTERR); + safe_strncpy(device, *args, sizeof(device)); + args++; + continue; + } + if (!strcmp(*args, "netmask")) { + if (*++args == NULL) +- usage(); ++ usage(E_OPTERR); + if (strcmp(*args, "255.255.255.255") != 0) { + safe_strncpy(host, *args, (sizeof host)); + if (ap->input(0, host, sa) < 0) { +@@ -367,7 +367,7 @@ static int arp_set(char **args) + args++; + continue; + } +- usage(); ++ usage(E_OPTERR); + } + + /* Fill in the remainder of the request. */ +@@ -621,7 +621,7 @@ static void version(void) + exit(E_VERSION); + } + +-static void usage(void) ++static void usage(int rc) + { + fprintf(stderr, _("Usage:\n arp [-vn] [] [-i ] [-a] [] <-Display ARP cache\n")); + fprintf(stderr, _(" arp [-v] [-i ] -d [pub] <-Delete ARP entry\n")); +@@ -643,7 +643,7 @@ static void usage(void) + fprintf(stderr, _(" =Use '-H ' to specify hardware address type. Default: %s\n"), DFLT_HW); + fprintf(stderr, _(" List of possible hardware types (which support ARP):\n")); + print_hwlist(1); /* 1 = ARPable */ +- exit(E_USAGE); ++ exit(rc); + } + + int main(int argc, char **argv) +@@ -745,10 +745,11 @@ int main(int argc, char **argv) + + case 'V': + version(); +- case '?': + case 'h': ++ usage(E_USAGE); ++ case '?': + default: +- usage(); ++ usage(E_OPTERR); + } + + if (ap->af != AF_INET) { +@@ -797,7 +798,7 @@ int main(int argc, char **argv) + break; + + default: +- usage(); ++ usage(E_OPTERR); + } + + exit(what); +diff --git a/ipmaddr.c b/ipmaddr.c +index e4ed41d..c45b62a 100644 +--- a/ipmaddr.c ++++ b/ipmaddr.c +@@ -53,14 +53,14 @@ static void version(void) + exit(E_VERSION); + } + +-static void usage(void) __attribute__((noreturn)); ++static void usage(int rc) __attribute__((noreturn)); + +-static void usage(void) ++static void usage(int rc) + { + fprintf(stderr, _("Usage: ipmaddr [ add | del ] MULTIADDR dev STRING\n")); + fprintf(stderr, _(" ipmaddr show [ dev STRING ] [ ipv4 | ipv6 | link | all ]\n")); + fprintf(stderr, _(" ipmaddr -V | -version\n")); +- exit(E_USAGE); ++ exit(rc); + } + + static void print_lla(FILE *fp, int len, unsigned char *addr) +@@ -294,7 +294,7 @@ static int multiaddr_list(int argc, char **argv) + NEXT_ARG(); + l = strlen(*argv); + if (l <= 0 || l >= sizeof(filter_dev)) +- usage(); ++ usage(E_OPTERR); + strncpy(filter_dev, *argv, sizeof (filter_dev)); + } else if (strcmp(*argv, "all") == 0) { + filter_family = AF_UNSPEC; +@@ -307,7 +307,7 @@ static int multiaddr_list(int argc, char **argv) + } else { + l = strlen(*argv); + if (l <= 0 || l >= sizeof(filter_dev)) +- usage(); ++ usage(E_OPTERR); + strncpy(filter_dev, *argv, sizeof (filter_dev)); + } + argv++; argc--; +@@ -339,18 +339,18 @@ int multiaddr_modify(int cmd, int argc, char **argv) + if (strcmp(*argv, "dev") == 0) { + NEXT_ARG(); + if (ifr.ifr_name[0]) +- usage(); ++ usage(E_OPTERR); + strncpy(ifr.ifr_name, *argv, IFNAMSIZ); + } else { + if (ifr.ifr_hwaddr.sa_data[0]) +- usage(); ++ usage(E_OPTERR); + if (parse_lla(*argv, ifr.ifr_hwaddr.sa_data) < 0) +- usage(); ++ usage(E_OPTERR); + } + argc--; argv++; + } + if (ifr.ifr_name[0] == 0) +- usage(); ++ usage(E_OPTERR); + + fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) { +@@ -378,7 +378,7 @@ int do_multiaddr(int argc, char **argv) + if (matches(*argv, "list") == 0 || matches(*argv, "show") == 0 + || matches(*argv, "lst") == 0) + return multiaddr_list(argc-1, argv+1); +- usage(); ++ usage(E_OPTERR); + } + + int preferred_family = AF_UNSPEC; +@@ -408,13 +408,13 @@ int main(int argc, char **argv) + argc--; + argv++; + if (argc <= 1) +- usage(); ++ usage(E_OPTERR); + if (strcmp(argv[1], "inet") == 0) + preferred_family = AF_INET; + else if (strcmp(argv[1], "inet6") == 0) + preferred_family = AF_INET6; + else +- usage(); ++ usage(E_OPTERR); + } else if (matches(argv[1], "-stats") == 0 || + matches(argv[1], "-statistics") == 0) { + ++show_stats; +@@ -423,7 +423,7 @@ int main(int argc, char **argv) + } else if ((matches(argv[1], "-V") == 0) || matches(argv[1], "--version") == 0) { + version(); + } else +- usage(); ++ usage(E_OPTERR); + argc--; argv++; + } + +diff --git a/include/util-ank.h b/include/util-ank.h +index c8fcd08..c78604a 100644 +--- a/include/util-ank.h ++++ b/include/util-ank.h +@@ -23,7 +23,7 @@ extern int resolve_hosts; + #define NEXT_ARG() \ + argv++; \ + if (--argc <= 0) \ +- usage(); ++ usage(E_OPTERR); + + typedef struct + { +diff --git a/iptunnel.c b/iptunnel.c +index 2215d68..42b2a9e 100644 +--- a/iptunnel.c ++++ b/iptunnel.c +@@ -76,9 +76,9 @@ static void version(void) + exit(E_VERSION); + } + +-static void usage(void) __attribute__((noreturn)); ++static void usage(int rc) __attribute__((noreturn)); + +-static void usage(void) ++static void usage(int rc) + { + fprintf(stderr, _("Usage: iptunnel { add | change | del | show } [ NAME ]\n")); + fprintf(stderr, _(" [ mode { ipip | gre | sit } ] [ remote ADDR ] [ local ADDR ]\n")); +@@ -90,7 +90,7 @@ static void usage(void) + fprintf(stderr, _(" TOS := { NUMBER | inherit }\n")); + fprintf(stderr, _(" TTL := { 1..255 | inherit }\n")); + fprintf(stderr, _(" KEY := { DOTTED_QUAD | NUMBER }\n")); +- exit(E_USAGE); ++ exit(rc); + } + + static int do_ioctl_get_ifindex(char *dev) +@@ -217,18 +217,18 @@ static int parse_args(int argc, char **argv, struct ip_tunnel_parm *p) + NEXT_ARG(); + if (strcmp(*argv, "ipip") == 0) { + if (p->iph.protocol) +- usage(); ++ usage(E_OPTERR); + p->iph.protocol = IPPROTO_IPIP; + } else if (strcmp(*argv, "gre") == 0) { + if (p->iph.protocol) +- usage(); ++ usage(E_OPTERR); + p->iph.protocol = IPPROTO_GRE; + } else if (strcmp(*argv, "sit") == 0) { + if (p->iph.protocol) +- usage(); ++ usage(E_OPTERR); + p->iph.protocol = IPPROTO_IPV6; + } else +- usage(); ++ usage(E_OPTERR); + } else if (strcmp(*argv, "key") == 0) { + unsigned uval; + NEXT_ARG(); +@@ -238,7 +238,7 @@ static int parse_args(int argc, char **argv, struct ip_tunnel_parm *p) + p->i_key = p->o_key = get_addr32(*argv); + else { + if (scan_number(*argv, &uval)<0) +- usage(); ++ usage(E_OPTERR); + p->i_key = p->o_key = htonl(uval); + } + } else if (strcmp(*argv, "ikey") == 0) { +@@ -249,7 +249,7 @@ static int parse_args(int argc, char **argv, struct ip_tunnel_parm *p) + p->o_key = get_addr32(*argv); + else { + if (scan_number(*argv, &uval)<0) +- usage(); ++ usage(E_OPTERR); + p->i_key = htonl(uval); + } + } else if (strcmp(*argv, "okey") == 0) { +@@ -260,7 +260,7 @@ static int parse_args(int argc, char **argv, struct ip_tunnel_parm *p) + p->o_key = get_addr32(*argv); + else { + if (scan_number(*argv, &uval)<0) +- usage(); ++ usage(E_OPTERR); + p->o_key = htonl(uval); + } + } else if (strcmp(*argv, "seq") == 0) { +@@ -295,9 +295,9 @@ static int parse_args(int argc, char **argv, struct ip_tunnel_parm *p) + NEXT_ARG(); + if (strcmp(*argv, "inherit") != 0) { + if (scan_number(*argv, &uval)<0) +- usage(); ++ usage(E_OPTERR); + if (uval > 255) +- usage(); ++ usage(E_OPTERR); + p->iph.ttl = uval; + } + } else if (strcmp(*argv, "tos") == 0) { +@@ -305,15 +305,15 @@ static int parse_args(int argc, char **argv, struct ip_tunnel_parm *p) + NEXT_ARG(); + if (strcmp(*argv, "inherit") != 0) { + if (scan_number(*argv, &uval)<0) +- usage(); ++ usage(E_OPTERR); + if (uval > 255) +- usage(); ++ usage(E_OPTERR); + p->iph.tos = uval; + } else + p->iph.tos = 1; + } else { + if (p->name[0]) +- usage(); ++ usage(E_OPTERR); + safe_strncpy(p->name, *argv, IFNAMSIZ); + } + argc--; argv++; +@@ -574,7 +574,7 @@ int do_iptunnel(int argc, char **argv) + } else + return do_show(0, NULL); + +- usage(); ++ usage(E_OPTERR); + } + + +@@ -605,13 +605,13 @@ int main(int argc, char **argv) + argc--; + argv++; + if (argc <= 1) +- usage(); ++ usage(E_OPTERR); + if (strcmp(argv[1], "inet") == 0) + preferred_family = AF_INET; + else if (strcmp(argv[1], "inet6") == 0) + preferred_family = AF_INET6; + else +- usage(); ++ usage(E_OPTERR); + } else if (matches(argv[1], "-stats") == 0 || + matches(argv[1], "-statistics") == 0) { + ++show_stats; +@@ -620,7 +620,7 @@ int main(int argc, char **argv) + } else if ((matches(argv[1], "-V") == 0) || (matches(argv[1], "--version") == 0)) { + version(); + } else +- usage(); ++ usage(E_OPTERR); + argc--; argv++; + } + +diff --git a/nameif.c b/nameif.c +index b280e59..13e3033 100644 +--- a/nameif.c ++++ b/nameif.c +@@ -192,10 +192,10 @@ struct option lopt[] = { + {NULL}, + }; + +-void usage(void) ++void usage(int rc) + { + fprintf(stderr, _("usage: nameif [-c configurationfile] [-s] {ifname macaddress}\n")); +- exit(E_USAGE); ++ exit(rc); + } + + int main(int ac, char **av) +@@ -214,7 +214,7 @@ int main(int ac, char **av) + switch (c) { + default: + case '?': +- usage(); ++ usage(E_OPTERR); + case 'c': + fname = optarg; + break; +@@ -232,7 +232,7 @@ int main(int ac, char **av) + char pos[30]; + + if ((ac-optind) & 1) +- usage(); ++ usage(E_OPTERR); + if (strlen(av[optind])+1>IFNAMSIZ) + complain(_("interface name `%s' too long"), av[optind]); + safe_strncpy(ch->ifname, av[optind], sizeof(ch->ifname)); +diff --git a/plipconfig.c b/plipconfig.c +index 86fa890..1caeed3 100644 +--- a/plipconfig.c ++++ b/plipconfig.c +@@ -57,12 +57,12 @@ static void version(void) + exit(E_VERSION); + } + +-void usage(void) ++void usage(int rc) + { + fprintf(stderr, _("Usage: plipconfig interface [nibble NN] [trigger NN]\n")); + fprintf(stderr, _(" plipconfig -V | --version\n")); + fprintf(stderr, _(" plipconfig -h | --help\n")); +- exit(E_USAGE); ++ exit(rc); + } + + void print_plip(void) +@@ -89,16 +89,18 @@ int main(int argc, char **argv) + argc--; + argv++; + while (argv[0] && *argv[0] == '-') { +- if (!strcmp(*argv, "-V") || !strcmp(*argv, "--version")) ++ if ((!strcmp(*argv, "-V") || !strcmp(*argv, "--version")) && argc==1) + version(); ++ if ((!strcmp(*argv, "-h") || !strcmp(*argv, "--help")) && argc==1) ++ usage(E_USAGE); + else +- usage(); ++ usage(E_OPTERR); + argv++; + argc--; + } + + if (argc == 0) +- usage(); ++ usage(E_OPTERR); + + spp = argv; + safe_strncpy(ifr.ifr_name, *spp++, IFNAMSIZ); +@@ -117,19 +119,19 @@ int main(int argc, char **argv) + while (*spp != (char *) NULL) { + if (!strcmp(*spp, "nibble")) { + if (*++spp == NULL) +- usage(); ++ usage(E_OPTERR); + plip->nibble = atoi(*spp); + spp++; + continue; + } + if (!strcmp(*spp, "trigger")) { + if (*++spp == NULL) +- usage(); ++ usage(E_OPTERR); + plip->trigger = atoi(*spp); + spp++; + continue; + } +- usage(); ++ usage(E_OPTERR); + } + + plip->pcmd = PLIP_SET_TIMEOUT; +diff --git a/route.c b/route.c +index 4eaed49..d5a3039 100644 +--- a/route.c ++++ b/route.c +@@ -76,7 +76,7 @@ int opt_fc = 0; // routing cache/FIB + int opt_h = 0; // help selected + struct aftype *ap; // selected address family + +-static void usage(void) ++static void usage(int rc) + { + fprintf(stderr, _("Usage: route [-nNvee] [-FC] [] List kernel routing tables\n")); + fprintf(stderr, _(" route [-v] [-FC] {add|del|flush} ... Modify routing table for AF.\n\n")); +@@ -93,7 +93,7 @@ static void usage(void) + fprintf(stderr, _(" =Use -4, -6, '-A ' or '--'; default: %s\n"), DFLT_AF); + fprintf(stderr, _(" List of possible address families (which support routing):\n")); + print_aflist(1); /* 1 = routeable */ +- exit(E_USAGE); ++ exit(rc); + } + + +@@ -186,11 +186,12 @@ int main(int argc, char **argv) + case 'V': + version(); + case 'h': ++ usage(E_USAGE); + case '?': + opt_h++; + break; + default: +- usage(); ++ usage(E_OPTERR); + } + + argv += optind; +@@ -198,7 +199,7 @@ int main(int argc, char **argv) + + if (opt_h) { + if (!afname[0]) +- usage(); ++ usage(E_OPTERR); + else + what = RTACTION_HELP; + } else { +@@ -217,7 +218,7 @@ int main(int argc, char **argv) + else if (!strcmp(*argv, "flush")) + what = RTACTION_FLUSH; + else +- usage(); ++ usage(E_OPTERR); + } + } + +@@ -231,7 +232,7 @@ int main(int argc, char **argv) + i = route_edit(what, afname, options, ++argv); + + if (i == E_OPTERR) +- usage(); ++ usage(E_OPTERR); + + return (i); + } +diff --git a/slattach.c b/slattach.c +index 5c81584..dbb2658 100644 +--- a/slattach.c ++++ b/slattach.c +@@ -581,7 +581,7 @@ sig_catch(int sig) + + + static void +-usage(void) ++usage(int rc) + { + char *usage_msg = "Usage: slattach [-ehlLmnqv] " + #ifdef SIOCSKEEPALIVE +@@ -594,7 +594,7 @@ usage(void) + " slattach -V | --version\n"; + + fputs(usage_msg, stderr); +- exit(E_USAGE); ++ exit(rc); + } + + +@@ -691,7 +691,7 @@ main(int argc, char *argv[]) + /*NOTREACHED*/ + + default: +- usage(); ++ usage(E_OPTERR); + /*NOTREACHED*/ + } + +@@ -707,7 +707,7 @@ main(int argc, char *argv[]) + opt_m++; + + /* Is a terminal given? */ +- if (optind != (argc - 1)) usage(); ++ if (optind != (argc - 1)) usage(E_OPTERR); + safe_strncpy(path_buf, argv[optind], sizeof(path_buf)); + if (!strcmp(path_buf, "-")) { + opt_e = 1; diff --git a/SOURCES/net-tools-cycle.patch b/SOURCES/net-tools-cycle.patch new file mode 100644 index 0000000..a70408b --- /dev/null +++ b/SOURCES/net-tools-cycle.patch @@ -0,0 +1,375 @@ +diff -up net-tools-2.0/lib/interface.c.cycle net-tools-2.0/lib/interface.c +--- net-tools-2.0/lib/interface.c.cycle 2013-08-30 14:30:25.000000000 +0200 ++++ net-tools-2.0/lib/interface.c 2013-09-10 12:31:03.930309225 +0200 +@@ -93,6 +93,7 @@ int if_list_all = 0; /* do we have reque + static struct interface *int_list, *int_last; + + static int if_readlist_proc(char *); ++static int if_readlist_rep(char *, struct interface *); + + static struct interface *if_cache_add(char *name) + { +@@ -138,11 +139,14 @@ struct interface *lookup_interface(char + int for_all_interfaces(int (*doit) (struct interface *, void *), void *cookie) + { + struct interface *ife; ++ int err; + + if (!if_list_all && (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; + } +@@ -378,6 +382,41 @@ static int if_readlist_proc(char *target + fclose(fh); + 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) + { +diff -up net-tools-2.0/man/en_US/netstat.8.cycle net-tools-2.0/man/en_US/netstat.8 +--- net-tools-2.0/man/en_US/netstat.8.cycle 2013-08-30 14:30:25.000000000 +0200 ++++ net-tools-2.0/man/en_US/netstat.8 2013-09-10 12:31:03.930309225 +0200 +@@ -33,6 +33,7 @@ netstat \- Print network connections, ro + .RB [ \-\-verbose | \-v ] + .RB [ \-\-continuous | \-c] + .RB [ \-\-wide | \-W] ++.RB [delay] + .P + .B netstat + .RB { \-\-route | \-r } +@@ -42,6 +43,7 @@ netstat \- Print network connections, ro + .RB [ \-\-numeric | \-n ] + .RB [ \-\-numeric\-hosts "] [" \-\-numeric\-ports "] [" \-\-numeric\-users ] + .RB [ \-\-continuous | \-c] ++.RB [delay] + .P + .B netstat + .RB { \-\-interfaces | \-i } +@@ -52,12 +54,14 @@ netstat \- Print network connections, ro + .RB [ \-\-numeric | \-n ] + .RB [ \-\-numeric-hosts "] [" \-\-numeric-ports "] [" \-\-numeric-users ] + .RB [ \-\-continuous | \-c] ++.RB [delay] + .P + .B netstat + .RB { \-\-groups | \-g } + .RB [ \-\-numeric | \-n ] + .RB [ \-\-numeric\-hosts "] [" \-\-numeric\-ports "] [" \-\-numeric\-users ] + .RB [ \-\-continuous | \-c] ++.RB [delay] + .P + .B netstat + .RB { \-\-masquerade | \-M } +@@ -65,6 +69,7 @@ netstat \- Print network connections, ro + .RB [ \-\-numeric | \-n ] + .RB [ \-\-numeric\-hosts "] [" \-\-numeric\-ports "] [" \-\-numeric\-users ] + .RB [ \-\-continuous | \-c] ++.RB [delay] + .P + .B netstat + .RB { \-\-statistics | -s } +@@ -72,6 +77,7 @@ netstat \- Print network connections, ro + .RB [ \-\-udp | \-u ] + .RB [ \-\-udplite | \-U ] + .RB [ \-\-raw | \-w ] ++.RB [delay] + .P + .B netstat + .RB { \-\-version | \-V } +@@ -197,6 +203,10 @@ option, show interfaces that are not up + 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. + .P + .SH OUTPUT + .P +diff -up net-tools-2.0/netstat.c.cycle net-tools-2.0/netstat.c +--- net-tools-2.0/netstat.c.cycle 2013-08-30 14:30:25.000000000 +0200 ++++ net-tools-2.0/netstat.c 2013-09-10 12:32:32.460124531 +0200 +@@ -115,9 +115,9 @@ + #endif + + /* prototypes for statistics.c */ +-void parsesnmp(int, int, int); ++int parsesnmp(int, int, int); + void inittab(void); +-void parsesnmp6(int, int, int); ++int parsesnmp6(int, int, int); + void inittab6(void); + + typedef enum { +@@ -341,10 +341,10 @@ static void prg_cache_clear(void) + prg_cache_loaded = 0; + } + +-static void wait_continous(void) ++static void wait_continous(int reptimer) + { + fflush(stdout); +- sleep(1); ++ sleep(reptimer); + } + + static int extract_type_1_socket_inode(const char lname[], unsigned long * inode_p) { +@@ -1781,6 +1781,8 @@ static int rfcomm_info(void) + + static int iface_info(void) + { ++ static int count=0; ++ + if (skfd < 0) { + if ((skfd = sockets_open(0)) < 0) { + perror("socket"); +@@ -1790,20 +1792,21 @@ static int iface_info(void) + } + if (flag_exp < 2) { + ife_short = 1; +- printf(_("Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n")); ++ if(!(count % 8)) ++ printf(_("Iface MTU 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) { + if_cache_free(); +- else { + close(skfd); + skfd = -1; + } + ++ count++; + return 0; + } + +@@ -1819,7 +1822,7 @@ static void usage(void) + { + fprintf(stderr, _("usage: netstat [-vWeenNcCF] [] -r netstat {-V|--version|-h|--help}\n")); + fprintf(stderr, _(" netstat [-vWnNcaeol] [ ...]\n")); +- fprintf(stderr, _(" netstat { [-vWeenNac] -i | [-cnNe] -M | -s [-6tuw] }\n\n")); ++ fprintf(stderr, _(" netstat { [-vWeenNac] -i | [-cnNe] -M | -s [-6tuw] } [delay]\n\n")); + + fprintf(stderr, _(" -r, --route display routing table\n")); + fprintf(stderr, _(" -i, --interfaces display interface table\n")); +@@ -1861,6 +1864,7 @@ int main + (int argc, char *argv[]) { + int i; + int lop; ++ int reptimer = 1; + static struct option longopts[] = + { + AFTRANS_OPTS, +@@ -2043,6 +2047,12 @@ int main + 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(); + +@@ -2072,7 +2082,7 @@ int main + flag_not & FLAG_NUM_PORT, flag_exp); + if (i || !flag_cnt) + break; +- wait_continous(); ++ wait_continous(reptimer); + } + #else + ENOSUPP("netstat", "FW_MASQUERADE"); +@@ -2085,17 +2095,18 @@ int main + if (!afname[0]) + safe_strncpy(afname, DFLT_AF, sizeof(afname)); + ++ for (;;) { + if (!strcmp(afname, "inet")) { + #if HAVE_AFINET + inittab(); +- parsesnmp(flag_raw, flag_tcp, flag_udp); ++ i = parsesnmp(flag_raw, flag_tcp, flag_udp); + #else + ENOSUPP("netstat", "AF INET"); + #endif + } else if(!strcmp(afname, "inet6")) { + #if HAVE_AFINET6 + inittab6(); +- parsesnmp6(flag_raw, flag_tcp, flag_udp); ++ i = parsesnmp6(flag_raw, flag_tcp, flag_udp); + #else + ENOSUPP("netstat", "AF INET6"); + #endif +@@ -2103,7 +2114,11 @@ int main + printf(_("netstat: No statistics support for specified address family: %s\n"), afname); + exit(1); + } +- exit(0); ++ if(i || !flag_cnt) ++ break; ++ sleep(reptimer); ++ } ++ return (i); + } + + if (flag_rou) { +@@ -2125,7 +2140,7 @@ int main + i = route_info(afname, options); + if (i || !flag_cnt) + break; +- wait_continous(); ++ wait_continous(reptimer); + } + return (i); + } +@@ -2134,7 +2149,7 @@ int main + i = iface_info(); + if (!flag_cnt || i) + break; +- wait_continous(); ++ wait_continous(reptimer); + } + return (i); + } +@@ -2321,7 +2336,7 @@ int main + + if (!flag_cnt || i) + break; +- wait_continous(); ++ wait_continous(reptimer); + prg_cache_clear(); + } + return (i); +diff -up net-tools-2.0/statistics.c.cycle net-tools-2.0/statistics.c +--- net-tools-2.0/statistics.c.cycle 2013-08-30 14:30:25.000000000 +0200 ++++ net-tools-2.0/statistics.c 2013-09-10 12:31:03.932309198 +0200 +@@ -502,7 +502,7 @@ void process6_fd(FILE *f) + + } + +-void parsesnmp(int flag_raw, int flag_tcp, int flag_udp) ++int parsesnmp(int flag_raw, int flag_tcp, int flag_udp) + { + FILE *f; + +@@ -511,14 +511,17 @@ void parsesnmp(int flag_raw, int flag_tc + f = proc_fopen("/proc/net/snmp"); + if (!f) { + perror(_("cannot open /proc/net/snmp")); +- return; ++ return(1); + } + + if (process_fd(f, 1, NULL) < 0) + fprintf(stderr, _("Problem while parsing /proc/net/snmp\n")); + +- if (ferror(f)) ++ if (ferror(f)) { + perror("/proc/net/snmp"); ++ fclose(f); ++ return(1); ++ } + + fclose(f); + +@@ -528,15 +531,18 @@ void parsesnmp(int flag_raw, int flag_tc + if (process_fd(f, 1, NULL) <0) + fprintf(stderr, _("Problem while parsing /proc/net/netstat\n")); + +- if (ferror(f)) +- perror("/proc/net/netstat"); ++ if (ferror(f)) { ++ perror("/proc/net/netstat"); ++ fclose(f); ++ return(1); ++ } + + fclose(f); + } +- return; ++ return(0); + } + +-void parsesnmp6(int flag_raw, int flag_tcp, int flag_udp) ++int parsesnmp6(int flag_raw, int flag_tcp, int flag_udp) + { + FILE *f; + +@@ -545,7 +551,7 @@ void parsesnmp6(int flag_raw, int flag_t + f = fopen("/proc/net/snmp6", "r"); + if (!f) { + perror(_("cannot open /proc/net/snmp6")); +- return; ++ return(1); + } + process6_fd(f); + if (ferror(f)) +@@ -555,13 +561,16 @@ void parsesnmp6(int flag_raw, int flag_t + f = fopen("/proc/net/snmp", "r"); + if (!f) { + perror(_("cannot open /proc/net/snmp")); +- return; ++ return(1); + } + process_fd(f, 0, "Tcp"); +- if (ferror(f)) ++ if (ferror(f)) { + perror("/proc/net/snmp"); ++ return(1); ++ } + + fclose(f); ++ return(0); + } + + void inittab(void) diff --git a/SOURCES/net-tools-duplicate-tcp.patch b/SOURCES/net-tools-duplicate-tcp.patch new file mode 100644 index 0000000..393d272 --- /dev/null +++ b/SOURCES/net-tools-duplicate-tcp.patch @@ -0,0 +1,146 @@ +diff -up net-tools-2.0/netstat.c.dup-tcp net-tools-2.0/netstat.c +--- net-tools-2.0/netstat.c.dup-tcp 2012-10-04 11:32:01.437729086 +0200 ++++ net-tools-2.0/netstat.c 2012-10-04 11:32:01.441729032 +0200 +@@ -502,6 +502,121 @@ static void prg_cache_load(void) + " 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]->socket_pair); ++ 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 HAVE_AFNETROM + static const char *netrom_state[] = + { +@@ -1018,6 +1133,12 @@ static void tcp_do_one(int lnr, const ch + 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; ++ } ++ + addr_do_one(local_addr, sizeof(local_addr), 22, ap, &localaddr, local_port, "tcp"); + addr_do_one(rem_addr, sizeof(rem_addr), 22, ap, &remaddr, rem_port, "tcp"); + +@@ -2355,6 +2476,7 @@ int main + break; + wait_continous(reptimer); + prg_cache_clear(); ++ tcp_node_hash_clear(); + } + return (i); + } diff --git a/SOURCES/net-tools-ifconfig-EiB.patch b/SOURCES/net-tools-ifconfig-EiB.patch new file mode 100644 index 0000000..7bcba0b --- /dev/null +++ b/SOURCES/net-tools-ifconfig-EiB.patch @@ -0,0 +1,28 @@ +diff --git a/lib/interface.c.old b/lib/interface.c +index 13017ae..3bd999f 100644 +--- a/lib/interface.c.old ++++ b/lib/interface.c +@@ -927,7 +927,10 @@ void ife_print_long(struct interface *ptr) + */ + rx = ptr->stats.rx_bytes; + short_rx = rx * 10; +- if (rx > 1125899906842624ull) { ++ if (rx > 1152921504606846976ull) { ++ short_rx = rx / 115292150460684697ull; ++ Rext = "EiB"; ++ } else if (rx > 1125899906842624ull) { + short_rx /= 1125899906842624ull; + Rext = "PiB"; + } else if (rx > 1099511627776ull) { +@@ -945,7 +948,10 @@ void ife_print_long(struct interface *ptr) + } + tx = ptr->stats.tx_bytes; + short_tx = tx * 10; +- if (tx > 1125899906842624ull) { ++ if (tx > 1152921504606846976ull) { ++ short_tx = tx / 115292150460684697ull; ++ Text = "EiB"; ++ } else if (tx > 1125899906842624ull) { + short_tx /= 1125899906842624ull; + Text = "PiB"; + } else if (tx > 1099511627776ull) { diff --git a/SOURCES/net-tools-ifconfig-long-iface-crasher.patch b/SOURCES/net-tools-ifconfig-long-iface-crasher.patch new file mode 100644 index 0000000..c891939 --- /dev/null +++ b/SOURCES/net-tools-ifconfig-long-iface-crasher.patch @@ -0,0 +1,36 @@ +diff -up net-tools-2.0/lib/interface.c.long_iface net-tools-2.0/lib/interface.c +--- net-tools-2.0/lib/interface.c.long_iface 2012-10-04 11:35:27.983694933 +0200 ++++ net-tools-2.0/lib/interface.c 2012-10-04 11:35:27.991694805 +0200 +@@ -216,6 +216,7 @@ out: + + char *get_name(char **namep, char *p) + { ++ int count = 0; + while (isspace(*p)) + p++; + char *name = *namep = p; +@@ -224,7 +225,13 @@ char *get_name(char **namep, char *p) + break; + if (*p == ':') { /* could be an alias */ + char *dot = p++; +- while (*p && isdigit(*p)) p++; ++ count++; ++ while (*p && isdigit(*p)) { ++ p++; ++ count++; ++ if (count == (IFNAMSIZ-1)) ++ break; ++ } + if (*p == ':') { + /* Yes it is, backup and copy it. */ + p = dot; +@@ -240,6 +247,9 @@ char *get_name(char **namep, char *p) + break; + } + *name++ = *p++; ++ count++; ++ if (count == (IFNAMSIZ-1)) ++ break; + } + *name++ = '\0'; + return p; diff --git a/SOURCES/net-tools-interface-name-len.patch b/SOURCES/net-tools-interface-name-len.patch new file mode 100644 index 0000000..aa1d39a --- /dev/null +++ b/SOURCES/net-tools-interface-name-len.patch @@ -0,0 +1,59 @@ +diff --git a/netstat.c b/netstat.c +index c084dfb..cfcfb78 100644 +--- a/netstat.c ++++ b/netstat.c +@@ -743,6 +743,7 @@ static void igmp_do_one(int lnr, const char *line,const char *prot) + static int igmp6_flag = 0; + static char device[16]; + int num, idx, refcnt; ++ char* offset; + + if (lnr == 0) { + /* IPV6 ONLY */ +@@ -794,17 +795,21 @@ static void igmp_do_one(int lnr, const char *line,const char *prot) + #if HAVE_AFINET + if (line[0] != '\t') { + if (idx_flag) { +- if ((num = sscanf( line, "%d\t%10c", &idx, device)) < 2) { ++ if ((num = sscanf( line, "%d\t%15c", &idx, device)) < 2) { + fprintf(stderr, _("warning, got bogus igmp line %d.\n"), lnr); + return; + } + } else { +- if ( (num = sscanf( line, "%10c", device )) < 1 ) { ++ if ( (num = sscanf( line, "%15c", device )) < 1 ) { + fprintf(stderr, _("warning, got bogus igmp line %d.\n"), lnr); + return; + } + } +- device[10] = '\0'; ++ ++ offset = strrchr(device, ':'); ++ if(offset) ++ *offset = 0; ++ + return; + } else if ( line[0] == '\t' ) { + if ( (num = sscanf(line, "\t%8[0-9A-Fa-f] %d", mcast_addr, &refcnt)) < 2 ) { +@@ -2037,7 +2037,7 @@ static int iface_info(void) + if (flag_exp < 2) { + ife_short = 1; + if(!(count % 8)) +- printf(_("Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n")); ++ printf(_("Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n")); + } + + if (flag_int_name) { +diff --git a/lib/interface.c b/lib/interface.c +index 3bd999f..97f3db5 100644 +--- a/lib/interface.c ++++ b/lib/interface.c +@@ -655,7 +655,7 @@ int do_if_print(struct interface *ife, void *cookie) + + void ife_print_short(struct interface *ptr) + { +- printf("%-8.8s ", ptr->name); ++ printf("%-15.15s ", ptr->name); + printf("%5d ", ptr->mtu); + /* If needed, display the interface statistics. */ + if (ptr->statistics_valid) { diff --git a/SOURCES/net-tools-interface.patch b/SOURCES/net-tools-interface.patch new file mode 100644 index 0000000..ebe85db --- /dev/null +++ b/SOURCES/net-tools-interface.patch @@ -0,0 +1,102 @@ +diff -up net-tools-2.0/man/en_US/netstat.8.interface net-tools-2.0/man/en_US/netstat.8 +--- net-tools-2.0/man/en_US/netstat.8.interface 2012-10-04 11:31:00.753513633 +0200 ++++ net-tools-2.0/man/en_US/netstat.8 2012-10-04 11:31:00.755513607 +0200 +@@ -46,9 +46,9 @@ netstat \- Print network connections, ro + .RB [delay] + .P + .B netstat +-.RB { \-\-interfaces | \-i } ++.RB { \-\-interfaces | \-I | \-i } + .RB [ \-\-all | \-a ] +-.RB [ \-\-extend | \-e [ \-\-extend | \-e] ] ++.RB [ \-\-extend | \-e ] + .RB [ \-\-verbose | \-v ] + .RB [ \-\-program | \-p ] + .RB [ \-\-numeric | \-n ] +@@ -129,8 +129,8 @@ and + produce the same output. + .SS "\-\-groups , \-g" + Display multicast group membership information for IPv4 and IPv6. +-.SS "\-\-interfaces, \-i" +-Display a table of all network interfaces. ++.SS "\-\-interfaces=\fIiface \fR, \fB\-I=\fIiface \fR, \fB\-i" ++Display a table of all network interfaces, or the specified \fIiface\fR. + .SS "\-\-masquerade , \-M" + Display a list of masqueraded connections. + .SS "\-\-statistics , \-s" +diff -up net-tools-2.0/netstat.c.interface net-tools-2.0/netstat.c +--- net-tools-2.0/netstat.c.interface 2012-10-04 11:31:00.745513734 +0200 ++++ net-tools-2.0/netstat.c 2012-10-04 11:31:00.756513594 +0200 +@@ -143,6 +143,7 @@ char *Release = RELEASE, *Version = "net + #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; +@@ -1786,6 +1787,7 @@ static int rfcomm_info(void) + static int iface_info(void) + { + static int count=0; ++ struct interface *ife = NULL; + + if (skfd < 0) { + if ((skfd = sockets_open(0)) < 0) { +@@ -1800,7 +1802,11 @@ static int iface_info(void) + printf(_("Iface MTU 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); + } +@@ -1826,9 +1832,10 @@ static void usage(void) + { + fprintf(stderr, _("usage: netstat [-vWeenNcCF] [] -r netstat {-V|--version|-h|--help}\n")); + fprintf(stderr, _(" netstat [-vWnNcaeol] [ ...]\n")); +- fprintf(stderr, _(" netstat { [-vWeenNac] -i | [-cnNe] -M | -s [-6tuw] } [delay]\n\n")); ++ fprintf(stderr, _(" netstat { [-vWeenNac] -I[] | [-veenNac] -i | [-cnNe] -M | -s [-6tuw] } [delay]\n\n")); + + fprintf(stderr, _(" -r, --route display routing table\n")); ++ fprintf(stderr, _(" -I, --interfaces= display interface table for \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")); +@@ -1873,7 +1880,7 @@ int main + { + 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 +@@ -1917,7 +1924,7 @@ int main + getroute_init(); /* Set up AF routing support */ + + afname[0] = '\0'; +- while ((i = getopt_long(argc, argv, "A:CFMacdeghilnNoprsStuUvVWwx64?Z", longopts, &lop)) != EOF) ++ while ((i = getopt_long(argc, argv, "A:CFMacdeghiI::lnNoprsStuUvVWwx64?Z", longopts, &lop)) != EOF) + switch (i) { + case -1: + break; +@@ -1958,6 +1965,13 @@ int main + case 'p': + flag_prg++; + break; ++ case 'I': ++ if (optarg && strcmp(optarg, "(null)")) ++ if (optarg[0] == '=') optarg++; ++ if (optarg && strcmp(optarg, "(null)")) ++ flag_int_name = strdup(optarg); ++ flag_int++; ++ break; + case 'i': + flag_int++; + break; diff --git a/SOURCES/net-tools-interface_stack.patch b/SOURCES/net-tools-interface_stack.patch new file mode 100644 index 0000000..ca63278 --- /dev/null +++ b/SOURCES/net-tools-interface_stack.patch @@ -0,0 +1,129 @@ +diff -up net-tools-2.0/include/interface.h.stack net-tools-2.0/include/interface.h +--- net-tools-2.0/include/interface.h.stack 2013-05-23 05:27:34.000000000 +0200 ++++ net-tools-2.0/include/interface.h 2013-06-07 11:58:25.474623871 +0200 +@@ -72,7 +72,7 @@ extern int do_if_print(struct interface + + extern int procnetdev_version(char *buf); + extern int get_dev_fields(char *bp, struct interface *ife); +-extern char * get_name(char *name, char *p); ++extern char * get_name(char **namep, char *p); + + extern void ife_print(struct interface *ptr); + +diff -up net-tools-2.0/lib/interface.c.stack net-tools-2.0/lib/interface.c +--- net-tools-2.0/lib/interface.c.stack 2013-06-07 11:58:25.471623910 +0200 ++++ net-tools-2.0/lib/interface.c 2013-06-07 12:00:13.901191277 +0200 +@@ -214,10 +214,11 @@ out: + return err; + } + +-char *get_name(char *name, char *p) ++char *get_name(char **namep, char *p) + { + while (isspace(*p)) + p++; ++ char *name = *namep = p; + while (*p) { + if (isspace(*p)) + break; +@@ -320,9 +321,10 @@ int get_dev_fields(char *bp, struct inte + static int if_readlist_proc(char *target) + { + FILE *fh; +- char buf[512]; + struct interface *ife; + int err; ++ char *line = NULL; ++ size_t linelen = 0; + + fh = fopen(_PATH_PROCNET_DEV, "r"); + if (!fh) { +@@ -330,10 +332,11 @@ static int if_readlist_proc(char *target + _PATH_PROCNET_DEV, strerror(errno)); + return -2; + } +- if (fgets(buf, sizeof buf, fh)) +- /* eat line */; +- if (fgets(buf, sizeof buf, fh)) +- /* eat line */; ++ if (getline(&line, &linelen, fh) == -1 /* eat line */ ++ || getline(&line, &linelen, fh) == -1) { /* eat line */ ++ err = -1; ++ goto out; ++ } + + #if 0 /* pretty, but can't cope with missing fields */ + fmt = proc_gen_fmt(_PATH_PROCNET_DEV, 1, fh, +@@ -358,13 +361,13 @@ static int if_readlist_proc(char *target + 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 = if_cache_add(name); + get_dev_fields(s, ife); + ife->statistics_valid = 1; +@@ -379,6 +382,8 @@ static int if_readlist_proc(char *target + #if 0 + free(fmt); + #endif ++ out: ++ free(line); + fclose(fh); + return err; + } +@@ -386,24 +391,28 @@ static int if_readlist_proc(char *target + 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) { + 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); ++ } ++ if (getline(&line, &linelen, fh) == -1 /* eat line */ ++ || getline(&line, &linelen, fh) == -1) { /* eat line */ ++ 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)) + { +@@ -416,6 +425,8 @@ static int if_readlist_rep(char *target, + err = -1; + } + ++ out: ++ free(line); + fclose(fh); + return err; + } diff --git a/SOURCES/net-tools-ipx.patch b/SOURCES/net-tools-ipx.patch new file mode 100644 index 0000000..ec78145 --- /dev/null +++ b/SOURCES/net-tools-ipx.patch @@ -0,0 +1,31 @@ +diff -up net-tools-2.0/lib/ipx_gr.c.ipx net-tools-2.0/lib/ipx_gr.c +--- net-tools-2.0/lib/ipx_gr.c.ipx 2013-09-10 12:33:52.494047907 +0200 ++++ net-tools-2.0/lib/ipx_gr.c 2013-09-10 12:34:28.531561603 +0200 +@@ -72,7 +72,7 @@ int IPX_rprint(int options) + continue; + + /* Fetch and resolve the Destination */ +- (void) ap->input(5, net, &sa); ++ (void) ap->input(1, net, &sa); + safe_strncpy(net, ap->sprint(&sa, numeric), sizeof(net)); + + /* Fetch and resolve the Router Net */ +diff -up net-tools-2.0/netstat.c.ipx net-tools-2.0/netstat.c +--- net-tools-2.0/netstat.c.ipx 2013-09-10 12:33:52.491047948 +0200 ++++ net-tools-2.0/netstat.c 2013-09-10 12:33:52.495047894 +0200 +@@ -1643,13 +1643,13 @@ static int ipx_info(void) + } + + /* 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 & FLAG_NUM_HOST), 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 & FLAG_NUM_HOST), sizeof(buf)); + snprintf(dad, sizeof(dad), "%s:%04X", buf, dport); + } else diff --git a/SOURCES/net-tools-man.patch b/SOURCES/net-tools-man.patch new file mode 100644 index 0000000..b40e1a9 --- /dev/null +++ b/SOURCES/net-tools-man.patch @@ -0,0 +1,147 @@ +diff -up net-tools-2.0/man/en_US/arp.8.man net-tools-2.0/man/en_US/arp.8 +--- net-tools-2.0/man/en_US/arp.8.man 2013-02-19 10:28:11.000000000 +0100 ++++ net-tools-2.0/man/en_US/arp.8 2013-04-25 10:52:01.704114832 +0200 +@@ -63,6 +63,10 @@ arp \- manipulate the system ARP cache + .B \-f + .RI [ filename ] + ++.SH NOTE ++.P ++This program is obsolete. For replacement check \fBip neigh\fR. ++ + .SH DESCRIPTION + .B Arp + manipulates or displays the kernel's IPv4 network neighbour cache. It can add +@@ -219,6 +223,6 @@ published proxy ARP entries and permanen + .br + .I /etc/ethers + .SH SEE ALSO +-rarp(8), route(8), ifconfig(8), netstat(8) ++.BR ip(8) + .SH AUTHORS + Fred N. van Kempen , Bernd Eckenfels . +diff -up net-tools-2.0/man/en_US/ethers.5.man net-tools-2.0/man/en_US/ethers.5 +--- net-tools-2.0/man/en_US/ethers.5.man 2013-02-19 10:28:11.000000000 +0100 ++++ net-tools-2.0/man/en_US/ethers.5 2013-04-25 10:52:01.704114832 +0200 +@@ -26,6 +26,3 @@ can be resolved by DNS or a dot separate + .SH FILES \"{{{ + /etc/ethers + .\"}}} +-.SH "SEE ALSO" \"{{{ +-rarp(8) +-.\"}}} +diff -up net-tools-2.0/man/en_US/ifconfig.8.man net-tools-2.0/man/en_US/ifconfig.8 +--- net-tools-2.0/man/en_US/ifconfig.8.man 2013-02-19 10:28:11.000000000 +0100 ++++ net-tools-2.0/man/en_US/ifconfig.8 2013-04-25 10:52:01.704114832 +0200 +@@ -5,6 +5,13 @@ ifconfig \- configure a network interfac + .B "ifconfig [-v] [-a] [-s] [interface]" + .br + .B "ifconfig [-v] interface [aftype] options | address ..." ++ ++.SH NOTE ++.P ++This program is obsolete! ++For replacement check \fBip addr\fR and \fBip link\fR. ++For statistics use \fBip -s link\fR. ++ + .SH DESCRIPTION + .B Ifconfig + is used to configure the kernel-resident network interfaces. It is +@@ -222,7 +229,8 @@ package to display link layer informatio + While appletalk DDP and IPX addresses will be displayed they cannot be + altered by this command. + .SH SEE ALSO +-route(8), netstat(8), arp(8), rarp(8), iptables(8), ifup(8), interfaces(5). ++.BR ip(8), ++.BR iptables(8) + .br + http://physics.nist.gov/cuu/Units/binary.html - Prefixes for binary multiples + .SH AUTHORS +diff -up net-tools-2.0/man/en_US/mii-tool.8.man net-tools-2.0/man/en_US/mii-tool.8 +--- net-tools-2.0/man/en_US/mii-tool.8.man 2013-02-19 10:28:11.000000000 +0100 ++++ net-tools-2.0/man/en_US/mii-tool.8 2013-04-25 10:52:52.198414912 +0200 +@@ -18,6 +18,10 @@ mii\-tool \- view, manipulate media-inde + [\fB\-p\fR, \fB\-\-phy=\fIaddr\fR] + .RI "interface\ ..." + ++.SH NOTE ++.P ++This program is obsolete. 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 +@@ -93,6 +97,9 @@ SIOCGMIIPHY on 'eth?' failed: Operation + The interface in question does not support MII queries. Most likely, it does not have + MII transceivers, at all. + ++.SH SEE ALSO ++ethtool(8) ++ + .SH AUTHORS + David Hinds \- dhinds@pcmcia.sourceforge.org + .br +diff -up net-tools-2.0/man/en_US/nameif.8.man net-tools-2.0/man/en_US/nameif.8 +--- net-tools-2.0/man/en_US/nameif.8.man 2013-02-19 10:28:11.000000000 +0100 ++++ net-tools-2.0/man/en_US/nameif.8 2013-04-25 10:52:01.705114818 +0200 +@@ -5,6 +5,12 @@ nameif \- name network interfaces based + .B "nameif [\-c configfile] [\-s]" + .br + .B "nameif [\-c configfile] [\-s] {interface macaddress}" ++ ++.SH NOTE ++.P ++This program is obsolete. For replacement check \fBip link\fR. ++This functionality is also much better provided by udev methods. ++ + .SH DESCRIPTION + .B nameif + renames network interfaces based on mac addresses. When no arguments are +@@ -31,5 +37,10 @@ should be run before the interface is up + + .SH FILES + /etc/mactab ++ ++.SH SEE ALSO ++.BR ip(8), ++.BR udev(7) ++ + .SH BUGS + Only works for Ethernet currently. +diff -up net-tools-2.0/man/en_US/netstat.8.man net-tools-2.0/man/en_US/netstat.8 +--- net-tools-2.0/man/en_US/netstat.8.man 2013-04-25 10:52:01.693114984 +0200 ++++ net-tools-2.0/man/en_US/netstat.8 2013-04-25 10:52:01.705114818 +0200 +@@ -196,7 +196,8 @@ Show the PID and name of the program to + .SS "\-l, \-\-listening" + Show only listening sockets. (These are omitted by default.) + .SS "\-a, \-\-all" +-Show both listening and non-listening sockets. With the ++Show both listening and non-listening (for TCP this means established ++connections) sockets. With the + .B \-\-interfaces + option, show interfaces that are not up + .SS "\-F" +diff -up net-tools-2.0/man/en_US/route.8.man net-tools-2.0/man/en_US/route.8 +--- net-tools-2.0/man/en_US/route.8.man 2013-02-19 10:28:11.000000000 +0100 ++++ net-tools-2.0/man/en_US/route.8 2013-04-25 10:52:01.706114804 +0200 +@@ -52,6 +52,11 @@ If] + .RB [ \-\-version ] + .RB [ \-h ] + .RB [ \-\-help ] ++ ++.SH NOTE ++.P ++This program is obsolete. For replacement check \fBip route\fR. ++ + .SH DESCRIPTION + .B Route + manipulates the kernel's IP routing tables. Its primary use is to set +@@ -314,7 +319,7 @@ Whether or not the hardware address for + .I /proc/net/rt_cache + .LP + .SH SEE ALSO +-.I ifconfig(8), netstat(8), arp(8), rarp(8) ++.BR ip(8) + .LP + .SH HISTORY + .B Route diff --git a/SOURCES/net-tools-netstat-probe.patch b/SOURCES/net-tools-netstat-probe.patch new file mode 100644 index 0000000..04c1ecb --- /dev/null +++ b/SOURCES/net-tools-netstat-probe.patch @@ -0,0 +1,15 @@ +diff -up net-tools-2.0/netstat.c.probe net-tools-2.0/netstat.c +--- net-tools-2.0/netstat.c.probe 2012-10-04 11:36:15.085940621 +0200 ++++ net-tools-2.0/netstat.c 2012-10-04 11:36:15.092940511 +0200 +@@ -1267,6 +1267,11 @@ static void tcp_do_one(int lnr, const ch + (double) time_len / HZ, retr, timeout); + break; + ++ case 4: ++ snprintf(timers, sizeof(timers), _("probe (%2.2f/%ld/%d)"), ++ (double) time_len / HZ, retr, timeout); ++ break; ++ + default: + snprintf(timers, sizeof(timers), _("unkn-%d (%2.2f/%ld/%d)"), + timer_run, (double) time_len / HZ, retr, timeout); diff --git a/SOURCES/net-tools-netstat-sctp-man.patch b/SOURCES/net-tools-netstat-sctp-man.patch new file mode 100644 index 0000000..f9600ad --- /dev/null +++ b/SOURCES/net-tools-netstat-sctp-man.patch @@ -0,0 +1,74 @@ +diff --git a/man/de_DE/netstat.8 b/man/de_DE/netstat.8 +index d6b77ff..fdb76c9 100644 +--- a/man/de_DE/netstat.8 ++++ b/man/de_DE/netstat.8 +@@ -20,6 +20,8 @@ netstat \- Anzeige von Netzwerksverbindungen, Routentabellen, Schnittstellenstat + .RB [ \-venaoc ] + .RB [ \-\-tcp | \-t ] + .RB [ \-\-udp | \-u ] ++.RB [ \-\-udplite | \-U ] ++.RB [ \-\-sctp | \-S ] + .RB [ \-\-raw | \-w ] + .RB [ \-\-groups | \-g ] + .RB [ \-\-unix | \-x ] +diff --git a/man/en_US/netstat.8 b/man/en_US/netstat.8 +index 831faf2..7fcd41b 100644 +--- a/man/en_US/netstat.8 ++++ b/man/en_US/netstat.8 +@@ -21,6 +21,7 @@ netstat \- Print network connections, routing tables, interface statistics, masq + .RB [ \-\-tcp | \-t ] + .RB [ \-\-udp | \-u ] + .RB [ \-\-udplite | \-U ] ++.RB [ \-\-sctp | \-S ] + .RB [ \-\-raw | \-w ] + .RB [ \-\-listening | \-l ] + .RB [ \-\-all | \-a ] +@@ -76,6 +77,7 @@ netstat \- Print network connections, routing tables, interface statistics, masq + .RB [ \-\-tcp | \-t ] + .RB [ \-\-udp | \-u ] + .RB [ \-\-udplite | \-U ] ++.RB [ \-\-sctp | \-S ] + .RB [ \-\-raw | \-w ] + .RB [delay] + .P +diff --git a/man/fr_FR/netstat.8 b/man/fr_FR/netstat.8 +index fedbe4f..c65d0be 100644 +--- a/man/fr_FR/netstat.8 ++++ b/man/fr_FR/netstat.8 +@@ -21,6 +21,8 @@ et les membres multicast. + .RB [ \-venaoc ] + .RB [ \-\-tcp | \-t ] + .RB [ \-\-udp | \-u ] ++.RB [ \-\-udplite | \-U ] ++.RB [ \-\-sctp | \-S ] + .RB [ \-\-raw | \-w ] + .RB [ \-\-groups | \-g ] + .RB [ \-\-unix | \-x ] +diff --git a/man/pt_BR/netstat.8 b/man/pt_BR/netstat.8 +index 1903bbb..d2d04ef 100644 +--- a/man/pt_BR/netstat.8 ++++ b/man/pt_BR/netstat.8 +@@ -19,6 +19,8 @@ mascaradas. + .RB [ \-venaoc ] + .RB [ \-\-tcp | \-t ] + .RB [ \-\-udp | \-u ] ++.RB [ \-\-udplite | \-U ] ++.RB [ \-\-sctp | \-S ] + .RB [ \-\-raw | \-w ] + .RB [ \-\-unix | \-x ] + .RB [ \-\-inet | \-\-ip ] +diff --git a/netstat.c b/netstat.c +index 43bd62f..ca93260 100644 +--- a/netstat.c ++++ b/netstat.c +@@ -2094,8 +2095,8 @@ static void usage(void) + fprintf(stderr, _(" -Z, --context display SELinux security context for sockets\n")); + #endif + +- fprintf(stderr, _("\n ={-t|--tcp} {-u|--udp} {-U|--udplite} {-w|--raw} {-x|--unix}\n")); +- fprintf(stderr, _(" --ax25 --ipx --netrom\n")); ++ fprintf(stderr, _("\n ={-t|--tcp} {-u|--udp} {-U|--udplite} {-S|--sctp} {-w|--raw}\n")); ++ fprintf(stderr, _(" {-x|--unix} --ax25 --ipx --netrom\n")); + fprintf(stderr, _(" =Use '-6|-4' or '-A ' or '--'; default: %s\n"), DFLT_AF); + fprintf(stderr, _(" List of possible address families (which support routing):\n")); + print_aflist(1); /* 1 = routeable */ diff --git a/SOURCES/net-tools-route-inet6-output.patch b/SOURCES/net-tools-route-inet6-output.patch new file mode 100644 index 0000000..ef20b03 --- /dev/null +++ b/SOURCES/net-tools-route-inet6-output.patch @@ -0,0 +1,10 @@ +--- a/lib/inet6_gr.c ++++ b/lib/inet6_gr.c +@@ -146,7 +146,7 @@ + strcat(flags, "f"); + + /* Print the info. */ +- printf("%-30s %-26s %-4s %-3d %-1d%6d %s\n", ++ printf("%-30s %-26s %-4s %-3d %-1d %6d %s\n", + addr6, naddr6, flags, metric, refcnt, use, iface); + } diff --git a/SOURCES/net-tools-sctp-quiet.patch b/SOURCES/net-tools-sctp-quiet.patch new file mode 100644 index 0000000..a17e064 --- /dev/null +++ b/SOURCES/net-tools-sctp-quiet.patch @@ -0,0 +1,33 @@ +diff --git a/netstat.c b/netstat.c +index 911d0c3..d6037a0 100644 +--- a/netstat.c ++++ b/netstat.c +@@ -167,6 +167,7 @@ int flag_exp = 1; + int flag_wide= 0; + int flag_prg = 0; + int flag_arg = 0; ++int flag_noprot = 0; + int flag_ver = 0; + int flag_l2cap = 0; + int flag_rfcomm = 0; +@@ -181,9 +182,9 @@ FILE *procinfo; + perror((file)); \ + return -1; \ + } \ +- if (flag_arg || flag_ver) \ ++ if (!flag_noprot && (flag_arg || flag_ver)) \ + ESYSNOT("netstat", (name)); \ +- if (flag_arg) \ ++ if (!flag_noprot && flag_arg) \ + rc = 1; \ + } else { \ + do { \ +@@ -2308,7 +2309,7 @@ int main + + if ((flag_inet || flag_inet6 || flag_sta) && + !(flag_tcp || flag_sctp || flag_udp || flag_udplite || flag_raw)) +- flag_tcp = flag_sctp = flag_udp = flag_udplite = flag_raw = 1; ++ flag_noprot = flag_tcp = flag_sctp = flag_udp = flag_udplite = flag_raw = 1; + + if ((flag_tcp || flag_sctp || flag_udp || flag_udplite || flag_raw || flag_igmp) && + !(flag_inet || flag_inet6)) diff --git a/SOURCES/net-tools-sctp-statistics.patch b/SOURCES/net-tools-sctp-statistics.patch new file mode 100644 index 0000000..b84b8aa --- /dev/null +++ b/SOURCES/net-tools-sctp-statistics.patch @@ -0,0 +1,534 @@ +diff -up net-tools-2.0/netstat.c.sctp net-tools-2.0/netstat.c +--- net-tools-2.0/netstat.c.sctp 2013-09-23 15:14:59.524866201 +0200 ++++ net-tools-2.0/netstat.c 2013-09-23 15:24:20.259143969 +0200 +@@ -115,7 +115,7 @@ + #endif + + /* prototypes for statistics.c */ +-int parsesnmp(int, int, int); ++int parsesnmp(int, int, int, int); + void inittab(void); + int parsesnmp6(int, int, int); + void inittab6(void); +@@ -888,159 +888,269 @@ static int igmp_info(void) + igmp_do_one, "igmp", "igmp6"); + } + +-static int ip_parse_dots(uint32_t *addr, char const *src) { +- unsigned a, b, c, d; +- unsigned ret = 4-sscanf(src, "%u.%u.%u.%u", &a, &b, &c, &d); +- *addr = htonl((a << 24)|(b << 16)|(c << 8)|d); +- return ret; +-} +- +-static void print_ip_service(struct sockaddr_in *addr, char const *protname, +- char *buf, unsigned size) { +- struct aftype *ap; +- +- if(size == 0) return; +- +- /* print host */ +- if((ap = get_afntype(addr->sin_family)) == NULL) { +- fprintf(stderr, _("netstat: unsupported address family %d !\n"), +- addr->sin_family); +- return; +- } +- safe_strncpy(buf, ap->sprint((struct sockaddr*)addr, flag_not), size); +- +- /* print service */ +- if(flag_all || (flag_lst && !addr->sin_port) || (!flag_lst && addr->sin_port)) { +- char bfs[32]; +- +- snprintf(bfs, sizeof(bfs), "%s", +- get_sname(addr->sin_port, (char*)protname, flag_not & FLAG_NUM_PORT)); +- +- /* check if we must cut on host and/or service name */ +- { +- unsigned const bufl = strlen(buf); +- unsigned const bfsl = strlen(bfs); +- +- if(bufl+bfsl+2 > size) { +- unsigned const half = (size-2)>>1; +- if(bufl > half) { +- if(bfsl > half) { +- buf[size-2-half] = '\0'; +- bfs[half+1] = '\0'; +- } +- else buf[size-2-bfsl] = '\0'; +- } +- else bfs[size-2-bufl] = '\0'; +- } ++static const char *sctp_socket_state_str(int state) ++{ ++ if(state>=0 && state<=10) ++ return tcp_state[state]; ++ else { ++ static char state_str_buf[64]; ++ sprintf(state_str_buf,"UNKNOWN(%d)",state); ++ return state_str_buf; + } +- strcat(buf, ":"); +- strcat(buf, bfs); +- } + } + +-/* process single SCTP endpoint */ +-static void sctp_do_ept(int lnr, char const *line, const char *prot) ++static struct aftype *process_sctp_addr_str(const char *addr_str, struct sockaddr *sa) + { +- struct sockaddr_in laddr, raddr; +- unsigned uid, inode; +- +- char l_addr[23], r_addr[23]; +- +- /* fill sockaddr_in structures */ +- { +- unsigned lport; +- unsigned ate; +- +- if(lnr == 0) return; +- if(sscanf(line, "%*X %*X %*u %*u %*u %u %u %u %n", +- &lport, &uid, &inode, &ate) < 3) goto err; +- +- /* decode IP address */ +- if(ip_parse_dots(&laddr.sin_addr.s_addr, line+ate)) goto err; +- raddr.sin_addr.s_addr = htonl(0); +- laddr.sin_family = raddr.sin_family = AF_INET; +- laddr.sin_port = htons(lport); +- raddr.sin_port = htons(0); +- } ++ if (strchr(addr_str,':')) { ++#if HAVE_AFINET6 ++ extern struct aftype inet6_aftype; ++ /* Demangle what the kernel gives us */ ++ struct in6_addr in6; ++ char addr6_str[INET6_ADDRSTRLEN]; ++ unsigned u0,u1,u2,u3,u4,u5,u6,u7; ++ sscanf(addr_str, "%04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X", ++ &u0, &u1, &u2, &u3, &u4, &u5, &u6, &u7); ++ in6.s6_addr16[0] = htons(u0); ++ in6.s6_addr16[1] = htons(u1); ++ in6.s6_addr16[2] = htons(u2); ++ in6.s6_addr16[3] = htons(u3); ++ in6.s6_addr16[4] = htons(u4); ++ in6.s6_addr16[5] = htons(u5); ++ in6.s6_addr16[6] = htons(u6); ++ in6.s6_addr16[7] = htons(u7); ++ ++ inet_ntop(AF_INET6, &in6, addr6_str, sizeof(addr6_str)); ++ inet6_aftype.input(1, addr6_str, sa); ++ sa->sa_family = AF_INET6; ++#endif ++ } else { ++ ((struct sockaddr_in*)sa)->sin_addr.s_addr = inet_addr(addr_str); ++ sa->sa_family = AF_INET; ++ } ++ return get_afntype(sa->sa_family); ++} + +- /* print IP:service to l_addr and r_addr */ +- print_ip_service(&laddr, prot, l_addr, sizeof(l_addr)); +- print_ip_service(&raddr, prot, r_addr, sizeof(r_addr)); +- +- /* Print line */ +- printf("%-4s %6d %6d %-*s %-*s %-11s", +- prot, 0, 0, +- (int)netmax(23,strlen(l_addr)), l_addr, +- (int)netmax(23,strlen(r_addr)), r_addr, +- _(tcp_state[TCP_LISTEN])); +- finish_this_one(uid, inode, ""); +- return; +- err: +- fprintf(stderr, "SCTP error in line: %d\n", lnr); +-} +- +-/* process single SCTP association */ +-static void sctp_do_assoc(int lnr, char const *line, const char *prot) +-{ +- struct sockaddr_in laddr, raddr; +- unsigned long rxq, txq; +- unsigned uid, inode; +- +- char l_addr[23], r_addr[23]; +- +- /* fill sockaddr_in structures */ +- { +- unsigned lport, rport; +- unsigned ate; +- char const *addr; +- +- if(lnr == 0) return; +- if(sscanf(line, "%*X %*X %*u %*u %*u %*u %*u %lu %lu %u %u %u %u %n", +- &txq, &rxq, &uid, &inode, &lport, &rport, &ate) < 6) goto err; +- +- /* decode IP addresses */ +- addr = strchr(line+ate, '*'); +- if(addr == 0) goto err; +- if(ip_parse_dots(&laddr.sin_addr.s_addr, ++addr)) goto err; +- addr = strchr(addr, '*'); +- if(addr == 0) goto err; +- if(ip_parse_dots(&raddr.sin_addr.s_addr, ++addr)) goto err; +- +- /* complete sockaddr_in structures */ +- laddr.sin_family = raddr.sin_family = AF_INET; +- laddr.sin_port = htons(lport); +- raddr.sin_port = htons(rport); +- } ++static void sctp_eps_do_one(int lnr, char *line, const char *proto) ++{ ++ char buffer[1024]; ++ int state, port; ++ int uid; ++ unsigned long inode; ++ struct aftype *ap; ++#if HAVE_AFINET6 ++ struct sockaddr_in6 localaddr; ++#else ++ struct sockaddr_in localaddr; ++#endif ++ const char *sst_str; ++ const char *lport_str; ++ const char *uid_str; ++ const char *inode_str; ++ char *laddrs_str; ++ ++ if(lnr == 0) { ++ /* ENDPT SOCK STY SST HBKT LPORT UID INODE LADDRS */ ++ return; ++ } ++ strtok(line," \t\n"); /*skip endpt*/ ++ strtok(0," \t\n"); /*skip sock*/ ++ strtok(0," \t\n"); /*skp sty*/ ++ sst_str = strtok(0," \t\n"); ++ strtok(0," \t\n"); /*skip hash bucket*/ ++ lport_str=strtok(0," \t\n"); ++ uid_str = strtok(0," \t\n"); ++ inode_str = strtok(0," \t\n"); ++ laddrs_str=strtok(0,"\t\n"); ++ ++ if (!sst_str || !lport_str || !uid_str || !inode_str) { ++ fprintf(stderr, _("warning, got bogus sctp eps line.\n")); ++ return; ++ } ++ state = atoi(sst_str); ++ port = atoi(lport_str); ++ uid = atoi(uid_str); ++ inode = strtoul(inode_str,0,0); ++ ++ const char *this_local_addr; ++ int first=1; ++ char local_port[16]; ++ snprintf(local_port, sizeof(local_port), "%s", ++ get_sname(htons(port), proto, flag_not & FLAG_NUM_PORT)); ++ for(this_local_addr=strtok(laddrs_str," \t\n"); ++ this_local_addr; ++ this_local_addr=strtok(0," \t\n")) ++ { ++ char local_addr[64]; ++ ap = process_sctp_addr_str(this_local_addr, (struct sockaddr*)&localaddr); ++ if(ap) ++ safe_strncpy(local_addr, ++ ap->sprint((struct sockaddr *) &localaddr, flag_not), ++ sizeof(local_addr)); ++ else ++ sprintf(local_addr,_("unsupported address family %d"), ((struct sockaddr*)&localaddr)->sa_family); ++ ++ if(!first) printf("\n"); ++ if(first) ++ printf("sctp "); ++ else ++ printf(" "); ++ sprintf(buffer,"%s:%s", local_addr, local_port); ++ printf("%-47s", buffer); ++ printf(" %-11s", first?sctp_socket_state_str(state):""); ++ first = 0; ++ } ++ finish_this_one(uid,inode,""); ++} ++ ++static void sctp_assoc_do_one(int lnr, char *line, const char *proto) ++{ ++ char buffer[1024]; ++ int state, lport,rport; ++ int uid; ++ unsigned rxqueue,txqueue; ++ unsigned long inode; ++ ++ struct aftype *ap; ++#if HAVE_AFINET6 ++ struct sockaddr_in6 localaddr,remoteaddr; ++#else ++ struct sockaddr_in localaddr,remoteaddr; ++#endif ++ const char *sst_str; ++ const char *txqueue_str; ++ const char *rxqueue_str; ++ const char *lport_str,*rport_str; ++ const char *uid_str; ++ const char *inode_str; ++ char *laddrs_str; ++ char *raddrs_str; ++ ++ if(lnr == 0) { ++ /* ASSOC SOCK STY SST ST HBKT ASSOC-ID TX_QUEUE RX_QUEUE UID INODE LPORT RPORT LADDRS <-> RADDRS */ ++ return; ++ } ++ ++ strtok(line," \t\n"); /*skip assoc*/ ++ strtok(0," \t\n"); /*skip sock*/ ++ strtok(0," \t\n"); /*skp sty*/ ++ sst_str = strtok(0," \t\n"); ++ strtok(0," \t\n"); ++ strtok(0," \t\n"); /*skip hash bucket*/ ++ strtok(0," \t\n"); /*skip hash assoc-id*/ ++ txqueue_str = strtok(0," \t\n"); ++ rxqueue_str = strtok(0," \t\n"); ++ uid_str = strtok(0," \t\n"); ++ inode_str = strtok(0," \t\n"); ++ lport_str=strtok(0," \t\n"); ++ rport_str=strtok(0," \t\n"); ++ laddrs_str = strtok(0,"<->\t\n"); ++ raddrs_str = strtok(0,"<->\t\n"); ++ ++ if (!sst_str || !txqueue_str || !rxqueue_str || !uid_str || ++ !inode_str || !lport_str || !rport_str) { ++ fprintf(stderr, _("warning, got bogus sctp assoc line.\n")); ++ return; ++ } ++ ++ state = atoi(sst_str); ++ txqueue = atoi(txqueue_str); ++ rxqueue = atoi(rxqueue_str); ++ uid = atoi(uid_str); ++ inode = strtoul(inode_str,0,0); ++ lport = atoi(lport_str); ++ rport = atoi(rport_str); ++ ++ /*print all addresses*/ ++ const char *this_local_addr; ++ const char *this_remote_addr; ++ char *ss1,*ss2; ++ int first=1; ++ char local_port[16]; ++ char remote_port[16]; ++ snprintf(local_port, sizeof(local_port), "%s", ++ get_sname(htons(lport), proto, ++ flag_not & FLAG_NUM_PORT)); ++ snprintf(remote_port, sizeof(remote_port), "%s", ++ get_sname(htons(rport), proto, ++ flag_not & FLAG_NUM_PORT)); ++ ++ this_local_addr=strtok_r(laddrs_str," \t\n",&ss1); ++ this_remote_addr=strtok_r(raddrs_str," \t\n",&ss2); ++ while(this_local_addr || this_remote_addr) { ++ char local_addr[64]; ++ char remote_addr[64]; ++ ++ if(this_local_addr) { ++ if (this_local_addr[0] == '*') { ++ /* skip * */ ++ this_local_addr++; ++ } ++ ap = process_sctp_addr_str(this_local_addr, (struct sockaddr*)&localaddr); ++ if(ap) ++ safe_strncpy(local_addr, ++ ap->sprint((struct sockaddr *) &localaddr, flag_not), sizeof(local_addr)); ++ else ++ sprintf(local_addr,_("unsupported address family %d"), ((struct sockaddr*)&localaddr)->sa_family); ++ } ++ if(this_remote_addr) { ++ if (this_remote_addr[0] == '*') { ++ /* skip * */ ++ this_remote_addr++; ++ } ++ ap = process_sctp_addr_str(this_remote_addr, (struct sockaddr*)&remoteaddr); ++ if(ap) ++ safe_strncpy(remote_addr, ++ ap->sprint((struct sockaddr *) &remoteaddr, flag_not), sizeof(remote_addr)); ++ else ++ sprintf(remote_addr,_("unsupported address family %d"), ((struct sockaddr*)&remoteaddr)->sa_family); ++ } + +- /* print IP:service to l_addr and r_addr */ +- print_ip_service(&laddr, prot, l_addr, sizeof(l_addr)); +- print_ip_service(&raddr, prot, r_addr, sizeof(r_addr)); +- +- /* Print line */ +- printf("%-4s %6ld %6ld %-*s %-*s %-11s", +- prot, rxq, txq, +- (int)netmax(23,strlen(l_addr)), l_addr, +- (int)netmax(23,strlen(r_addr)), r_addr, +- _(tcp_state[TCP_ESTABLISHED])); +- finish_this_one(uid, inode, ""); +- return; +- err: +- fprintf(stderr, "SCTP error in line: %d\n", lnr); ++ if(!first) printf("\n"); ++ if(first) ++ printf("sctp %6u %6u ", rxqueue, txqueue); ++ else ++ printf(" "); ++ if(this_local_addr) { ++ if(first) ++ sprintf(buffer,"%s:%s", local_addr, local_port); ++ else ++ sprintf(buffer,"%s", local_addr); ++ printf("%-23s", buffer); ++ } else ++ printf("%-23s", ""); ++ printf(" "); ++ if(this_remote_addr) { ++ if(first) ++ sprintf(buffer,"%s:%s", remote_addr, remote_port); ++ else ++ sprintf(buffer,"%s", remote_addr); ++ printf("%-23s", buffer); ++ } else ++ printf("%-23s", ""); ++ ++ printf(" %-11s", first?sctp_socket_state_str(state):""); ++ ++ first = 0; ++ this_local_addr=strtok_r(0," \t\n",&ss1); ++ this_remote_addr=strtok_r(0," \t\n",&ss2); ++ } ++ finish_this_one(uid,inode,""); + } + +-static int sctp_info_epts(void) { ++static int sctp_info_eps(void) ++{ + INFO_GUTS6(_PATH_PROCNET_SCTPEPTS, _PATH_PROCNET_SCTP6EPTS, "AF INET (sctp)", +- sctp_do_ept, "sctp", "sctp6"); ++ sctp_eps_do_one, "sctp", "sctp6"); + } + + static int sctp_info_assocs(void) { + INFO_GUTS6(_PATH_PROCNET_SCTPASSOCS, _PATH_PROCNET_SCTP6ASSOCS, "AF INET (sctp)", +- sctp_do_assoc, "sctp", "sctp6"); ++ sctp_assoc_do_one, "sctp", "sctp6"); + } + + static int sctp_info(void) { + int res; +- res = sctp_info_epts(); ++ res = sctp_info_eps(); + if(res) return res; + return sctp_info_assocs(); + } +@@ -2234,7 +2344,7 @@ int main + if (!strcmp(afname, "inet")) { + #if HAVE_AFINET + inittab(); +- i = parsesnmp(flag_raw, flag_tcp, flag_udp); ++ i = parsesnmp(flag_raw, flag_tcp, flag_udp, flag_sctp); + #else + ENOSUPP("netstat", "AF INET"); + #endif +diff -up net-tools-2.0/statistics.c.sctp net-tools-2.0/statistics.c +--- net-tools-2.0/statistics.c.sctp 2013-09-23 15:14:59.501866518 +0200 ++++ net-tools-2.0/statistics.c 2013-09-23 15:14:59.534866063 +0200 +@@ -21,7 +21,7 @@ + #define UFWARN(x) + #endif + +-int print_static,f_raw,f_tcp,f_udp,f_unknown = 1; ++int print_static,f_raw,f_tcp,f_udp,f_sctp,f_unknown = 1; + + enum State { + number = 0, opt_number, i_forward, i_inp_icmp, i_outp_icmp, i_rto_alg, +@@ -299,6 +299,27 @@ struct entry Tcpexttab[] = + { "TCPRenoRecoveryFail", N_("%llu classic Reno fast retransmits failed"), opt_number }, + }; + ++struct entry Sctptab[] = ++{ ++ {"SctpCurrEstab", N_("%llu Current Associations"), number}, ++ {"SctpActiveEstabs", N_("%llu Active Associations"), number}, ++ {"SctpPassiveEstabs", N_("%llu Passive Associations"), number}, ++ {"SctpAborteds", N_("%llu Number of Aborteds "), number}, ++ {"SctpShutdowns", N_("%llu Number of Graceful Terminations"), number}, ++ {"SctpOutOfBlues", N_("%llu Number of Out of Blue packets"), number}, ++ {"SctpChecksumErrors", N_("%llu Number of Packets with invalid Checksum"), number}, ++ {"SctpOutCtrlChunks", N_("%llu Number of control chunks sent"), number}, ++ {"SctpOutOrderChunks", N_("%llu Number of ordered chunks sent"), number}, ++ {"SctpOutUnorderChunks", N_("%llu Number of Unordered chunks sent"), number}, ++ {"SctpInCtrlChunks", N_("%llu Number of control chunks received"), number}, ++ {"SctpInOrderChunks", N_("%llu Number of ordered chunks received"), number}, ++ {"SctpInUnorderChunks", N_("%llu Number of Unordered chunks received"), number}, ++ {"SctpFragUsrMsgs", N_("%llu Number of messages fragmented"), number}, ++ {"SctpReasmUsrMsgs", N_("%llu Number of messages reassembled "), number}, ++ {"SctpOutSCTPPacks", N_("%llu Number of SCTP packets sent"), number}, ++ {"SctpInSCTPPacks", N_("%llu Number of SCTP packets received"), number}, ++}; ++ + struct tabtab { + char *title; + struct entry *tab; +@@ -312,6 +333,7 @@ struct tabtab snmptabs[] = + {"Icmp", Icmptab, sizeof(Icmptab), &f_raw}, + {"Tcp", Tcptab, sizeof(Tcptab), &f_tcp}, + {"Udp", Udptab, sizeof(Udptab), &f_udp}, ++ {"Sctp", Sctptab, sizeof(Sctptab), &f_sctp}, + {"TcpExt", Tcpexttab, sizeof(Tcpexttab), &f_tcp}, + {NULL} + }; +@@ -502,11 +524,38 @@ void process6_fd(FILE *f) + + } + +-int parsesnmp(int flag_raw, int flag_tcp, int flag_udp) ++/* Process a file with name-value lines (like /proc/net/sctp/snmp) */ ++void process_fd2(FILE *f, const char *filename) ++{ ++ char buf1[1024]; ++ char *sp; ++ struct tabtab *tab; ++ ++ tab = newtable(snmptabs, "Sctp"); ++ ++ while (fgets(buf1, sizeof buf1, f)) { ++ sp = buf1 + strcspn(buf1, " \t\n"); ++ if (!sp) { ++ fprintf(stderr,_("error parsing %s\n"), filename); ++ return; ++ } ++ *sp = '\0'; ++ sp++; ++ ++ sp += strspn(sp, " \t\n"); ++ ++ if (*sp != '\0' && *(tab->flag)) ++ printval(tab, buf1, strtoul(sp, 0, 10)); ++ } ++ return; ++} ++ ++int parsesnmp(int flag_raw, int flag_tcp, int flag_udp, int flag_sctp) ++ + { + FILE *f; + +- f_raw = flag_raw; f_tcp = flag_tcp; f_udp = flag_udp; ++ f_raw = flag_raw; f_tcp = flag_tcp; f_udp = flag_udp; f_sctp = flag_sctp; + + f = proc_fopen("/proc/net/snmp"); + if (!f) { +@@ -539,6 +588,17 @@ int parsesnmp(int flag_raw, int flag_tcp + + fclose(f); + } ++ ++ f = proc_fopen("/proc/net/sctp/snmp"); ++ if (f) { ++ process_fd2(f,"/proc/net/sctp/snmp"); ++ if (ferror(f)) { ++ perror("/proc/net/sctp/snmp"); ++ fclose(f); ++ return(1); ++ } ++ } ++ + return(0); + } + diff --git a/SOURCES/net-tools-statalias.patch b/SOURCES/net-tools-statalias.patch new file mode 100644 index 0000000..b544ff4 --- /dev/null +++ b/SOURCES/net-tools-statalias.patch @@ -0,0 +1,16 @@ +diff -up net-tools-2.0/lib/interface.c.statalias net-tools-2.0/lib/interface.c +--- net-tools-2.0/lib/interface.c.statalias 2012-10-04 11:33:05.490889090 +0200 ++++ net-tools-2.0/lib/interface.c 2012-10-04 11:33:05.513888785 +0200 +@@ -405,9 +405,11 @@ static int if_readlist_rep(char *target, + 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/SPECS/net-tools.spec b/SPECS/net-tools.spec new file mode 100644 index 0000000..430467a --- /dev/null +++ b/SPECS/net-tools.spec @@ -0,0 +1,919 @@ +%global checkout 20131004git + +Summary: Basic networking tools +Name: net-tools +Version: 2.0 +Release: 0.25.%{checkout}%{?dist} +License: GPLv2+ +Group: System Environment/Base +URL: http://sourceforge.net/projects/net-tools/ + +# git archive --format=tar --remote=git://git.code.sf.net/p/net-tools/code master | xz > net-tools-%%{version}.%%{checkout}.tar.xz +Source0: net-tools-%{version}.%{checkout}.tar.xz +Source1: net-tools-config.h +Source2: net-tools-config.make +Source3: ether-wake.c +Source4: ether-wake.8 +Source5: mii-diag.c +Source6: mii-diag.8 +Source7: iptunnel.8 +Source8: ipmaddr.8 +Source9: arp-ethers.service + +# adds option that allows netstat to cycle printing through statistics every delay seconds. +Patch1: net-tools-cycle.patch + +# Fixed incorrect address display for ipx (#46434) +Patch2: net-tools-ipx.patch + +# various man page fixes merged into one patch +Patch3: net-tools-man.patch + +# netstat: interface option now works as described in the man page (#61113, #115987) +Patch4: net-tools-interface.patch + +# filter out duplicate tcp entries (#139407) +Patch5: net-tools-duplicate-tcp.patch + +# don't report statistics for virtual devices (#143981) +Patch6: net-tools-statalias.patch + +# clear static buffers in interface.c by Ulrich Drepper (#176714) +Patch7: net-tools-interface_stack.patch + +# statistics for SCTP +Patch8: net-tools-sctp-statistics.patch + +# ifconfig crash when interface name is too long (#190703) +Patch9: net-tools-ifconfig-long-iface-crasher.patch + +# fixed tcp timers info in netstat (#466845) +Patch10: net-tools-netstat-probe.patch + +# use all interfaces instead of default (#1003875) +Patch20: ether-wake-interfaces.patch + +# make sctp quiet on systems without sctp (#1063906) +Patch21: net-tools-sctp-quiet.patch + +# make net-tools exit with correct exit code when provided with wrong parameters +Patch22: net-tools-correct-exit-code.patch + +# make ifconfig accurately round exabytes +Patch23: net-tools-ifconfig-EiB.patch + +# sctp was not documented in help and manpage +Patch24: net-tools-netstat-sctp-man.patch + +# output of interface names was restricted to 8-10 characters max +Patch25: net-tools-interface-name-len.patch + +# output of route -A inet6 is missing a space +Patch26: net-tools-route-inet6-output.patch + +BuildRequires: gettext, libselinux +BuildRequires: libselinux-devel +BuildRequires: systemd-units +Requires(post): systemd-units + +%description +The net-tools package contains basic networking tools, +including ifconfig, netstat, route, and others. +Most of them are obsolete. For replacement check iproute package. + +%prep +%setup -q -c +%patch1 -p1 -b .cycle +%patch2 -p1 -b .ipx +%patch3 -p1 -b .man +%patch4 -p1 -b .interface +%patch5 -p1 -b .dup-tcp +%patch6 -p1 -b .statalias +%patch7 -p1 -b .stack +%patch8 -p1 -b .sctp +%patch9 -p1 -b .long_iface +%patch10 -p1 -b .probe + +cp %SOURCE1 ./config.h +cp %SOURCE2 ./config.make +cp %SOURCE3 . +cp %SOURCE4 ./man/en_US +cp %SOURCE5 . +cp %SOURCE6 ./man/en_US +cp %SOURCE7 ./man/en_US +cp %SOURCE8 ./man/en_US + +%patch20 -p1 -b .interfaces +%patch21 -p1 -b .sctp-quiet +%patch22 -p1 -b .exit-code +%patch23 -p1 -b .round-EiB +%patch24 -p1 -b .sctp-man +%patch25 -p1 -b .interface-name-len +%patch26 -p1 -b .route-inet6-output + +touch ./config.h + +%build +# Sparc and s390 arches need to use -fPIE +%ifarch sparcv9 sparc64 s390 s390x +export CFLAGS="$RPM_OPT_FLAGS $CFLAGS -fPIE" +%else +export CFLAGS="$RPM_OPT_FLAGS $CFLAGS -fpie" +%endif +# RHBZ #853193 +export LDFLAGS="$LDFLAGS -pie -Wl,-z,relro -Wl,-z,now" + +make +make ether-wake +gcc $RPM_OPT_FLAGS -o mii-diag mii-diag.c + +%install +mv man/de_DE man/de +mv man/fr_FR man/fr +mv man/pt_BR man/pt + +make BASEDIR=%{buildroot} mandir=%{_mandir} install + +# ifconfig and route are installed into /bin by default +# mv them back to /sbin for now as I (jpopelka) don't think customers would be happy +mv %{buildroot}/bin/ifconfig %{buildroot}/sbin +mv %{buildroot}/bin/route %{buildroot}/sbin + +install -m 755 ether-wake %{buildroot}/sbin +install -m 755 mii-diag %{buildroot}/sbin + +rm %{buildroot}/sbin/rarp +rm %{buildroot}%{_mandir}/man8/rarp.8* +rm %{buildroot}%{_mandir}/de/man8/rarp.8* +rm %{buildroot}%{_mandir}/fr/man8/rarp.8* +rm %{buildroot}%{_mandir}/pt/man8/rarp.8* + +# remove hostname (has its own package) +rm %{buildroot}/bin/dnsdomainname +rm %{buildroot}/bin/domainname +rm %{buildroot}/bin/hostname +rm %{buildroot}/bin/nisdomainname +rm %{buildroot}/bin/ypdomainname +rm -rf %{buildroot}%{_mandir}/de/man1 +rm -rf %{buildroot}%{_mandir}/fr/man1 +rm -rf %{buildroot}%{_mandir}/man1 +rm -rf %{buildroot}%{_mandir}/pt/man1 + +# install systemd unit file +mkdir -p %{buildroot}%{_unitdir} +install -m 644 %{SOURCE9} %{buildroot}%{_unitdir} + +%find_lang %{name} --all-name --with-man + +%post +%systemd_post arp-ethers.service + +%files -f %{name}.lang +%doc COPYING +/bin/netstat +/sbin/ifconfig +/sbin/route +/sbin/arp +/sbin/ether-wake +/sbin/ipmaddr +/sbin/iptunnel +/sbin/mii-diag +/sbin/mii-tool +/sbin/nameif +/sbin/plipconfig +/sbin/slattach +%{_mandir}/man[58]/* +%attr(0644,root,root) %{_unitdir}/arp-ethers.service + +%changelog +* Mon Jan 07 2019 Michal Ruprich - 2.0-0.25.20131004git +- Resolves: #1632905 - The output of `route -A inet6` does not display properly when the 'Use' column output is over 6 digits + +* Wed Apr 25 2018 Michal Ruprich - 2.0-0.24.20131004git +- Resolves: #1568306 - netstat -i only shows 8 characters of Iface name + +* Tue Apr 10 2018 Michal Ruprich - 2.0-0.23.20131004git +- Resolves: #1538315 - netstat -agn only shows 10 character interface name for IPv4 addressing + +* Wed Mar 29 2017 Michal Ruprich - 2.0-0.22.20131004git +- Resolves: #1167833 - netstat -S/--sctp not documented + +* Wed Mar 22 2017 Michal Ruprich - 2.0-0.21.20131004git +- Related: #1427889 - exit code on wrong parameter is zero for many net-tools binaries + +* Wed Mar 22 2017 Michal Ruprich - 2.0-0.20.20131004git +- Resolves: #1427889 - exit code on wrong parameter is zero for many net-tools binaries + +* Mon Feb 27 2017 Michal Ruprich - 2.0-0.19.20131004git +- Related: #1257549 - netstat tool does not throw correct exit code on wrong parameter + +* Wed Jan 18 2017 Michal Ruprich - 2.0-0.18.20131004git +- Resolves: #1063913 - netstat doesn't list sctp servers in -A mode +- Resolves: #1257549 - netstat tool does not throw correct exit code on wrong parameter +- Resolves: #1392910 - ifconfig inaccurately rounds exabytes + +* Fri Feb 14 2014 Jaromír Končický - 2.0-0.17.20131004git +- remake sctp-quiet.patch (#1063906#c7) + +* Tue Feb 11 2014 Jaromír Končický - 2.0-0.20.20131119git +- make sctp quiet on systems without sctp (#1063906) + +* Fri Jan 24 2014 Daniel Mach - 2.0-0.15.20131004git +- Mass rebuild 2014-01-24 + +* Fri Dec 27 2013 Daniel Mach - 2.0-0.14.20131004git +- Mass rebuild 2013-12-27 + +* Fri Oct 04 2013 Jiri Popelka - 2.0-0.13.20131004git +- latest snapshot (#1013530) +- remove %%ifarch alpha condition from %%prep +- improve sctp-statistics.patch (#982638#c10) + +* Tue Sep 10 2013 Jiri Popelka - 2.0-0.12.20130910git +- latest snapshot + +* Wed Sep 04 2013 Jiri Popelka - 2.0-0.11.20130607git +- amend ether-wake-interfaces.patch + +* Wed Sep 04 2013 Jaromír Končický - 2.0-0.10.20130607git +- use all interfaces instead of default (#1003875) +- reverted all changes on ether-wake.c and put original file + +* Sat Aug 03 2013 Fedora Release Engineering - 2.0-0.9.20130607git +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Fri Jun 07 2013 Jiri Popelka - 2.0-0.8.20130607git +- latest snapshot + +* Thu Apr 25 2013 Jiri Popelka - 2.0-0.7.20130425git +- latest snapshot + +* Thu Feb 14 2013 Fedora Release Engineering - 2.0-0.6.20130109git +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Wed Jan 09 2013 Jiri Popelka - 2.0-0.5.20130109git +- latest snapshot (#579855) + +* Fri Nov 30 2012 Jiri Popelka - 2.0-0.4.20121106git +- fix URL + +* Fri Nov 16 2012 Jiri Popelka - 2.0-0.3.20121106git +- match actual license + +* Tue Nov 06 2012 Jiri Popelka - 2.0-0.2.20121106git +- few man page fixes + +* Thu Oct 04 2012 Jiri Popelka - 2.0-0.1.20121004git +- the git snapshot we ship is actually much more a + 2.0 pre-release then 1.60 post-release + +* Mon Oct 01 2012 Jiri Popelka - 1.60-145.20120917git +- compile without STRIP (Metricom radio) support + +* Mon Sep 17 2012 Jiri Popelka - 1.60-144.20120917git +- upstream git snapshot + +* Wed Sep 05 2012 Jiri Popelka - 1.60-143.20120702git +- Sparc and s390 arches need to use -fPIE + +* Wed Sep 05 2012 Jiri Popelka - 1.60-142.20120702git +- compile with PIE and full RELRO flags (#853193) + +* Wed Aug 22 2012 Jiri Popelka - 1.60-141.20120702git +- fixed building with kernel-3.6 + +* Wed Aug 22 2012 Jiri Popelka - 1.60-140.20120702git +- use new systemd-rpm macros (#850225) + +* Fri Jul 20 2012 Fedora Release Engineering - 1.60-139.20120702git +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Mon Jul 02 2012 Jiri Popelka - 1.60-138.20120702git +- fixes for #834110 and #836258 merged upstream + +* Wed Jun 20 2012 Jiri Popelka - 1.60-137.20120509git +- compile without Token ring support (http://lwn.net/Articles/497397/) + +* Tue Jun 19 2012 Jiri Popelka - 1.60-136.20120509git +- better SCTP support (#826676) + +* Wed May 09 2012 Jiri Popelka - 1.60-135.20120509git +- don't require hostname package + +* Fri Jan 27 2012 Jiri Popelka - 1.60-134.20120127git +- Do not show interface metric in 'ifconfig', 'ifconfig -s' and 'netstat -i'. + Spare place is used for interface name so trim_iface.patch is no longer needed. +- No need to convert man pages to utf-8 as upstream ship them in utf-8 now. + +* Thu Jan 19 2012 Jiri Popelka - 1.60-133.20120119git +- SELinux patch merged upstream +- several page fixes merged upstream +- mark localized man pages with %%lang + +* Wed Jan 11 2012 Jiri Popelka - 1.60-132.20120111git +- 3 patches merged upstream +- removed 2digit.patch (#718610) +- removed fgets.patch (probably not needed anymore) + +* Thu Jan 05 2012 Jiri Popelka - 1.60-131.20120105git +- next 11 patches merged upstream +- removed bcast.patch (seems to be fixed upstream) +- removed netstat-p-basename.patch (upstream is not happy with it) +- netstat-leak.patch merged into duplicate-tcp.patch + +* Wed Dec 07 2011 Jiri Popelka - 1.60-130.20111207git +- removed virtualname.patch +- added back isofix.patch +- improved mii-registers.patch + +* Tue Dec 06 2011 Jiri Popelka - 1.60-129.20111206git +- upstream git snapshot +- reduced number of patches from 95 to 32 +- netstat -T/--notrim option is now -W/--wide + +* Tue Oct 25 2011 Jiri Popelka - 1.60-128 +- Removed HFI support. +- Improved num-ports.patch + +* Thu Oct 20 2011 Jiri Popelka - 1.60-127 +- Merge all upstream fixes into net-tools-1.60-upstream.patch + +* Tue Oct 18 2011 Jiri Popelka - 1.60-126 +- Upstream is migrating to Sourceforge. + +* Mon Oct 03 2011 Jiri Popelka - 1.60-125 +- Fixed ether-wake(8) and mii-diag(8) man pages (#742629) + +* Mon Sep 19 2011 Jiri Popelka - 1.60-124 +- Improved arp-ethers.service unit file (#735617) + +* Wed Aug 24 2011 Jiri Popelka - 1.60-123 +- Improved netstat_stop_trim.patch to not truncate IPV6 UDP sockets (#732984) + +* Mon Jul 04 2011 Jiri Popelka - 1.60-122 +- Update for 2 digit Linux version numbers (#718610) + +* Fri Jun 17 2011 Jiri Popelka - 1.60-121 +- Added arp-ethers.service systemd unit file to run 'arp -f /etc/ethers' + on startup of system. Don't ship default /etc/ethers (#713759) + +* Wed May 25 2011 Jiri Popelka - 1.60-120 +- Do not mention /proc/net/socket in ifconfig(8) (#661905) +- Merge all 'man page only fix' patches into net-tools-1.60-man.patch + +* Thu Apr 28 2011 Jiri Popelka - 1.60-119 +- Fix possible problems found by static analysis of code. + +* Thu Apr 21 2011 Jiri Popelka - 1.60-118 +- patch netstat to separate basename of -p only if it is absolute + path (in order to make argv[0]="sshd pty/0" display as sshd, and not as /0). + +* Thu Apr 14 2011 Jiri Popelka - 1.60-117 +- plipconfig man page and usage output fixes. (#694766) + +* Mon Mar 07 2011 Jiri Popelka - 1.60-116 +- Fix mii-tool/mii-diag/ether-wake to not default to eth0 because + since Fedora 15 network devices can have arbitrary names (#682367) + +* Tue Feb 08 2011 Fedora Release Engineering - 1.60-115 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Fri Feb 04 2011 Jiri Popelka - 1.60-114 +- Improve scanf-format.patch (#668047) + +* Fri Jan 21 2011 Jiri Popelka - 1.60-113 +- Improve route(8) man page saying that 'route mss' actually sets MTU (#671321) + +* Mon Jan 03 2011 Jiri Popelka - 1.60-112 +- Fix the handling of some of the HAVE_* flags ifdef vs if. (BerliOS #17812) + +* Thu Dec 16 2010 Jiri Popelka - 1.60-111 +- fixed mii-diag(8) man page (#663689) +- fixed route(8) man page (#664171) + +* Thu Dec 16 2010 Jiri Popelka - 1.60-110 +- fixed ifconfig(8) man page (#663469) + +* Wed Nov 17 2010 Jiri Popelka - 1.60-109 +- improved netstat(8) man page (#614931) + +* Mon Nov 01 2010 Jiri Popelka - 1.60-108 +- added netstat(8) support for RcvbufErrors, SndbufErrors (BerliOS #17645) + +* Wed Sep 29 2010 jkeating - 1.60-107 +- Rebuilt for gcc bug 634757 + +* Thu Sep 16 2010 Jiri Popelka - 1.60-106 +- HFI support + +* Thu Sep 16 2010 Jiri Popelka - 1.60-105 +- fixed memory leak in netstat when run with -c option + +* Tue Aug 10 2010 Jiri Popelka - 1.60-104 +- improved statistics-doubleword.patch (Bug #579854) + +* Mon Jun 14 2010 Jiri Popelka - 1.60-103 +- updated mii-tool to support gigabit links (#539575) + +* Wed Apr 7 2010 Jiri Popelka - 1.60-102 +- fixed statistics.c to use unsigned long long (instead of int) to handle 64 bit integers (Bug #579854, Debian #561161) +- fixed typo in statistics.c (Bug #579855) + +* Sat Jan 2 2010 Jiri Popelka - 1.60-101 +- fixed overflow patch (#551625) +- ifconfig interface:0 del will remove the Aliased IP on IA64 (#473211) +- interface slip: cast keepalive/outfill to unsigned long to fix warnings on 64bit hosts -- no functional changes since these only have an 8bit range anyways +- interface: fix IPv6 parsing of interfaces with large indexes (> 255) (Debian #433543) + +* Mon Dec 21 2009 Jiri Popelka - 1.60-100 +- Move hostname to separate package + +* Thu Dec 3 2009 Jiri Popelka - 1.60-99 +- return defining of BuildRoot even it's no longer necessary + (https://fedoraproject.org/wiki/Packaging:Guidelines#BuildRoot_tag) + to silent rpmlint false warning + +* Wed Nov 4 2009 Jiri Popelka - 1.60-98 +- in mii-tool.c use instead of "mii.h" and fix Bug #491358 + +* Thu Oct 29 2009 Jiri Popelka - 1.60-97 +- Make "hostname -s" display host name cut at the first dot (no + matter if the host name resolves or not) (bug #531702) + +* Wed Sep 30 2009 Jiri Popelka - 1.60-96 +- netplug moved to separate package +- #319981 and #322901 - minor man pages changes +- applied changes from berlios cvs, which fix: Berlios #16232, Gentoo #283759 and polish Makefile and slattach + +* Tue Sep 1 2009 Jiri Popelka - 1.60-95 +- netstat - avoid name resolution for listening or established sockets (-l) by return fast. +- netstat - --continuous should flush stdout +- added missing man pages (iptunnel, ipmaddr, netplug, netplug.d, netplugd.conf) +- added note about obsolete commands to existing man pages +- let the user know that ifconfig can correctly show only first 8 bytes of Infiniband hw address + +* Sat Jul 25 2009 Fedora Release Engineering - 1.60-94 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Wed Jul 8 2009 Jiri Popelka - 1.60-93 +- scanf format length fix (non exploitable?) from Fabian Hugelshofer +- URL tag changed to http://net-tools.berlios.de/ + +* Wed Feb 25 2009 Fedora Release Engineering - 1.60-92 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Thu Oct 16 2008 Zdenek Prikryl - 1.60-91 +- fixed tcp timers info in netstat (#466845) + +* Thu Sep 25 2008 Zdenek Prikryl - 1.60-90 +- fixed ifconfig's man page (#454271, #432328) + +* Tue Jul 15 2008 Zdenek Prikryl - 1.60-89 +- fixed man pages for arp (#446195) +- fixed netstat --interfaces option (#446187) +- fixed clearing flags in ifconfig (#450252) + +* Tue Jul 8 2008 Radek Vokál - 1.60-88 +- netstat displays correct sctp statistics (#445535) + +* Tue Mar 4 2008 Radek Vokál - 1.60-87 +- fix buffer for newer kernels (#435554) + +* Mon Feb 25 2008 Radek Vokal - 1.60-86 +- fix for GCC 4.3 + +* Tue Feb 19 2008 Fedora Release Engineering - 1.60-85 +- Autorebuild for GCC 4.3 + +* Thu Aug 23 2007 Radek Vokál - 1.60-84 +- rebuilt + +* Fri Jun 8 2007 Radek Vokál - 1.60-83 +- fix netplugd init script (#242919) + +* Tue May 22 2007 Radek Vokál - 1.60-82 +- better SELinux patch by + +* Tue Mar 27 2007 Radek Vokál - 1.60-81 +- fix segfault for empty interface (#234045) + +* Thu Mar 15 2007 Radek Vokál - 1.60-80 +- we don't have -n/--node option (#225554) + +* Thu Feb 22 2007 Radek Vokál - 1.60-79 +- quiet sctp (#229232) + +* Mon Feb 19 2007 Radek Vokál - 1.60-78 +- spec file cleanup (#226193) + +* Tue Jan 30 2007 Radek Vokál - 1.60-77 +- touch /etc/ethers (#225381) + +* Wed Dec 27 2006 Radek Vokál - 1.60-76 +- fix arp unaligned access (#220438) + +* Wed Oct 4 2006 Radek Vokal - 1.60-75 +- fix nameif crash for 16char long interface names (#209120) + +* Mon Oct 2 2006 Radek Vokal - 1.60-74 +- fix -I option for nestat, works as -I=eth0 again. +- add dist tag + +* Mon Aug 7 2006 Radek Vokal - 1.60-73 +- directory entries . and .. should be skipped + +* Wed Jul 12 2006 Jesse Keating - 1.60-72.1 +- rebuild + +* Wed Jun 7 2006 Radek Vokal - 1.60-72 +- switch --trim to --notrim .. make it less confusing + +* Fri May 19 2006 Radek Vokal - 1.60-71 +- BuildRequires: libselinux-devel (#191737) + +* Tue May 09 2006 Radek Vokál - 1.60-70 +- add netdevice.h, fix x25 +- fix ifconfig crash when interface name is too long (#190703) + +* Tue May 02 2006 Radek Vokál - 1.60-69 +- fix arp man page to correspond to man ethers (#190425) + +* Fri Apr 14 2006 Radek Vokál - 1.60-68 +- display sctp connections using netstat -S + +* Thu Apr 13 2006 Radek Vokál - 1.60-67 +- fix wrong definition of _PATH_PROCNET_X25_ROUTE (#188786) + +* Thu Apr 06 2006 Radek Vokál - 1.60-66 +- add note about -T to netstat + +* Thu Mar 30 2006 Radek Vokál - 1.60-65 +- add note to ifconfig(8) about supported format for IPv4 addresses (#176661) + +* Thu Mar 16 2006 Radek Vokál - 1.60-64 +- remove duplicate arp entries (#185604) + +* Thu Feb 23 2006 Radek Vokál - 1.60-63 +- show inodes in netstat (#180974) + +* Fri Feb 10 2006 Jesse Keating - 1.60-62.1 +- bump again for double-long bug on ppc(64) + +* Fri Feb 10 2006 Radek Vokál - 1.60-62 +- new option for netstat - -T stops trimming remote and local addresses (#176465) + +* Tue Feb 07 2006 Jesse Keating - 1.60-61.1 +- rebuilt for new gcc4.1 snapshot and glibc changes + +* Mon Feb 06 2006 Radek Vokál 1.60-61 +- mii-tool manpage fixed (#180055) + +* Tue Jan 17 2006 Radek Vokal 1.60-60 +- forget to enable the new selinux option :( - config.make changed + +* Tue Jan 17 2006 Radek Vokal 1.60-59 +- new option for nestat, -Z shows selinux context. Patch by + +* Mon Jan 02 2006 Radek Vokal 1.60-58 +- clear static buffers in interface.c by (#176714) + +* Fri Dec 09 2005 Jesse Keating +- rebuilt + +* Sat Oct 15 2005 Radek Vokal 1.60-57 +- add note to hostname man page about gethostbyname() (#166581) +- don't ship any rarp man page (#170537) + +* Wed Aug 03 2005 Radek Vokal 1.60-56 +- fixed buffer overflow in arp (#164695) + +* Wed Jul 20 2005 Radek Vokal 1.60-55 +- ifconfig - fixed virtual interface dropping (#162888) + +* Wed Jun 22 2005 Radek Vokal 1.60-54 +- fr man pages are back (#159702) + +* Mon Jun 06 2005 Radek Vokal 1.60-53 +- etherwake man page changed to ether-wake (#159156) + +* Tue Apr 26 2005 Radek Vokal 1.60-52 +- don't show "duplicate line" warning (#143933) +- netstat has new statistcs (#133032) +- /etc/neplug is owned by net-tools (#130621) + +* Tue Apr 05 2005 Radek Vokal 1.60-51 +- flush output in mii-tool (#152568) + +* Wed Mar 30 2005 Radek Vokal 1.60-50 +- added mii-diag tool +- added newer ether-wake +- remove useless -i option from ifconfig +- stop trimming interface names (#152457) + +* Wed Mar 16 2005 Elliot Lee +- rebuilt + +* Tue Mar 01 2005 Radek Vokal 1.60-48 +- behaviour of netstat -i option changed (#115987) +- netstat -i shows all interface, -I only one + +* Mon Feb 28 2005 Radek Vokal 1.60-47 +- added RPM_OPT_FLAGS +- execshield patch for netplug + +* Wed Feb 16 2005 Radek Vokal 1.60-46 +- small typo in german translation (#148775) + +* Wed Feb 09 2005 Radek Vokal 1.60-45 +- included infiniband support (#147396) +- added etherwake man page + +* Mon Feb 07 2005 Radek Vokal 1.60-44 +- net-plug-1.2.9 - no changes, upstream included Red Hat patches +- ether-wake-1.08 - few changes in implementation (#145718) + +* Mon Jan 10 2005 Radek Vokal 1.60-43 +- don't report statistics for virtual devices (#143981) +- fixing translation headers - content type format +- kill bitkeeper warning messages + +* Fri Dec 03 2004 Radek Vokal 1.60-42 +- filter out duplicate tcp entries (#139407) + +* Thu Nov 25 2004 Radek Vokal 1.60-41 +- added note to hostname(1) (#140239) +- fixed --num-ports option for netstat (#115100) + +* Thu Nov 11 2004 Radek Vokal 1.60-40 +- mii-tool(8) fixed, labeled as obsolete, added info (#138687) +- netstat crashing on i64 fixed (#138804) Patch by + +* Thu Nov 04 2004 Radek Vokal 1.60-39 +- IBM patch for netstat -s returning negative values on 64bit arch (#144064) +- broadcast calulated if only netmask provided (#60509) + +* Tue Nov 02 2004 Radek Vokal 1.60-38 +- fixed fail to assign the specified netmask before adress is assigned +- patch by Malita, Florin + +* Wed Sep 29 2004 Radek Vokal 1.60-37 +- spec file updated, added conversion for french and portugal man pages to UTF-8 + +* Mon Sep 06 2004 Radek Vokal 1.60-36 +- parse error fixed (#131539) + +* Fri Sep 03 2004 Radek Vokal 1.60-35 +- The return value of nameif was wrong (#129032) - patch from Fujitsu QA + +* Mon Aug 30 2004 Radek Vokal 1.60-34 +- Trunc patch added (#128359) + +* Mon Aug 30 2004 Radek Vokal 1.60-33 +- Added patch for SI units by Tom "spot" Callaway #118006 + +* Tue Aug 17 2004 Phil Knirsch 1.60-32 +- Fix installopts for netplug. + +* Sun Aug 08 2004 Alan Cox 1.60-31 +- Build requires gettext. + +* Mon Aug 02 2004 Phil Knirsch 1.60-30 +- Update to latest netplugd version. + +* Mon Jul 12 2004 Phil Knirsch 1.60-29 +- Fixed initscript patch for netplug (#127351) + +* Tue Jun 15 2004 Elliot Lee +- rebuilt + +* Fri May 14 2004 Phil Knirsch 1.60-27 +- Fixed compiler warning/error in netplug. +- Updated to netplug-1.2.6 for security update and fixes. + +* Thu May 06 2004 Phil Knirsch 1.60-26 +- Updated netplugd to latest upstream version. +- Fixed execshield problem in main.c of netplugd. + +* Thu Apr 15 2004 Phil Knirsch 1.60-25 +- Fixed several possible buffer overflows (#120343) + +* Tue Mar 30 2004 Harald Hoyer - 1.60-24 +- fixed compilation with gcc34 + +* Tue Mar 23 2004 Karsten Hopp 1.60-23 +- add chkconfig call in post and preun, fix init script (#116555) + +* Thu Feb 19 2004 Phil Knirsch +- Added netplug-1.2.1 to net-tools (FR #103419). + +* Fri Feb 13 2004 Elliot Lee +- rebuilt + +* Mon Aug 25 2003 Phil Knirsch 1.60-20.1 +-rebuilt + +* Mon Aug 25 2003 Phil Knirsch 1.60-20 +- interface option now works as described in the man page (#61113). + +* Tue Aug 19 2003 Phil Knirsch 1.60-19.1 +- rebuilt + +* Tue Aug 19 2003 Phil Knirsch 1.60-19 +- Fixed trailing blank bug in hostname output (#101263). +- Remove -O2 fir alpha (#78955). +- Updated netstat statistic output, was still broken. + +* Tue Jun 17 2003 Phil Knirsch 1.60-18.1 +- rebuilt + +* Tue Jun 17 2003 Phil Knirsch 1.60-18 +- fix ether-wake.c build with gcc 3.3 +- rebuilt + +* Wed Jun 04 2003 Elliot Lee +- rebuilt + +* Wed Jun 04 2003 Phil Knirsch 1.60-16.1 +- Bumped release and rebuilt + +* Fri May 23 2003 Phil Knirsch 1.60-16 +- Fixed ether-wake usage output (#55801). + +* Thu May 22 2003 Jeremy Katz 1.60-15 +- fix build with gcc 3.3 + +* Thu May 22 2003 Phil Knirsch 1.60-14 +- Fixed wrong manpage (#55473). + +* Wed May 21 2003 Phil Knirsch +- Added inet6-lookup patch from John van Krieken (#84108). +- Fixed outdated link in ifconfig manpage (#91287). + +* Tue May 20 2003 Phil Knirsch +- Fixed incorrect address display for ipx (#46434). +- Fixed wrongly installed manpage dirs (#50664). + +* Wed Mar 19 2003 Phil Knirsch 1.60-13 +- Fixed nameif problem (#85748). + +* Fri Feb 07 2003 Phil Knirsch 1.60-12 +- Fixed -s parameter. +- Fix /proc statistics for -nic operation. +- Fixed -i operation in general. + +* Mon Jan 27 2003 Phil Knirsch 1.60-11 +- Disable smp build. + +* Wed Jan 22 2003 Tim Powers 1.60-10 +- rebuilt + +* Tue Dec 17 2002 Phil Knirsch 1.60-9 +- Rebuild +- Copyright -> License. + +* Thu Dec 05 2002 Elliot Lee 1.60-8 +- Rebuild + +* Tue Aug 06 2002 Phil Knirsch +- Added patch from Norm for a corrected output. + +* Fri Jun 21 2002 Tim Powers +- automated rebuild + +* Thu May 23 2002 Tim Powers +- automated rebuild + +* Fri Apr 12 2002 Jeremy Katz +- fix nstrcmp() to be correct in the case where there are many devices + of the same type, eg, "eth10" > "eth1" (#61436) + +* Tue Jul 31 2001 Bill Nottingham +- do *not* use SIOCDEVPRIVATE for MII ioctls + +* Fri Jun 1 2001 Preston Brown +- include wake-on-lan wakeup utility, ether-wake by Donald Becker + +* Wed Apr 18 2001 Crutcher Dunnavant +- itterate to 1.60 + +* Sun Apr 8 2001 Preston Brown +- use find_lang macro +- less specific locale dirs for man pages + +* Mon Apr 2 2001 Preston Brown +- don't use this version of rarp, doesn't work with our 2.4. + +* Tue Feb 6 2001 Crutcher Dunnavant +- fixed man page typo, closing bug #25921 + +* Thu Feb 1 2001 Crutcher Dunnavant +- applied twaugh's patch to close bug #25474 +- which was a buffer length bug. + +* Wed Dec 27 2000 Jeff Johnson +- locales not initialized correctly (#20570). +- arp: document -e option (#22040). + +* Sat Oct 7 2000 Jeff Johnson +- update to 1.57. +- MTU (and other) option(s) not parsed correctly (#9215). +- allow more granularity iwth --numeric (#9129). + +* Wed Jul 12 2000 Prospector +- automatic rebuild + +* Tue Jun 6 2000 Jeff Johnson +- update to 1.56. +- FHS packaging. + +* Sat Apr 15 2000 Jeff Johnson +- update to 1.55. + +* Tue Mar 7 2000 Jeff Johnson +- rebuild for sparc baud rates > 38400. + +* Wed Feb 02 2000 Cristian Gafton +- fix description + +* Fri Jan 14 2000 Jeff Johnson +- fix "netstat -ci" (#6904). +- document more netstat options (#7429). + +* Thu Jan 13 2000 Jeff Johnson +- update to 1.54. +- enable "everything but DECnet" including IPv6. + +* Sun Aug 29 1999 Jeff Johnson +- update to 1.53. + +* Wed Jul 28 1999 Jeff Johnson +- plug "netstat -c" fd leak (#3620). + +* Thu Jun 17 1999 Jeff Johnson +- plug potential buffer overruns. + +* Sat Jun 12 1999 John Hardin +- patch to recognize ESP and GRE protocols for VPN masquerade + +* Fri Apr 23 1999 Jeff Johnson +- update to 1.52. + +* Thu Mar 25 1999 Jeff Johnson +- update interface statistics continuously (#1323) + +* Sun Mar 21 1999 Cristian Gafton +- auto rebuild in the new build environment (release 2) + +* Fri Mar 19 1999 Jeff Johnson +- update to 1.51. +- strip binaries. + +* Tue Feb 2 1999 Jeff Johnson +- update to 1.50. +- added slattach/plipconfig/ipmaddr/iptunnel commands. +- enabled translated man pages. + +* Tue Dec 15 1998 Jakub Jelinek +- update to 1.49. + +* Sat Dec 5 1998 Jeff Johnson +- update to 1.48. + +* Thu Nov 12 1998 Jeff Johnson +- update to 1.47. + +* Wed Sep 2 1998 Jeff Johnson +- update to 1.46 + +* Thu Jul 9 1998 Jeff Johnson +- build root +- include ethers.5 + +* Thu Jun 11 1998 Aron Griffis +- upgraded to 1.45 +- patched hostname.c to initialize buffer +- patched ax25.c to use kernel headers + +* Fri May 01 1998 Prospector System +- translations modified for de, fr, tr + +* Fri Feb 27 1998 Jason Spangler +- added config patch + +* Fri Feb 27 1998 Jason Spangler +- changed to net-tools 1.432 +- removed old glibc 2.1 patch + +* Wed Oct 22 1997 Erik Troan +- added extra patches for glibc 2.1 + +* Tue Oct 21 1997 Erik Troan +- included complete set of network protocols (some were removed for + initial glibc work) + +* Wed Sep 03 1997 Erik Troan +- updated glibc patch for glibc 2.0.5 + +* Thu Jun 19 1997 Erik Troan +- built against glibc +- updated to 1.33