Sync with upstream CVS, for most files in lib/ Index: net-tools/lib/Makefile =================================================================== --- net-tools.orig/lib/Makefile +++ net-tools/lib/Makefile @@ -16,7 +16,7 @@ # -HWOBJS = hw.o loopback.o slip.o ether.o ax25.o ppp.o arcnet.o tr.o tunnel.o frame.o sit.o rose.o ash.o fddi.o hippi.o hdlclapb.o strip.o irda.o ec_hw.o x25.o +HWOBJS = hw.o loopback.o slip.o ether.o ax25.o ppp.o arcnet.o tr.o tunnel.o frame.o sit.o rose.o ash.o fddi.o hippi.o hdlclapb.o strip.o irda.o ec_hw.o x25.o eui64.o ib.o AFOBJS = unix.o inet.o inet6.o ax25.o ipx.o ddp.o ipx.o netrom.o af.o rose.o econet.o x25.o AFGROBJS = inet_gr.o inet6_gr.o ipx_gr.o ddp_gr.o netrom_gr.o ax25_gr.o rose_gr.o getroute.o x25_gr.o AFSROBJS = inet_sr.o inet6_sr.o netrom_sr.o ipx_sr.o setroute.o x25_sr.o Index: net-tools/lib/ddp_gr.c =================================================================== --- net-tools.orig/lib/ddp_gr.c +++ net-tools/lib/ddp_gr.c @@ -1,3 +1,20 @@ +/* + * lib/ddp_gr.c Prinbting of DDP (AppleTalk) routing table + * used by the NET-LIB. + * + * NET-LIB + * + * Version: $Id: ddp_gr.c,v 1.4 2002/06/02 05:25:15 ecki Exp $ + * + * Author: Ajax <ajax@firest0rm.org> + * + * Modification: + * 2002-06-02 integrated into main source by Bernd Eckenfels + * + */ + +/* TODO: name lookups (/etc/atalk.names? NBP?) */ + #include "config.h" #if HAVE_AFATALK @@ -16,9 +33,61 @@ #include "pathnames.h" #include "intl.h" +/* stolen from inet_gr.c */ +#define flags_decode(i,o) do { \ + o[0] = '\0'; \ + if (i & RTF_UP) strcat(o, "U"); \ + if (i & RTF_GATEWAY) strcat(o, "G"); \ + if (i & RTF_REJECT) strcat(o, "!"); \ + if (i & RTF_HOST) strcat(o, "H"); \ + if (i & RTF_REINSTATE) strcat(o, "R"); \ + if (i & RTF_DYNAMIC) strcat(o, "D"); \ + if (i & RTF_MODIFIED) strcat(o, "M"); \ + if (i & RTF_DEFAULT) strcat(o, "d"); \ + if (i & RTF_ALLONLINK) strcat(o, "a"); \ + if (i & RTF_ADDRCONF) strcat(o, "c"); \ + if (i & RTF_NONEXTHOP) strcat(o, "o"); \ + if (i & RTF_EXPIRES) strcat(o, "e"); \ + if (i & RTF_CACHE) strcat(o, "c"); \ + if (i & RTF_FLOW) strcat(o, "f"); \ + if (i & RTF_POLICY) strcat(o, "p"); \ + if (i & RTF_LOCAL) strcat(o, "l"); \ + if (i & RTF_MTU) strcat(o, "u"); \ + if (i & RTF_WINDOW) strcat(o, "w"); \ + if (i & RTF_IRTT) strcat(o, "i"); \ + if (i & RTF_NOTCACHED) strcat(o, "n"); \ + } while (0) + int DDP_rprint(int options) { - fprintf(stderr, _("Routing table for `ddp' not yet supported.\n")); - return (1); + FILE *fp; + char *dest, *gw, *dev, *flags; + char oflags[32]; + char *hdr = "Destination Gateway Device Flags"; + + fp = fopen(_PATH_PROCNET_ATALK_ROUTE, "r"); + + if (!fp) { + perror("Error opening " _PATH_PROCNET_ATALK_ROUTE); + fprintf(stderr, "DDP (AppleTalk) not configured on this system.\n"); + return 1; + } + + fscanf(fp, "%as %as %as %as\n", &dest, &gw, &flags, &dev); + free(dest); free(gw); free(dev); free(flags); + + printf("%s\n", hdr); + + while (fscanf(fp, "%as %as %as %as\n", &dest, &gw, &flags, &dev) == 4) { + int iflags = atoi(flags); + flags_decode(iflags, oflags); + printf("%-16s%-16s%-16s%-s\n", dest, gw, dev, oflags); + free(dest); free(gw); free(dev); free(flags); + } + + fclose(fp); + + return 0; + } #endif Index: net-tools/lib/ether.c =================================================================== --- net-tools.orig/lib/ether.c +++ net-tools/lib/ether.c @@ -2,7 +2,7 @@ * lib/ether.c This file contains an implementation of the "Ethernet" * support functions. * - * Version: $Id: ether.c,v 1.7 1999/09/27 11:00:47 philip Exp $ + * Version: $Id: ether.c,v 1.8 2002/07/30 05:17:29 ecki Exp $ * * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> * Copyright 1993 MicroWalt Corporation @@ -39,7 +39,7 @@ static char *pr_ether(unsigned char *ptr { static char buff[64]; - snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X", + snprintf(buff, sizeof(buff), "%02x:%02x:%02x:%02x:%02x:%02x", (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377), (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377) ); Index: net-tools/lib/hw.c =================================================================== --- net-tools.orig/lib/hw.c +++ net-tools/lib/hw.c @@ -2,7 +2,7 @@ * lib/hw.c This file contains the top-level part of the hardware * support functions module. * - * Version: $Id: hw.c,v 1.17 2000/05/20 13:38:10 pb Exp $ + * Version: $Id: hw.c,v 1.19 2008/10/03 01:52:04 ecki Exp $ * * Maintainer: Bernd 'eckes' Eckenfels, <net-tools@lina.inka.de> * @@ -73,6 +73,10 @@ extern struct hwtype irda_hwtype; extern struct hwtype ec_hwtype; +extern struct hwtype ib_hwtype; + +extern struct hwtype eui64_hwtype; + static struct hwtype *hwtypes[] = { @@ -144,6 +148,12 @@ static struct hwtype *hwtypes[] = #if HAVE_HWX25 &x25_hwtype, #endif +#if HAVE_HWIB + &ib_hwtype, +#endif +#if HAVE_HWEUI64 + &eui64_hwtype, +#endif &unspec_hwtype, NULL }; @@ -217,6 +227,12 @@ void hwinit() #if HAVE_HWEC ec_hwtype.title = _("Econet"); #endif +#if HAVE_HWIB + ib_hwtype.title = _("InfiniBand"); +#endif +#if HAVE_HWEUI64 + eui64_hwtype.title = _("Generic EUI-64"); +#endif sVhwinit = 1; } Index: net-tools/lib/inet.c =================================================================== --- net-tools.orig/lib/inet.c +++ net-tools/lib/inet.c @@ -3,7 +3,7 @@ * support functions for the net-tools. * (NET-3 base distribution). * - * Version: $Id: inet.c,v 1.13 1999/12/11 13:35:56 freitag Exp $ + * Version: $Id: inet.c,v 1.14 2003/10/19 11:57:37 pb Exp $ * * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> * Copyright 1993 MicroWalt Corporation @@ -144,7 +144,7 @@ static int INET_rresolve(char *name, siz struct hostent *ent; struct netent *np; struct addr *pn; - unsigned long ad, host_ad; + u_int32_t ad, host_ad; int host = 0; /* Grmpf. -FvK */ @@ -155,7 +155,7 @@ static int INET_rresolve(char *name, siz errno = EAFNOSUPPORT; return (-1); } - ad = (unsigned long) sin->sin_addr.s_addr; + ad = sin->sin_addr.s_addr; #ifdef DEBUG fprintf (stderr, "rresolve: %08lx, mask %08x, num %08x \n", ad, netmask, numeric); #endif Index: net-tools/lib/inet6.c =================================================================== --- net-tools.orig/lib/inet6.c +++ net-tools/lib/inet6.c @@ -3,7 +3,7 @@ * support functions for the net-tools. * (most of it copied from lib/inet.c 1.26). * - * Version: $Id: inet6.c,v 1.10 2000/10/28 11:04:00 pb Exp $ + * Version: $Id: inet6.c,v 1.12 2002/12/10 01:03:09 ecki Exp $ * * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> * Copyright 1993 MicroWalt Corporation @@ -44,6 +44,21 @@ extern int h_errno; /* some netdb.h versions don't export this */ +char * fix_v4_address(char *buf, struct in6_addr *in6) +{ + if (IN6_IS_ADDR_V4MAPPED(in6->s6_addr)) { + char *s =strchr(buf, '.'); + if (s) { + while (s > buf && *s != ':') + --s; + if (*s == ':') ++s; + else s = NULL; + } + if (s) return s; + } + return buf; +} + static int INET6_resolve(char *name, struct sockaddr_in6 *sin6) { struct addrinfo req, *ai; @@ -83,14 +98,14 @@ static int INET6_rresolve(char *name, st return (-1); } if (numeric & 0x7FFF) { - inet_ntop(AF_INET6, &sin6->sin6_addr, name, 80); + inet_ntop( AF_INET6, &sin6->sin6_addr, name, 80); return (0); } if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { if (numeric & 0x8000) strcpy(name, "default"); else - strcpy(name, "*"); + strcpy(name, "[::]"); return (0); } @@ -109,13 +124,14 @@ static void INET6_reserror(char *text) } + /* Display an Internet socket address. */ static char *INET6_print(unsigned char *ptr) { static char name[80]; inet_ntop(AF_INET6, (struct in6_addr *) ptr, name, 80); - return name; + return fix_v4_address(name, (struct in6_addr *)ptr); } @@ -129,13 +145,14 @@ static char *INET6_sprint(struct sockadd return safe_strncpy(buff, _("[NONE SET]"), sizeof(buff)); if (INET6_rresolve(buff, (struct sockaddr_in6 *) sap, numeric) != 0) return safe_strncpy(buff, _("[UNKNOWN]"), sizeof(buff)); - return (buff); + return (fix_v4_address(buff, &((struct sockaddr_in6 *)sap)->sin6_addr)); } static int INET6_getsock(char *bufp, struct sockaddr *sap) { struct sockaddr_in6 *sin6; + char *p; sin6 = (struct sockaddr_in6 *) sap; sin6->sin6_family = AF_INET6; @@ -143,7 +160,9 @@ static int INET6_getsock(char *bufp, str if (inet_pton(AF_INET6, bufp, sin6->sin6_addr.s6_addr) <= 0) return (-1); - + p = fix_v4_address(bufp, &sin6->sin6_addr); + if (p != bufp) + memcpy(bufp, p, strlen(p)+1); return 16; /* ?;) */ } Index: net-tools/lib/inet6_gr.c =================================================================== --- net-tools.orig/lib/inet6_gr.c +++ net-tools/lib/inet6_gr.c @@ -1,4 +1,4 @@ -/* + /* Modifications: 1998-07-01 - Arnaldo Carvalho de Melo - GNU gettext instead of catgets, snprintf instead of sprintf @@ -71,11 +71,15 @@ int rprint_fib6(int ext, int numeric) printf(_("INET6 (IPv6) not configured in this system.\n")); return 1; } - printf(_("Kernel IPv6 routing table\n")); - printf(_("Destination " - "Next Hop " - "Flags Metric Ref Use Iface\n")); + if (numeric & RTF_CACHE) + printf(_("Kernel IPv6 routing cache\n")); + else + printf(_("Kernel IPv6 routing table\n")); + + printf(_("Destination " + "Next Hop " + "Flag Met Ref Use If\n")); while (fgets(buff, 1023, fp)) { num = sscanf(buff, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %4s%4s%4s%4s%4s%4s%4s%4s %02x %4s%4s%4s%4s%4s%4s%4s%4s %08x %08x %08x %08x %s\n", @@ -87,13 +91,19 @@ int rprint_fib6(int ext, int numeric) &slen, naddr6p[0], naddr6p[1], naddr6p[2], naddr6p[3], naddr6p[4], naddr6p[5], naddr6p[6], naddr6p[7], - &metric, &use, &refcnt, &iflags, iface); + &metric, &refcnt, &use, &iflags, iface); #if 0 if (num < 23) continue; #endif - if (!(iflags & RTF_UP)) - continue; + if (iflags & RTF_CACHE) { + if (!(numeric & RTF_CACHE)) + continue; + } else { + if (numeric & RTF_CACHE) + continue; + } + /* Fetch and resolve the target address. */ snprintf(addr6, sizeof(addr6), "%s:%s:%s:%s:%s:%s:%s:%s", addr6p[0], addr6p[1], addr6p[2], addr6p[3], @@ -112,7 +122,12 @@ int rprint_fib6(int ext, int numeric) inet6_aftype.sprint((struct sockaddr *) &snaddr6, 1)); /* Decode the flags. */ - strcpy(flags, "U"); + + flags[0]=0; + if (iflags & RTF_UP) + strcat(flags, "U"); + if (iflags & RTF_REJECT) + strcat(flags, "!"); if (iflags & RTF_GATEWAY) strcat(flags, "G"); if (iflags & RTF_HOST) @@ -123,9 +138,19 @@ int rprint_fib6(int ext, int numeric) strcat(flags, "A"); if (iflags & RTF_CACHE) strcat(flags, "C"); + if (iflags & RTF_ALLONLINK) + strcat(flags, "a"); + if (iflags & RTF_EXPIRES) + strcat(flags, "e"); + if (iflags & RTF_MODIFIED) + strcat(flags, "m"); + if (iflags & RTF_NONEXTHOP) + strcat(flags, "n"); + if (iflags & RTF_FLOW) + strcat(flags, "f"); /* Print the info. */ - printf("%-43s %-39s %-5s %-6d %-2d %7d %-8s\n", + printf("%-30s %-26s %-4s %-3d %-1d%6d %s\n", addr6, naddr6, flags, metric, refcnt, use, iface); } @@ -144,8 +169,7 @@ int rprint_cache6(int ext, int numeric) char addr6p[8][5], haddrp[6][3]; if (!fp) { - ESYSNOT("nd_print", "ND Table"); - return 1; + return rprint_fib6(ext, numeric | RTF_CACHE); } printf(_("Kernel IPv6 Neighbour Cache\n")); Index: net-tools/lib/inet_sr.c =================================================================== --- net-tools.orig/lib/inet_sr.c +++ net-tools/lib/inet_sr.c @@ -3,6 +3,7 @@ 1998-07-01 - Arnaldo Carvalho de Melo - GNU gettext instead of catgets 1999-10-07 - Kurt Garloff - for -host and gws: prefer host names over networks (or even reject) + 2003-10-11 - Maik Broemme - gcc 3.x warnign fixes (default: break;) */ #include "config.h" @@ -104,7 +105,6 @@ static int INET_setroute(int action, int isnet = 1; break; case 2: isnet = 0; break; - default: } /* Fill in the other fields. */ Index: net-tools/lib/interface.c =================================================================== --- net-tools.orig/lib/interface.c +++ net-tools/lib/interface.c @@ -7,7 +7,7 @@ 8/2000 Andi Kleen make the list operations a bit more efficient. People are crazy enough to use thousands of aliases now. - $Id: interface.c,v 1.14 2001/02/10 19:31:15 pb Exp $ + $Id: interface.c,v 1.30 2005/08/23 22:46:51 ecki Exp $ */ #include "config.h" @@ -23,6 +23,7 @@ #include <string.h> #include <unistd.h> #include <ctype.h> +#include <string.h> #if HAVE_AFIPX #if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) @@ -87,14 +88,20 @@ int procnetdev_vsn = 1; int ife_short; +int if_list_all = 0; /* do we have requested the complete proc list, yet? */ + static struct interface *int_list, *int_last; static int if_readlist_proc(char *); -static struct interface *add_interface(char *name) +static struct interface *if_cache_add(char *name) { struct interface *ife, **nextp, *new; + if (!int_list) + int_last = NULL; + + /* the cache is sorted, so if we hit a smaller if, exit */ for (ife = int_last; ife; ife = ife->prev) { int n = nstrcmp(ife->name, name); if (n == 0) @@ -104,7 +111,7 @@ static struct interface *add_interface(c } new(new); safe_strncpy(new->name, name, IFNAMSIZ); - nextp = ife ? &ife->next : &int_list; + nextp = ife ? &ife->next : &int_list; // keep sorting new->prev = ife; new->next = *nextp; if (new->next) @@ -117,19 +124,22 @@ static struct interface *add_interface(c struct interface *lookup_interface(char *name) { - struct interface *ife = NULL; - - if (if_readlist_proc(name) < 0) - return NULL; - ife = add_interface(name); - return ife; + /* if we have read all, use it */ + if (if_list_all) + return if_cache_add(name); + + /* otherwise we read a limited list */ + if (if_readlist_proc(name) < 0) + return NULL; + + return if_cache_add(name); } int for_all_interfaces(int (*doit) (struct interface *, void *), void *cookie) { struct interface *ife; - if (!int_list && (if_readlist() < 0)) + if (!if_list_all && (if_readlist() < 0)) return -1; for (ife = int_list; ife; ife = ife->next) { int err = doit(ife, cookie); @@ -139,13 +149,15 @@ int for_all_interfaces(int (*doit) (stru return 0; } -int free_interface_list(void) +int if_cache_free(void) { struct interface *ife; while ((ife = int_list) != NULL) { int_list = ife->next; free(ife); } + int_last = NULL; + if_list_all = 0; return 0; } @@ -180,7 +192,7 @@ static int if_readconf(void) } if (ifc.ifc_len == sizeof(struct ifreq) * numreqs) { /* assume it overflowed and try again */ - numreqs += 10; + numreqs *= 2; continue; } break; @@ -188,7 +200,7 @@ static int if_readconf(void) ifr = ifc.ifc_req; for (n = 0; n < ifc.ifc_len; n += sizeof(struct ifreq)) { - add_interface(ifr->ifr_name); + if_cache_add(ifr->ifr_name); ifr++; } err = 0; @@ -198,7 +210,7 @@ out: return err; } -static char *get_name(char *name, char *p) +char *get_name(char *name, char *p) { while (isspace(*p)) p++; @@ -206,16 +218,19 @@ static char *get_name(char *name, char * if (isspace(*p)) break; if (*p == ':') { /* could be an alias */ - char *dot = p, *dotname = name; - *name++ = *p++; - while (isdigit(*p)) - *name++ = *p++; - if (*p != ':') { /* it wasn't, backup */ - p = dot; - name = dotname; + char *dot = p++; + while (*p && isdigit(*p)) p++; + if (*p == ':') { + /* Yes it is, backup and copy it. */ + p = dot; + *name++ = *p++; + while (*p && isdigit(*p)) { + *name++ = *p++; + } + } else { + /* No, it isn't */ + p = dot; } - if (*p == '\0') - return NULL; p++; break; } @@ -225,7 +240,7 @@ static char *get_name(char *name, char * return p; } -static int procnetdev_version(char *buf) +int procnetdev_version(char *buf) { if (strstr(buf, "compressed")) return 3; @@ -234,12 +249,12 @@ static int procnetdev_version(char *buf) return 1; } -static int get_dev_fields(char *bp, struct interface *ife) +int get_dev_fields(char *bp, struct interface *ife) { switch (procnetdev_vsn) { case 3: sscanf(bp, - "%llu %llu %lu %lu %lu %lu %lu %lu %llu %llu %lu %lu %lu %lu %lu %lu", + "%Lu %Lu %lu %lu %lu %lu %lu %lu %Lu %Lu %lu %lu %lu %lu %lu %lu", &ife->stats.rx_bytes, &ife->stats.rx_packets, &ife->stats.rx_errors, @@ -259,7 +274,7 @@ static int get_dev_fields(char *bp, stru &ife->stats.tx_compressed); break; case 2: - sscanf(bp, "%llu %llu %lu %lu %lu %lu %llu %llu %lu %lu %lu %lu %lu", + sscanf(bp, "%Lu %Lu %lu %lu %lu %lu %Lu %Lu %lu %lu %lu %lu %lu", &ife->stats.rx_bytes, &ife->stats.rx_packets, &ife->stats.rx_errors, @@ -277,7 +292,7 @@ static int get_dev_fields(char *bp, stru ife->stats.rx_multicast = 0; break; case 1: - sscanf(bp, "%llu %lu %lu %lu %lu %llu %lu %lu %lu %lu %lu", + sscanf(bp, "%Lu %lu %lu %lu %lu %Lu %lu %lu %lu %lu %lu", &ife->stats.rx_packets, &ife->stats.rx_errors, &ife->stats.rx_dropped, @@ -300,22 +315,16 @@ static int get_dev_fields(char *bp, stru static int if_readlist_proc(char *target) { - static int proc_read; FILE *fh; char buf[512]; struct interface *ife; int err; - if (proc_read) - return 0; - if (!target) - proc_read = 1; - 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(); + return -2; } fgets(buf, sizeof buf, fh); /* eat line */ fgets(buf, sizeof buf, fh); @@ -350,7 +359,7 @@ static int if_readlist_proc(char *target while (fgets(buf, sizeof buf, fh)) { char *s, name[IFNAMSIZ]; s = get_name(name, buf); - ife = add_interface(name); + ife = if_cache_add(name); get_dev_fields(s, ife); ife->statistics_valid = 1; if (target && !strcmp(target,name)) @@ -359,7 +368,6 @@ static int if_readlist_proc(char *target if (ferror(fh)) { perror(_PATH_PROCNET_DEV); err = -1; - proc_read = 0; } #if 0 @@ -371,9 +379,16 @@ static int if_readlist_proc(char *target int if_readlist(void) { - int err = if_readlist_proc(NULL); - if (!err) - err = if_readconf(); + /* caller will/should check not to call this too often + * (i.e. only if if_list_all == 0 + */ + int err = 0; + + err |= if_readlist_proc(NULL); + err |= if_readconf(); + + if_list_all = 1; + return err; } @@ -580,10 +595,10 @@ int do_if_print(struct interface *ife, v void ife_print_short(struct interface *ptr) { printf("%-5.5s ", ptr->name); - printf("%5d %3d", ptr->mtu, ptr->metric); + printf("%5d %-2d ", ptr->mtu, ptr->metric); /* If needed, display the interface statistics. */ if (ptr->statistics_valid) { - printf("%8llu %6lu %6lu %6lu", + printf("%8llu %6lu %6lu %-6lu ", ptr->stats.rx_packets, ptr->stats.rx_errors, ptr->stats.rx_dropped, ptr->stats.rx_fifo_errors); printf("%8llu %6lu %6lu %6lu ", @@ -636,9 +651,10 @@ void ife_print_long(struct interface *pt int hf; int can_compress = 0; unsigned long long rx, tx, short_rx, short_tx; - char Rext[5]="b"; - char Text[5]="b"; - + const char *Rext = "B"; + const char *Text = "B"; + static char flags[200]; + #if HAVE_AFIPX static struct aftype *ipxtype = NULL; #endif @@ -670,32 +686,70 @@ void ife_print_long(struct interface *pt if (hw == NULL) hw = get_hwntype(-1); - printf(_("%-9.9s Link encap:%s "), ptr->name, hw->title); - /* For some hardware types (eg Ash, ATM) we don't print the - hardware address if it's null. */ - if (hw->print != NULL && (! (hw_null_address(hw, ptr->hwaddr) && - hw->suppress_null_addr))) - printf(_("HWaddr %s "), hw->print(ptr->hwaddr)); -#ifdef IFF_PORTSEL - if (ptr->flags & IFF_PORTSEL) { - printf(_("Media:%s"), if_port_text[ptr->map.port][0]); - if (ptr->flags & IFF_AUTOMEDIA) - printf(_("(auto)")); - } + sprintf(flags, "flags=%d<", ptr->flags); + /* DONT FORGET TO ADD THE FLAGS IN ife_print_short, too */ + if (ptr->flags == 0) + strcat(flags,">"); + if (ptr->flags & IFF_UP) + strcat(flags,_("UP,")); + if (ptr->flags & IFF_BROADCAST) + strcat(flags,_("BROADCAST,")); + if (ptr->flags & IFF_DEBUG) + strcat(flags,_("DEBUG,")); + if (ptr->flags & IFF_LOOPBACK) + strcat(flags,_("LOOPBACK,")); + if (ptr->flags & IFF_POINTOPOINT) + strcat(flags,_("POINTOPOINT,")); + if (ptr->flags & IFF_NOTRAILERS) + strcat(flags,_("NOTRAILERS,")); + if (ptr->flags & IFF_RUNNING) + strcat(flags,_("RUNNING,")); + if (ptr->flags & IFF_NOARP) + strcat(flags,_("NOARP,")); + if (ptr->flags & IFF_PROMISC) + strcat(flags,_("PROMISC,")); + if (ptr->flags & IFF_ALLMULTI) + strcat(flags,_("ALLMULTI,")); + if (ptr->flags & IFF_SLAVE) + strcat(flags,_("SLAVE,")); + if (ptr->flags & IFF_MASTER) + strcat(flags,_("MASTER,")); + if (ptr->flags & IFF_MULTICAST) + strcat(flags,_("MULTICAST,")); +#ifdef HAVE_DYNAMIC + if (ptr->flags & IFF_DYNAMIC) + strcat(flags,_("DYNAMIC,")); +#endif + /* DONT FORGET TO ADD THE FLAGS IN ife_print_short */ + if (flags[strlen(flags)-1] == ',') + flags[strlen(flags)-1] = '>'; + else + flags[strlen(flags)-1] = 0; + + + printf(_("%s: %s mtu %d metric %d"), + ptr->name, flags, ptr->mtu, ptr->metric ? ptr->metric : 1); +#ifdef SIOCSKEEPALIVE + if (ptr->outfill || ptr->keepalive) + printf(_(" outfill %d keepalive %d"), + ptr->outfill, ptr->keepalive); #endif printf("\n"); + + #if HAVE_AFINET if (ptr->has_ip) { - printf(_(" %s addr:%s "), ap->name, + printf(_(" %s %s"), ap->name, ap->sprint(&ptr->addr, 1)); - if (ptr->flags & IFF_POINTOPOINT) { - printf(_(" P-t-P:%s "), ap->sprint(&ptr->dstaddr, 1)); - } + printf(_(" netmask %s"), ap->sprint(&ptr->netmask, 1)); if (ptr->flags & IFF_BROADCAST) { - printf(_(" Bcast:%s "), ap->sprint(&ptr->broadaddr, 1)); + printf(_(" broadcast %s"), ap->sprint(&ptr->broadaddr, 1)); + } + if (ptr->flags & IFF_POINTOPOINT) { + printf(_(" destination %s"), ap->sprint(&ptr->dstaddr, 1)); } - printf(_(" Mask:%s\n"), ap->sprint(&ptr->netmask, 1)); + printf("\n"); } #endif @@ -712,29 +766,30 @@ void ife_print_long(struct interface *pt addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4], addr6p[5], addr6p[6], addr6p[7]); inet6_aftype.input(1, addr6, (struct sockaddr *) &sap); - printf(_(" inet6 addr: %s/%d"), - inet6_aftype.sprint((struct sockaddr *) &sap, 1), plen); - printf(_(" Scope:")); - switch (scope) { - case 0: - printf(_("Global")); - break; - case IPV6_ADDR_LINKLOCAL: - printf(_("Link")); - break; - case IPV6_ADDR_SITELOCAL: - printf(_("Site")); - break; - case IPV6_ADDR_COMPATv4: - printf(_("Compat")); - break; - case IPV6_ADDR_LOOPBACK: - printf(_("Host")); - break; - default: - printf(_("Unknown")); + printf(_(" %s %s prefixlen %d"), + inet6_aftype.name, + inet6_aftype.sprint((struct sockaddr *) &sap, 1), + plen); + printf(_(" scopeid 0x%x"), scope); + + flags[0] = '<'; flags[1] = 0; + if (scope & IPV6_ADDR_COMPATv4) { + strcat(flags, _("compat,")); + scope -= IPV6_ADDR_COMPATv4; } - printf("\n"); + if (scope == 0) + strcat(flags, _("global,")); + if (scope & IPV6_ADDR_LINKLOCAL) + strcat(flags, _("link,")); + if (scope & IPV6_ADDR_SITELOCAL) + strcat(flags, _("site,")); + if (scope & IPV6_ADDR_LOOPBACK) + strcat(flags, _("host,")); + if (flags[strlen(flags)-1] == ',') + flags[strlen(flags)-1] = '>'; + else + flags[strlen(flags)-1] = 0; + printf("%s\n", flags); } } fclose(f); @@ -747,17 +802,17 @@ void ife_print_long(struct interface *pt if (ipxtype != NULL) { if (ptr->has_ipx_bb) - printf(_(" IPX/Ethernet II addr:%s\n"), - ipxtype->sprint(&ptr->ipxaddr_bb, 1)); + printf(_(" %s Ethernet-II %s\n"), + ipxtype->name, ipxtype->sprint(&ptr->ipxaddr_bb, 1)); if (ptr->has_ipx_sn) - printf(_(" IPX/Ethernet SNAP addr:%s\n"), - ipxtype->sprint(&ptr->ipxaddr_sn, 1)); + printf(_(" %s Ethernet-SNAP %s\n"), + ipxtype->name, ipxtype->sprint(&ptr->ipxaddr_sn, 1)); if (ptr->has_ipx_e2) - printf(_(" IPX/Ethernet 802.2 addr:%s\n"), - ipxtype->sprint(&ptr->ipxaddr_e2, 1)); + printf(_(" %s Ethernet802.2 %s\n"), + ipxtype->name, ipxtype->sprint(&ptr->ipxaddr_e2, 1)); if (ptr->has_ipx_e3) - printf(_(" IPX/Ethernet 802.3 addr:%s\n"), - ipxtype->sprint(&ptr->ipxaddr_e3, 1)); + printf(_(" %s Ethernet802.3 %s\n"), + ipxtype->name, ipxtype->sprint(&ptr->ipxaddr_e3, 1)); } #endif @@ -766,7 +821,7 @@ void ife_print_long(struct interface *pt ddptype = get_afntype(AF_APPLETALK); if (ddptype != NULL) { if (ptr->has_ddp) - printf(_(" EtherTalk Phase 2 addr:%s\n"), ddptype->sprint(&ptr->ddpaddr, 1)); + printf(_(" %s %s\n"), ddptype->name, ddptype->sprint(&ptr->ddpaddr, 1)); } #endif @@ -775,53 +830,30 @@ void ife_print_long(struct interface *pt ectype = get_afntype(AF_ECONET); if (ectype != NULL) { if (ptr->has_econet) - printf(_(" econet addr:%s\n"), ectype->sprint(&ptr->ecaddr, 1)); + printf(_(" %s %s\n"), ectype->name, ectype->sprint(&ptr->ecaddr, 1)); } #endif - printf(" "); - /* DONT FORGET TO ADD THE FLAGS IN ife_print_short, too */ - if (ptr->flags == 0) - printf(_("[NO FLAGS] ")); - if (ptr->flags & IFF_UP) - printf(_("UP ")); - if (ptr->flags & IFF_BROADCAST) - printf(_("BROADCAST ")); - if (ptr->flags & IFF_DEBUG) - printf(_("DEBUG ")); - if (ptr->flags & IFF_LOOPBACK) - printf(_("LOOPBACK ")); - if (ptr->flags & IFF_POINTOPOINT) - printf(_("POINTOPOINT ")); - if (ptr->flags & IFF_NOTRAILERS) - printf(_("NOTRAILERS ")); - if (ptr->flags & IFF_RUNNING) - printf(_("RUNNING ")); - if (ptr->flags & IFF_NOARP) - printf(_("NOARP ")); - if (ptr->flags & IFF_PROMISC) - printf(_("PROMISC ")); - if (ptr->flags & IFF_ALLMULTI) - printf(_("ALLMULTI ")); - if (ptr->flags & IFF_SLAVE) - printf(_("SLAVE ")); - if (ptr->flags & IFF_MASTER) - printf(_("MASTER ")); - if (ptr->flags & IFF_MULTICAST) - printf(_("MULTICAST ")); -#ifdef HAVE_DYNAMIC - if (ptr->flags & IFF_DYNAMIC) - printf(_("DYNAMIC ")); -#endif - /* DONT FORGET TO ADD THE FLAGS IN ife_print_short */ - printf(_(" MTU:%d Metric:%d"), - ptr->mtu, ptr->metric ? ptr->metric : 1); -#ifdef SIOCSKEEPALIVE - if (ptr->outfill || ptr->keepalive) - printf(_(" Outfill:%d Keepalive:%d"), - ptr->outfill, ptr->keepalive); + /* For some hardware types (eg Ash, ATM) we don't print the + hardware address if it's null. */ + if (hw->print != NULL && (! (hw_null_address(hw, ptr->hwaddr) && + hw->suppress_null_addr))) + printf(_(" %s %s"), hw->name, hw->print(ptr->hwaddr)); + else + printf(_(" %s"), hw->name); + if (ptr->tx_queue_len != -1) + printf(_(" txqueuelen %d"), ptr->tx_queue_len); + printf(" (%s)\n", hw->title); + +#ifdef IFF_PORTSEL + if (ptr->flags & IFF_PORTSEL) { + printf(_(" media %s"), if_port_text[ptr->map.port][0]); + if (ptr->flags & IFF_AUTOMEDIA) + printf(_("autoselect")); + printf("\n"); + } #endif - printf("\n"); + /* If needed, display the interface statistics. */ @@ -830,55 +862,87 @@ void ife_print_long(struct interface *pt * not for the aliases, although strictly speaking they're shared * by all addresses. */ - printf(" "); - - printf(_("RX packets:%llu errors:%lu dropped:%lu overruns:%lu frame:%lu\n"), - ptr->stats.rx_packets, ptr->stats.rx_errors, - ptr->stats.rx_dropped, ptr->stats.rx_fifo_errors, - ptr->stats.rx_frame_errors); - if (can_compress) - printf(_(" compressed:%lu\n"), ptr->stats.rx_compressed); - rx = ptr->stats.rx_bytes; - tx = ptr->stats.tx_bytes; short_rx = rx * 10; + if (rx > 1125899906842624ull) { + short_rx /= 1125899906842624ull; + Rext = "PiB"; + } else if (rx > 1099511627776ull) { + short_rx /= 1099511627776ull; + Rext = "TiB"; + } else if (rx > 1073741824ull) { + short_rx /= 1073741824ull; + Rext = "GiB"; + } else if (rx > 1048576) { + short_rx /= 1048576; + Rext = "MiB"; + } else if (rx > 1024) { + short_rx /= 1024; + Rext = "KiB"; + } + tx = ptr->stats.tx_bytes; short_tx = tx * 10; - if (rx > 1048576) { short_rx /= 1048576; strcpy(Rext, "Mb"); } - else if (rx > 1024) { short_rx /= 1024; strcpy(Rext, "Kb"); } - if (tx > 1048576) { short_tx /= 1048576; strcpy(Text, "Mb"); } - else if (tx > 1024) { short_tx /= 1024; strcpy(Text, "Kb"); } - - printf(" "); - printf(_("TX packets:%llu errors:%lu dropped:%lu overruns:%lu carrier:%lu\n"), - ptr->stats.tx_packets, ptr->stats.tx_errors, - ptr->stats.tx_dropped, ptr->stats.tx_fifo_errors, - ptr->stats.tx_carrier_errors); - printf(_(" collisions:%lu "), ptr->stats.collisions); - if (can_compress) - printf(_("compressed:%lu "), ptr->stats.tx_compressed); - if (ptr->tx_queue_len != -1) - printf(_("txqueuelen:%d "), ptr->tx_queue_len); - printf("\n "); - printf(_("RX bytes:%llu (%lu.%lu %s) TX bytes:%llu (%lu.%lu %s)\n"), + if (tx > 1125899906842624ull) { + short_tx /= 1125899906842624ull; + Text = "PiB"; + } else if (tx > 1099511627776ull) { + short_tx /= 1099511627776ull; + Text = "TiB"; + } else if (tx > 1073741824ull) { + short_tx /= 1073741824ull; + Text = "GiB"; + } else if (tx > 1048576) { + short_tx /= 1048576; + Text = "MiB"; + } else if (tx > 1024) { + short_tx /= 1024; + Text = "KiB"; + } + + printf(" "); + printf(_("RX packets %llu bytes %llu (%lu.%lu %s)\n"), + ptr->stats.rx_packets, rx, (unsigned long)(short_rx / 10), - (unsigned long)(short_rx % 10), Rext, - tx, (unsigned long)(short_tx / 10), - (unsigned long)(short_tx % 10), Text); + (unsigned long)(short_rx % 10), Rext); + if (can_compress) { + printf(" "); + printf(_("RX compressed:%lu\n"), ptr->stats.rx_compressed); + } + printf(" "); + printf(_("RX errors %lu dropped %lu overruns %lu frame %lu\n"), + ptr->stats.rx_errors, ptr->stats.rx_dropped, + ptr->stats.rx_fifo_errors, ptr->stats.rx_frame_errors); + + + printf(" "); + printf(_("TX packets %llu bytes %llu (%lu.%lu %s)\n"), + ptr->stats.tx_packets, + tx, (unsigned long)(short_tx / 10), + (unsigned long)(short_tx % 10), Text); + if (can_compress) { + printf(" "); + printf(_("TX compressed %lu\n"), ptr->stats.tx_compressed); + } + printf(" "); + printf(_("TX errors %lu dropped %lu overruns %lu carrier %lu collisions %lu\n"), + ptr->stats.tx_errors, + ptr->stats.tx_dropped, ptr->stats.tx_fifo_errors, + ptr->stats.tx_carrier_errors, ptr->stats.collisions); } if ((ptr->map.irq || ptr->map.mem_start || ptr->map.dma || - ptr->map.base_addr)) { - printf(" "); + ptr->map.base_addr >= 0x100)) { + printf(" device "); if (ptr->map.irq) - printf(_("Interrupt:%d "), ptr->map.irq); + printf(_("interrupt %d "), ptr->map.irq); if (ptr->map.base_addr >= 0x100) /* Only print devices using it for I/O maps */ - printf(_("Base address:0x%x "), ptr->map.base_addr); + printf(_("base 0x%x "), ptr->map.base_addr); if (ptr->map.mem_start) { - printf(_("Memory:%lx-%lx "), ptr->map.mem_start, ptr->map.mem_end); + printf(_("memory 0x%lx-%lx "), ptr->map.mem_start, ptr->map.mem_end); } if (ptr->map.dma) - printf(_("DMA chan:%x "), ptr->map.dma); + printf(_(" dma 0x%x"), ptr->map.dma); printf("\n"); } printf("\n"); Index: net-tools/lib/ipx.c =================================================================== --- net-tools.orig/lib/ipx.c +++ net-tools/lib/ipx.c @@ -133,6 +133,9 @@ static int IPX_input(int type, char *buf char *ep; int nbo; + if (!sai) + return (-1); + sai->sipx_family = AF_IPX; sai->sipx_network = htonl(0); sai->sipx_node[0] = sai->sipx_node[1] = sai->sipx_node[2] = Index: net-tools/lib/ipx_gr.c =================================================================== --- net-tools.orig/lib/ipx_gr.c +++ net-tools/lib/ipx_gr.c @@ -38,21 +38,27 @@ int IPX_rprint(int options) char net[128], router_net[128]; char router_node[128]; int num; - FILE *fp = fopen(_PATH_PROCNET_IPX_ROUTE, "r"); + FILE *fp; struct aftype *ap; struct sockaddr sa; - if ((ap = get_afntype(AF_IPX)) == NULL) { - EINTERN("lib/ipx_rt.c", "AF_IPX missing"); - return (-1); - } + fp = fopen(_PATH_PROCNET_IPX_ROUTE1, "r"); if (!fp) { - perror(_PATH_PROCNET_IPX_ROUTE); - printf(_("IPX not configured in this system.\n")); + fp = fopen(_PATH_PROCNET_IPX_ROUTE2, "r"); + } + + if (!fp) { + perror(NULL); + printf(_("IPX routing not in file %s or %s found.\n"), _PATH_PROCNET_IPX_ROUTE1, _PATH_PROCNET_IPX_ROUTE2); return 1; } + if ((ap = get_afntype(AF_IPX)) == NULL) { + EINTERN("lib/ipx_rt.c", "AF_IPX missing"); + return (-1); + } + printf(_("Kernel IPX routing table\n")); /* xxx */ printf(_("Destination Router Net Router Node\n")); Index: net-tools/lib/irda.c =================================================================== --- net-tools.orig/lib/irda.c +++ net-tools/lib/irda.c @@ -1,13 +1,15 @@ /********************************************************************* * * Filename: irda.c - * Version: 0.1 - * Description: A first attempt to make ifconfig understand IrDA + * Version: 0.2 + * Description: A second attempt to make ifconfig understand IrDA * Status: Experimental. * Author: Dag Brattli <dagb@cs.uit.no> * Created at: Wed Apr 21 09:03:09 1999 * Modified at: Wed Apr 21 09:17:05 1999 * Modified by: Dag Brattli <dagb@cs.uit.no> + * Modified at: Wed May 1 11:51:44 CEST 2002 + * Modified by: Christoph Bartelmus <christoph@bartelmus.de> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -59,9 +61,9 @@ */ static char *irda_print(unsigned char *ptr) { - static char buff[8]; + static char buff[12]; - sprintf(&buff[strlen(buff)], "%02x:%02x:%02x:%02x", ptr[3], ptr[2], + snprintf(buff, 12, "%02x:%02x:%02x:%02x", ptr[3], ptr[2], ptr[1], ptr[0]); return (buff); Index: net-tools/lib/net-features.h =================================================================== --- net-tools.orig/lib/net-features.h +++ net-tools/lib/net-features.h @@ -295,6 +295,13 @@ static char *Features = "-" #endif "HDLC/LAPB " + +#if HAVE_HWEUI64 +"+" +#else +"-" +#endif +"EUI64 " ; Index: net-tools/lib/nstrcmp.c =================================================================== --- net-tools.orig/lib/nstrcmp.c +++ net-tools/lib/nstrcmp.c @@ -1,34 +1,157 @@ /* Copyright 1998 by Andi Kleen. Subject to the GPL. */ -/* $Id: nstrcmp.c,v 1.2 1998/11/15 20:11:38 freitag Exp $ */ +/* rewritten by bernd eckenfels because of complicated alias semantic */ +/* $Id: nstrcmp.c,v 1.4 2004/06/03 22:49:17 ecki Exp $ */ #include <ctype.h> #include <stdlib.h> +#include <string.h> #include "util.h" -/* like strcmp(), but knows about numbers */ -int nstrcmp(const char *astr, const char *b) + +/* return numerical :999 suffix or null. sideeffect: replace ':' with \0 */ +char* cutalias(char* name) { - const char *a = astr; + int digit = 0; + int pos; + + for(pos=strlen(name); pos>0; pos--) + { + if (name[pos-1]==':' && digit) + { + name[pos-1]='\0'; + return name+pos; + } + if (!isdigit(name[pos-1])) + break; + digit = 1; + } + return NULL; +} - while (*a == *b) { - if (*a == '\0') - return 0; - a++; - b++; - } - if (isdigit(*a)) { - if (!isdigit(*b)) - return -1; - while (a > astr) { - a--; - if (!isdigit(*a)) { - a++; - break; - } - if (!isdigit(*b)) - return -1; - b--; + +/* return index of last non digit or -1 if it does not end with digits */ +int rindex_nondigit(char *name) +{ + int pos = strlen(name); + + for(pos=strlen(name); pos>0; pos--) + { + if (!isdigit(name[pos-1])) + return pos; } - return atoi(a) > atoi(b) ? 1 : -1; - } - return *a - *b; + return 0; +} + + +/* like strcmp(), but knows about numbers and ':' alias suffix */ +int nstrcmp(const char *ap, const char *bp) +{ + char *a = (char*)strdup(ap); + char *b = (char*)strdup(bp); + char *an, *bn; + int av = 0, bv = 0; + char *aalias=cutalias(a); + char *balias=cutalias(b); + int aindex=rindex_nondigit(a); + int bindex=rindex_nondigit(b); + int complen=(aindex<bindex)?aindex:bindex; + int res = strncmp(a, b, complen); + + if (res != 0) + { free(a); free(b); return res; } + + if (aindex > bindex) + { free(a); free(b); return 1; } + + if (aindex < bindex) + { free(a); free(b); return -1; } + + an = a+aindex; + bn = b+bindex; + + av = atoi(an); + bv = atoi(bn); + + if (av < bv) + { free(a); free(b); return -1; } + + if (av > bv) + { free(a); free(b); return 1; } + + av = -1; + if (aalias != NULL) + av = atoi(aalias); + + bv = -1; + if (balias != NULL) + bv = atoi(balias); + + free(a); free(b); + + if (av < bv) + return -1; + + if (av > bv) + return 1; + + return 0; +} + + +#ifdef NSTRCMP_TEST + +int cs(int s) +{ + if (s < 0) return -1; + if (s > 0) return 1; + return 0; +} + + +int dotest(char* a, char* b, int exp) +{ + int res = nstrcmp(a, b); + int err = (cs(res) != cs(exp)); + printf("nstrcmp(\"%s\", \"%s\")=%d %d %s\n", a, b, res, exp, err?"WRONG":"OK"); + return err; } + +int main() +{ + int err = 0; + + err |= dotest("eth1", "eth1", 0); + err |= dotest("eth0:1", "eth0:1", 0); + err |= dotest("lan", "lan", 0); + err |= dotest("100", "100", 0); + err |= dotest("", "", 0); + err |= dotest(":", ":", 0); + err |= dotest("a:b:c", "a:b:c", 0); + err |= dotest("a:", "a:", 0); + err |= dotest(":a", ":a", 0); + + err |= dotest("a", "aa", -1); + err |= dotest("eth0", "eth1", -1); + err |= dotest("eth1", "eth20", -1); + err |= dotest("eth20", "eth100", -1); + err |= dotest("eth1", "eth13", -1); + err |= dotest("eth", "eth2", -1); + err |= dotest("eth0:1", "eth0:2", -1); + err |= dotest("eth1:10", "eth13:10", -1); + err |= dotest("eth1:1", "eth1:13", -1); + err |= dotest("a", "a:", -1); + + err |= dotest("aa", "a", 1); + err |= dotest("eth2", "eth1", 1); + err |= dotest("eth13", "eth1", 1); + err |= dotest("eth2", "eth", 1); + err |= dotest("eth2:10", "eth2:1", 1); + err |= dotest("eth2:5", "eth2:4", 1); + err |= dotest("eth3:2", "eth2:3", 1); + err |= dotest("eth13:1", "eth1:0", 1); + err |= dotest("a:", "a", 1); + err |= dotest("a1b12", "a1b2", 1); + + return err; +} + +#endif Index: net-tools/lib/pathnames.h =================================================================== --- net-tools.orig/lib/pathnames.h +++ net-tools/lib/pathnames.h @@ -1,4 +1,3 @@ - /* * lib/pathnames.h This file contains the definitions of the path * names used by the NET-LIB. @@ -29,8 +28,10 @@ #define _PATH_PROCNET_NR_NODES "/proc/net/nr_nodes" #define _PATH_PROCNET_ARP "/proc/net/arp" #define _PATH_PROCNET_AX25 "/proc/net/ax25" -#define _PATH_PROCNET_IPX "/proc/net/ipx" -#define _PATH_PROCNET_IPX_ROUTE "/proc/net/ipx_route" +#define _PATH_PROCNET_IPX_SOCKET1 "/proc/net/ipx/socket" +#define _PATH_PROCNET_IPX_SOCKET2 "/proc/net/ipx" +#define _PATH_PROCNET_IPX_ROUTE1 "/proc/net/ipx/route" +#define _PATH_PROCNET_IPX_ROUTE2 "/proc/net/ipx_route" #define _PATH_PROCNET_ATALK "/proc/net/appletalk" #define _PATH_PROCNET_IP_BLK "/proc/net/ip_block" #define _PATH_PROCNET_IP_FWD "/proc/net/ip_forward" @@ -45,6 +46,7 @@ #define _PATH_PROCNET_X25 "/proc/net/x25" #define _PATH_PROCNET_X25_ROUTE "/proc/net/x25_routes" #define _PATH_PROCNET_DEV_MCAST "/proc/net/dev_mcast" +#define _PATH_PROCNET_ATALK_ROUTE "/proc/net/atalk_route" /* pathname for the netlink device */ #define _PATH_DEV_ROUTE "/dev/route" Index: net-tools/lib/proc.c =================================================================== --- net-tools.orig/lib/proc.c +++ net-tools/lib/proc.c @@ -1,11 +1,12 @@ /* Tolerant /proc file parser. Copyright 1998 Andi Kleen */ -/* $Id: proc.c,v 1.4 1999/01/05 20:54:00 philip Exp $ */ +/* $Id: proc.c,v 1.5 2007/12/01 18:44:57 ecki Exp $ */ /* Fixme: cannot currently cope with removed fields */ #include <string.h> #include <stdarg.h> #include <stdio.h> #include <ctype.h> +#include <unistd.h> /* Caller must free return string. */ @@ -72,3 +73,22 @@ int proc_guess_fmt(char *name, FILE *fh, va_end(ap); return flag; } + + +FILE *proc_fopen(const char *name) +{ + static char *buffer; + static size_t pagesz; + FILE *fd = fopen(name, "r"); + + if (fd == NULL) + return NULL; + + if (!buffer) { + pagesz = getpagesize(); + buffer = malloc(pagesz); + } + + setvbuf(fd, buffer, _IOFBF, pagesz); + return fd; +} Index: net-tools/lib/proc.h =================================================================== --- net-tools.orig/lib/proc.h +++ net-tools/lib/proc.h @@ -1,5 +1,7 @@ - - -/* Generate a suitable scanf format for a column title line */ +/* + * prototypes for proc.c + */ char *proc_gen_fmt(char *name, int more, FILE * fh,...); int proc_guess_fmt(char *name, FILE* fh,...); +FILE *proc_fopen(const char *name); + Index: net-tools/lib/tr.c =================================================================== --- net-tools.orig/lib/tr.c +++ net-tools/lib/tr.c @@ -2,7 +2,7 @@ * lib/tr.c This file contains an implementation of the "Tokenring" * support functions. * - * Version: $Id: tr.c,v 1.8 2000/02/02 08:56:30 freitag Exp $ + * Version: $Id: tr.c,v 1.9 2005/05/16 03:15:12 ecki Exp $ * * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> * Copyright 1993 MicroWalt Corporation @@ -30,8 +30,14 @@ #include "net-support.h" #include "pathnames.h" #include "intl.h" +#include "util.h" + +/* actual definition at the end of file */ extern struct hwtype tr_hwtype; +#ifdef ARPHRD_IEEE802_TR +extern struct hwtype tr_hwtype1; +#endif static char *pr_tr(unsigned char *ptr) { @@ -42,7 +48,7 @@ static char *pr_tr(unsigned char *ptr) (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377) ); return (buff); -} + } static int in_tr(char *bufp, struct sockaddr *sap) @@ -51,7 +57,17 @@ static int in_tr(char *bufp, struct sock char c, *orig; int i, val; +#ifdef ARPHRD_IEEE802_TR + if (kernel_version() < KRELEASE(2,3,30)) { + sap->sa_family = tr_hwtype.type; + } else { + sap->sa_family = tr_hwtype1.type; + } +#else sap->sa_family = tr_hwtype.type; + #warning "Limited functionality, no support for ARPHRD_IEEE802_TR (old kernel headers?)" +#endif + ptr = sap->sa_data; i = 0; Index: net-tools/lib/util-ank.c =================================================================== --- net-tools.orig/lib/util-ank.c +++ net-tools/lib/util-ank.c @@ -293,7 +293,7 @@ int inet_addr_match(inet_prefix *a, inet return 0; } -const char *format_host(int af, void *addr, __u8 *abuf, int alen) +const char *format_host(int af, void *addr, char *abuf, int alen) { #ifdef RESOLVE_HOSTNAMES if (resolve_hosts) { Index: net-tools/lib/util.h =================================================================== --- net-tools.orig/lib/util.h +++ net-tools/lib/util.h @@ -14,3 +14,6 @@ int nstrcmp(const char *, const char *); char *safe_strncpy(char *dst, const char *src, size_t size); + +#define netmin(a,b) ((a)<(b) ? (a) : (b)) +#define netmax(a,b) ((a)>(b) ? (a) : (b)) Index: net-tools/lib/x25_sr.c =================================================================== --- net-tools.orig/lib/x25_sr.c +++ net-tools/lib/x25_sr.c @@ -67,7 +67,7 @@ static int X25_setroute(int action, int strcpy(target, *args++); /* Clean out the x25_route_struct structure. */ - memset((char *) &rt, 0, sizeof(struct x25_route_struct)); + memset((char *) &rt, 0, sizeof(rt)); if ((sigdigits = x25_aftype.input(0, target, (struct sockaddr *)&sx25)) < 0) { @@ -76,8 +76,8 @@ static int X25_setroute(int action, int } rt.sigdigits=sigdigits; - /* x25_route_struct.address isn't type struct sockaddr_x25, Why? */ - memcpy(&rt.address, &sx25.sx25_addr, sizeof(x25_address)); + /* this works with 2.4 and 2.6 headers struct x25_address vs. typedef */ + memcpy(&rt.address, &sx25.sx25_addr, sizeof(sx25.sx25_addr)); while (*args) { if (!strcmp(*args,"device") || !strcmp(*args,"dev")) { Index: net-tools/lib/eui64.c =================================================================== --- /dev/null +++ net-tools/lib/eui64.c @@ -0,0 +1,155 @@ +/* + * lib/eui64.c This file contains support for generic EUI-64 hw addressing + * + * Version: $Id: eui64.c,v 1.1 2001/11/12 02:12:05 ecki Exp $ + * + * Author: Daniel Stodden <stodden@in.tum.de> + * Copyright 2001 Daniel Stodden + * + * blueprinted from ether.c + * Copyright 1993 MicroWalt Corporation + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at + * your option) any later version. + */ +#include "config.h" + +#if HAVE_HWEUI64 + +#include <sys/types.h> +#include <sys/ioctl.h> +#include <sys/socket.h> +#include <net/if_arp.h> +#include <stdlib.h> +#include <stdio.h> +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <string.h> +#include <termios.h> +#include <unistd.h> +#include "net-support.h" +#include "pathnames.h" +#include "intl.h" + +/* + * EUI-64 constants + */ + +#define EUI64_ALEN 8 + +#ifndef ARPHRD_EUI64 +#define ARPHRD_EUI64 27 +#warning "ARPHRD_EUI64 not defined in <net/if_arp.h>. Using private value 27" +#endif + +struct hwtype eui64_hwtype; + +/* Display an EUI-64 address in readable format. */ +static char *pr_eui64( unsigned char *ptr ) +{ + static char buff[64]; + + snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", + (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377), (ptr[3] & 0377), + (ptr[4] & 0377), (ptr[5] & 0377), (ptr[6] & 0377), (ptr[7] & 0377) + ); + return (buff); +} + +/* Start the PPP encapsulation on the file descriptor. */ +static int in_eui64( char *bufp, struct sockaddr *sap ) +{ + unsigned char *ptr; + char c, *orig; + int i; + unsigned val; + + sap->sa_family = eui64_hwtype.type; + ptr = sap->sa_data; + + i = 0; + orig = bufp; + + while ((*bufp != '\0') && (i < EUI64_ALEN)) { + val = 0; + c = *bufp++; + if (isdigit(c)) + val = c - '0'; + else if (c >= 'a' && c <= 'f') + val = c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + val = c - 'A' + 10; + else { +#ifdef DEBUG + fprintf( stderr, _("in_eui64(%s): invalid eui64 address!\n"), + orig ); +#endif + errno = EINVAL; + return (-1); + } + + val <<= 4; + c = *bufp; + if (isdigit(c)) + val |= c - '0'; + else if (c >= 'a' && c <= 'f') + val |= c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + val |= c - 'A' + 10; + else if (c == ':' || c == 0) + val >>= 4; + else { +#ifdef DEBUG + fprintf( stderr, _("in_eui64(%s): invalid eui64 address!\n"), + orig ); +#endif + errno = EINVAL; + return (-1); + } + + if (c != 0) + bufp++; + + *ptr++ = (unsigned char) (val & 0377); + i++; + + /* We might get a semicolon here - not required. */ + if (*bufp == ':') { + if (i == EUI64_ALEN) { +#ifdef DEBUG + fprintf(stderr, _("in_eui64(%s): trailing : ignored!\n"), + orig) +#endif + ; /* nothing */ + } + bufp++; + } + } + + /* That's it. Any trailing junk? */ + if ((i == EUI64_ALEN) && (*bufp != '\0')) { +#ifdef DEBUG + fprintf(stderr, _("in_eui64(%s): trailing junk!\n"), orig); + errno = EINVAL; + return (-1); +#endif + } +#ifdef DEBUG + fprintf(stderr, "in_eui64(%s): %s\n", orig, pr_eui64(sap->sa_data)); +#endif + + return (0); +} + +struct hwtype eui64_hwtype = +{ + "eui64", NULL, /*"EUI-64 addressing", */ ARPHRD_EUI64, EUI64_ALEN, + pr_eui64, in_eui64, NULL, 0 +}; + + +#endif /* HAVE_EUI64 */ Index: net-tools/lib/ib.c =================================================================== --- /dev/null +++ net-tools/lib/ib.c @@ -0,0 +1,147 @@ +/* + * lib/ib.c This file contains an implementation of the "Infiniband" + * support functions. + * + * Version: $Id: ib.c,v 1.1 2005/02/06 11:00:47 tduffy Exp $ + * + * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> + * Copyright 1993 MicroWalt Corporation + * Tom Duffy <tduffy@sun.com> + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at + * your option) any later version. + */ +#include "config.h" + +#if HAVE_HWIB +#include <sys/types.h> +#include <sys/socket.h> +#include <net/if_arp.h> +#include <linux/if_infiniband.h> +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> +#include <ctype.h> +#include <string.h> +#include <unistd.h> +#include "net-support.h" +#include "pathnames.h" +#include "intl.h" +#include "util.h" + +extern struct hwtype ib_hwtype; + + +/* Display an InfiniBand address in readable format. */ +static char *pr_ib(unsigned char *ptr) +{ + static char buff[128]; + char *pos; + unsigned int i; + + pos = buff; + for (i = 0; i < INFINIBAND_ALEN; i++) { + pos += sprintf(pos, "%02X:", (*ptr++ & 0377)); + } + buff[strlen(buff) - 1] = '\0'; + + /* snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X", + (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377), + (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377) + ); + */ + return (buff); +} + + +/* Input an Infiniband address and convert to binary. */ +static int in_ib(char *bufp, struct sockaddr *sap) +{ + unsigned char *ptr; + char c, *orig; + int i; + unsigned val; + + sap->sa_family = ib_hwtype.type; + ptr = sap->sa_data; + + i = 0; + orig = bufp; + while ((*bufp != '\0') && (i < INFINIBAND_ALEN)) { + val = 0; + c = *bufp++; + if (isdigit(c)) + val = c - '0'; + else if (c >= 'a' && c <= 'f') + val = c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + val = c - 'A' + 10; + else { +#ifdef DEBUG + fprintf(stderr, _("in_ib(%s): invalid infiniband address!\n"), orig); +#endif + errno = EINVAL; + return (-1); + } + val <<= 4; + c = *bufp; + if (isdigit(c)) + val |= c - '0'; + else if (c >= 'a' && c <= 'f') + val |= c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + val |= c - 'A' + 10; + else if (c == ':' || c == 0) + val >>= 4; + else { +#ifdef DEBUG + fprintf(stderr, _("in_ib(%s): invalid infiniband address!\n"), orig); +#endif + errno = EINVAL; + return (-1); + } + if (c != 0) + bufp++; + *ptr++ = (unsigned char) (val & 0377); + i++; + + /* We might get a semicolon here - not required. */ + if (*bufp == ':') { + if (i == INFINIBAND_ALEN) { +#ifdef DEBUG + fprintf(stderr, _("in_ib(%s): trailing : ignored!\n"), + orig) +#endif + ; /* nothing */ + } + bufp++; + } + } + + /* That's it. Any trailing junk? */ + if ((i == INFINIBAND_ALEN) && (*bufp != '\0')) { +#ifdef DEBUG + fprintf(stderr, _("in_ib(%s): trailing junk!\n"), orig); + errno = EINVAL; + return (-1); +#endif + } +#ifdef DEBUG + fprintf(stderr, "in_ib(%s): %s\n", orig, pr_ib(sap->sa_data)); +#endif + + return (0); +} + + +struct hwtype ib_hwtype = +{ + "infiniband", NULL, ARPHRD_INFINIBAND, INFINIBAND_ALEN, + pr_ib, in_ib, NULL +}; + + +#endif /* HAVE_HWIB */