finally in sync with archive
[bcm963xx.git] / userapps / opensource / net-snmp / apps / snmpnetstat / if.c
diff --git a/userapps/opensource/net-snmp/apps/snmpnetstat/if.c b/userapps/opensource/net-snmp/apps/snmpnetstat/if.c
deleted file mode 100755 (executable)
index c3bb007..0000000
+++ /dev/null
@@ -1,891 +0,0 @@
-/*****************************************************************
-       Copyright 1989, 1991, 1992 by Carnegie Mellon University
-
-                      All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its 
-documentation for any purpose and without fee is hereby granted, 
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in 
-supporting documentation, and that the name of CMU not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.  
-
-CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-******************************************************************/
-/*
- * Copyright (c) 1983,1988 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that this notice is preserved and that due credit is given
- * to the University of California at Berkeley. The name of the University
- * may not be used to endorse or promote products derived from this
- * software without specific prior written permission. This software
- * is provided ``as is'' without express or implied warranty.
- */
-
-#include <net-snmp/net-snmp-config.h>
-
-#if HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#if HAVE_STRING_H
-#include <string.h>
-#else
-#include <strings.h>
-#endif
-
-#include <sys/types.h>
-#if TIME_WITH_SYS_TIME
-# ifdef WIN32
-#  include <sys/timeb.h>
-# else
-#  include <sys/time.h>
-# endif
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#if HAVE_SYS_SELECT_H
-#include <sys/select.h>
-#endif
-#if HAVE_NETINET_IN_H
-#include <netinet/in.h>
-#endif
-
-#include <stdio.h>
-#include <signal.h>
-
-#if HAVE_WINSOCK_H
-#include <winsock.h>
-#endif
-#if HAVE_SYS_SOCKET_H
-#include <sys/socket.h>
-#endif
-#if HAVE_NETDB_H
-#include <netdb.h>
-#endif
-
-#include "main.h"
-#include <net-snmp/net-snmp-includes.h>
-#include "netstat.h"
-
-#define        YES     1
-#define        NO      0
-
-static void     sidewaysintpr(unsigned int);
-static void     timerSet(int interval_seconds);
-static void     timerPause(void);
-
-static oid      oid_ifname[] = { 1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 1 };
-static oid      oid_ifinucastpkts[] = { 1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 1 };
-static oid      oid_cfg_nnets[] = { 1, 3, 6, 1, 2, 1, 2, 1, 0 };
-static oid      oid_ipadentaddr[] =
-    { 1, 3, 6, 1, 2, 1, 4, 20, 1, 1, 0, 0, 0, 0 };
-
-#define IFINDEX                1
-#define IFNAME         2
-#define IFMTU          4
-#define IFOPERSTATUS   8
-#define INOCTETS       10
-#define INUCASTPKTS    11
-#define INNUCASTPKTS   12
-#define INERRORS       14
-#define OUTOCTETS      16
-#define OUTUCASTPKTS   17
-#define OUTNUCASTPKTS  18
-#define OUTERRORS      20
-#define OUTQLEN                21
-
-#define IPADDR         1
-#define        IPIFINDEX       2
-#define IPNETMASK      3
-
-
-/*
- * Print a description of the network interfaces.
- */
-void
-intpr(int interval)
-{
-    oid             varname[MAX_OID_LEN], *instance, *ifentry;
-    size_t          varname_len;
-    int             ifnum, cfg_nnets;
-    oid             curifip[4];
-    netsnmp_variable_list *var;
-    netsnmp_pdu    *request, *response;
-    int             status;
-    int             ifindex, oldindex = 0;
-    struct _if_info {
-        char            name[128];
-        char            ip[128], route[128];
-        int             mtu;
-        int             ifindex;
-        char            s_ipkts[20], s_ierrs[20], s_opkts[20], s_oerrs[20],
-            s_outq[20];
-        unsigned long   ipkts, opkts;
-        int             operstatus;
-        u_long          netmask;
-        struct in_addr  ifip, ifroute;
-    }              *if_table, *cur_if;
-    int             max_name = 4, max_ip = 7, max_route = 7, max_ipkts = 5,
-        max_ierrs = 5, max_opkts = 5, max_oerrs = 5, max_outq = 5;
-    int             i;
-
-    if (interval) {
-        sidewaysintpr((unsigned) interval);
-        return;
-    }
-    var =
-        getvarbyname(Session, oid_cfg_nnets,
-                     sizeof(oid_cfg_nnets) / sizeof(oid));
-    if (var && var->val.integer) {
-        cfg_nnets = *var->val.integer;
-        snmp_free_var(var);
-    } else {
-        fprintf(stderr,
-                "No response when requesting number of interfaces.\n");
-        return;
-    }
-    DEBUGMSGTL(("netstat:if", "cfg_nnets = %d\n", cfg_nnets));
-
-    memset(curifip, 0, sizeof(curifip));
-    if_table = (struct _if_info *) calloc(cfg_nnets, sizeof(*if_table));
-    cur_if = if_table;
-
-    for (ifnum = 1; ifnum <= cfg_nnets; ifnum++) {
-        register char  *cp;
-
-        request = snmp_pdu_create(SNMP_MSG_GETNEXT);
-        memmove(varname, oid_ipadentaddr, sizeof(oid_ipadentaddr));
-        varname_len = sizeof(oid_ipadentaddr) / sizeof(oid);
-        instance = varname + 9;
-        memmove(varname + 10, curifip, sizeof(curifip));
-        *instance = IPIFINDEX;
-        snmp_add_null_var(request, varname, varname_len);
-        *instance = IPADDR;
-        snmp_add_null_var(request, varname, varname_len);
-        *instance = IPNETMASK;
-        snmp_add_null_var(request, varname, varname_len);
-
-        status = snmp_synch_response(Session, request, &response);
-        if (status != STAT_SUCCESS
-            || response->errstat != SNMP_ERR_NOERROR) {
-            fprintf(stderr,
-                    "SNMP request failed after %d out of %d interfaces (IP)\n",
-                    ifnum, cfg_nnets);
-            if (snmp_get_do_debugging()) {
-                fprintf(stderr,
-                        "status = %d, errstat = %ld, errindex = %ld\n",
-                        status, response->errstat, response->errindex);
-            }
-            cfg_nnets = ifnum;
-            break;
-        }
-        for (var = response->variables; var; var = var->next_variable) {
-            if (snmp_get_do_debugging()) {
-                print_variable(var->name, var->name_length, var);
-            }
-            switch (var->name[9]) {
-            case IPIFINDEX:
-                ifindex = *var->val.integer;
-                for (cur_if = if_table;
-                     cur_if < (if_table + cfg_nnets) &&
-                     cur_if->ifindex != ifindex &&
-                     cur_if->ifindex != 0; cur_if++);
-                if (cur_if >= (if_table + cfg_nnets)) {
-                    fprintf(stderr,
-                            "Inconsistent reponse from server. Aborting.\n");
-                    exit(0);
-                }
-                cur_if->ifindex = ifindex;
-                break;
-            case IPADDR:
-                memmove(curifip, var->name + 10, sizeof(curifip));
-                memmove(&cur_if->ifip, var->val.string, sizeof(u_long));
-                break;
-            case IPNETMASK:
-                memmove(&cur_if->netmask, var->val.string, sizeof(u_long));
-            }
-        }
-        cur_if->ifroute.s_addr = cur_if->ifip.s_addr & cur_if->netmask;
-        if (cur_if->ifroute.s_addr)
-            strcpy(cur_if->route,
-                   netname(cur_if->ifroute, cur_if->netmask));
-        else
-            strcpy(cur_if->route, "none");
-        if ((i = strlen(cur_if->route)) > max_route)
-            max_route = i;
-        if (cur_if->ifip.s_addr)
-            strcpy(cur_if->ip, routename(cur_if->ifip));
-        else
-            strcpy(cur_if->ip, "none");
-        if ((i = strlen(cur_if->ip)) > max_ip)
-            max_ip = i;
-
-        snmp_free_pdu(response);
-
-        memmove(varname, oid_ifname, sizeof(oid_ifname));
-        varname_len = sizeof(oid_ifname) / sizeof(oid);
-        ifentry = varname + 9;
-        instance = varname + 10;
-        request = snmp_pdu_create(SNMP_MSG_GETNEXT);
-
-        *instance = oldindex;
-        *ifentry = IFINDEX;
-        snmp_add_null_var(request, varname, varname_len);
-        *ifentry = IFNAME;
-        snmp_add_null_var(request, varname, varname_len);
-        *ifentry = IFMTU;
-        snmp_add_null_var(request, varname, varname_len);
-        *ifentry = IFOPERSTATUS;
-        snmp_add_null_var(request, varname, varname_len);
-        *ifentry = INUCASTPKTS;
-        snmp_add_null_var(request, varname, varname_len);
-        *ifentry = INNUCASTPKTS;
-        snmp_add_null_var(request, varname, varname_len);
-        *ifentry = INERRORS;
-        snmp_add_null_var(request, varname, varname_len);
-        *ifentry = OUTUCASTPKTS;
-        snmp_add_null_var(request, varname, varname_len);
-        *ifentry = OUTNUCASTPKTS;
-        snmp_add_null_var(request, varname, varname_len);
-        *ifentry = OUTERRORS;
-        snmp_add_null_var(request, varname, varname_len);
-        *ifentry = OUTQLEN;
-        snmp_add_null_var(request, varname, varname_len);
-
-        while ((status =
-                snmp_synch_response(Session, request,
-                                    &response)) == STAT_SUCCESS) {
-            if (response->errstat != SNMP_ERR_NOSUCHNAME)
-                break;
-            if ((request =
-                 snmp_fix_pdu(response, SNMP_MSG_GETNEXT)) == NULL)
-                break;
-            snmp_free_pdu(response);
-        }
-        if (status != STAT_SUCCESS
-            || response->errstat != SNMP_ERR_NOERROR) {
-            fprintf(stderr,
-                    "SNMP request failed after %d out of %d interfaces (IF)\n",
-                    ifnum, cfg_nnets);
-            cfg_nnets = ifnum;
-            break;
-        }
-        cur_if = if_table + ifnum - 1;
-        for (var = response->variables; var; var = var->next_variable) {
-            if (snmp_get_do_debugging()) {
-                print_variable(var->name, var->name_length, var);
-            }
-            if (!var->val.integer)
-                continue;
-            if (memcmp(var->name, oid_ifname, 8 * sizeof(oid)))
-                continue;
-            switch (var->name[9]) {
-            case IFINDEX:
-                ifindex = *var->val.integer;
-                for (cur_if = if_table;
-                     cur_if->ifindex != ifindex && cur_if->ifindex != 0;
-                     cur_if++);
-                if (cur_if >= (if_table + cfg_nnets)) {
-                    fprintf(stderr,
-                            "Inconsistent reponse from server. Aborting\n");
-                    exit(0);
-                }
-                cur_if->ifindex = ifindex;
-                break;
-            case OUTQLEN:
-                sprintf(cur_if->s_outq, "%lu", *var->val.integer);
-                i = strlen(cur_if->s_outq);
-                if (i > max_outq)
-                    max_outq = i;
-                break;
-            case OUTERRORS:
-                sprintf(cur_if->s_oerrs, "%lu", *var->val.integer);
-                i = strlen(cur_if->s_oerrs);
-                if (i > max_oerrs)
-                    max_oerrs = i;
-                break;
-            case INERRORS:
-                sprintf(cur_if->s_ierrs, "%lu", *var->val.integer);
-                i = strlen(cur_if->s_ierrs);
-                if (i > max_ierrs)
-                    max_ierrs = i;
-                break;
-            case IFMTU:
-                cur_if->mtu = *var->val.integer;
-                break;
-            case INUCASTPKTS:
-                cur_if->ipkts += *var->val.integer;
-                sprintf(cur_if->s_ipkts, "%lu", cur_if->ipkts);
-                i = strlen(cur_if->s_ipkts);
-                if (i > max_ipkts)
-                    max_ipkts = i;
-                break;
-            case INNUCASTPKTS:
-                cur_if->ipkts += *var->val.integer;
-                sprintf(cur_if->s_ipkts, "%lu", cur_if->ipkts);
-                i = strlen(cur_if->s_ipkts);
-                if (i > max_ipkts)
-                    max_ipkts = i;
-                break;
-            case OUTUCASTPKTS:
-                cur_if->opkts += *var->val.integer;
-                sprintf(cur_if->s_opkts, "%lu", cur_if->opkts);
-                i = strlen(cur_if->s_opkts);
-                if (i > max_opkts)
-                    max_opkts = i;
-                break;
-            case OUTNUCASTPKTS:
-                cur_if->opkts += *var->val.integer;
-                sprintf(cur_if->s_opkts, "%lu", cur_if->opkts);
-                i = strlen(cur_if->s_opkts);
-                if (i > max_opkts)
-                    max_opkts = i;
-                break;
-            case IFNAME:
-                oldindex = var->name[10];
-                if (var->val_len >= sizeof(cur_if->name))
-                    var->val_len = sizeof(cur_if->name) - 1;
-                memmove(cur_if->name, var->val.string, var->val_len);
-                cur_if->name[var->val_len] = 0;
-                if ((i = strlen(cur_if->name) + 1) > max_name)
-                    max_name = i;
-                break;
-            case IFOPERSTATUS:
-                cur_if->operstatus = *var->val.integer;
-                break;
-            }
-        }
-
-        snmp_free_pdu(response);
-
-        if (intrface != NULL && strcmp(cur_if->name, intrface) != 0) {
-            cur_if->name[0] = 0;
-            continue;
-        }
-        if (cur_if->operstatus != MIB_IFSTATUS_UP) {
-            cp = strchr(cur_if->name, '\0');
-            *cp++ = '*';
-            *cp = '\0';
-        }
-    }
-
-    printf("%*.*s %5.5s %*.*s %*.*s %*s %*s %*s %*s %*s",
-           -max_name, max_name, "Name", "Mtu",
-           -max_route, max_route, "Network",
-           -max_ip, max_ip, "Address",
-           max_ipkts, "Ipkts",
-           max_ierrs, "Ierrs",
-           max_opkts, "Opkts", max_oerrs, "Oerrs", max_outq, "Queue");
-    putchar('\n');
-    for (ifnum = 0, cur_if = if_table; ifnum < cfg_nnets;
-         ifnum++, cur_if++) {
-        if (cur_if->name[0] == 0)
-            continue;
-        printf("%*.*s %5d ", -max_name, max_name, cur_if->name,
-               cur_if->mtu);
-        printf("%*.*s ", -max_route, max_route, cur_if->route);
-        printf("%*.*s ", -max_ip, max_ip, cur_if->ip);
-        printf("%*s %*s %*s %*s %*s",
-               max_ipkts, cur_if->s_ipkts, max_ierrs, cur_if->s_ierrs,
-               max_opkts, cur_if->s_opkts, max_oerrs, cur_if->s_oerrs,
-               max_outq, cur_if->s_outq);
-        putchar('\n');
-    }
-    free(if_table);
-}
-
-/*
- * Print a description of the network interfaces.
- */
-void
-intpro(int interval)
-{
-    oid             varname[MAX_OID_LEN], *instance, *ifentry;
-    size_t          varname_len;
-    int             ifnum, cfg_nnets;
-    oid             curifip[4];
-    netsnmp_variable_list *var;
-    netsnmp_pdu    *request, *response;
-    int             status;
-    int             ifindex, oldindex = 0;
-    struct _if_info {
-        int             ifindex;
-        char            name[128];
-        char            ip[128], route[128];
-        char            ioctets[20], ierrs[20], ooctets[20], oerrs[20],
-            outqueue[20];
-        int             operstatus;
-        u_long          netmask;
-        struct in_addr  ifip, ifroute;
-    }              *if_table, *cur_if;
-    int             max_name = 4, max_route = 7, max_ip = 7, max_ioctets =
-        7, max_ooctets = 7;
-    int             i;
-
-    if (interval) {
-        sidewaysintpr((unsigned) interval);
-        return;
-    }
-    var =
-        getvarbyname(Session, oid_cfg_nnets,
-                     sizeof(oid_cfg_nnets) / sizeof(oid));
-    if (var && var->val.integer) {
-        cfg_nnets = *var->val.integer;
-        snmp_free_var(var);
-    } else {
-        fprintf(stderr,
-                "No response when requesting number of interfaces.\n");
-        return;
-    }
-    DEBUGMSGTL(("netstat:if", "cfg_nnets = %d\n", cfg_nnets));
-
-    memset(curifip, 0, sizeof(curifip));
-    if_table = (struct _if_info *) calloc(cfg_nnets, sizeof(*if_table));
-    cur_if = if_table;
-
-    for (ifnum = 1; ifnum <= cfg_nnets; ifnum++) {
-        register char  *cp;
-
-        request = snmp_pdu_create(SNMP_MSG_GETNEXT);
-        memmove(varname, oid_ipadentaddr, sizeof(oid_ipadentaddr));
-        varname_len = sizeof(oid_ipadentaddr) / sizeof(oid);
-        instance = varname + 9;
-        memmove(varname + 10, curifip, sizeof(curifip));
-        *instance = IPIFINDEX;
-        snmp_add_null_var(request, varname, varname_len);
-        *instance = IPADDR;
-        snmp_add_null_var(request, varname, varname_len);
-        *instance = IPNETMASK;
-        snmp_add_null_var(request, varname, varname_len);
-
-        status = snmp_synch_response(Session, request, &response);
-        if (status != STAT_SUCCESS
-            || response->errstat != SNMP_ERR_NOERROR) {
-            fprintf(stderr,
-                    "SNMP request failed for interface %d, variable %ld out of %d interfaces (IP)\n",
-                    ifnum, response->errindex, cfg_nnets);
-            cfg_nnets = ifnum;
-            break;
-        }
-        for (var = response->variables; var; var = var->next_variable) {
-            if (snmp_get_do_debugging()) {
-                print_variable(var->name, var->name_length, var);
-            }
-            switch (var->name[9]) {
-            case IPIFINDEX:
-                ifindex = *var->val.integer;
-                for (cur_if = if_table;
-                     cur_if->ifindex != ifindex && cur_if->ifindex != 0;
-                     cur_if++);
-                cur_if->ifindex = ifindex;
-                break;
-            case IPADDR:
-                memmove(curifip, var->name + 10, sizeof(curifip));
-                memmove(&cur_if->ifip, var->val.string, sizeof(u_long));
-                break;
-            case IPNETMASK:
-                memmove(&cur_if->netmask, var->val.string, sizeof(u_long));
-            }
-        }
-        cur_if->ifroute.s_addr = cur_if->ifip.s_addr & cur_if->netmask;
-        if (cur_if->ifroute.s_addr)
-            strcpy(cur_if->route,
-                   netname(cur_if->ifroute, cur_if->netmask));
-        else
-            strcpy(cur_if->route, "none");
-        if ((i = strlen(cur_if->route)) > max_route)
-            max_route = i;
-        if (cur_if->ifip.s_addr)
-            strcpy(cur_if->ip, routename(cur_if->ifip));
-        else
-            strcpy(cur_if->ip, "none");
-        if ((i = strlen(cur_if->ip)) > max_ip)
-            max_ip = i;
-
-        snmp_free_pdu(response);
-
-        memmove(varname, oid_ifname, sizeof(oid_ifname));
-        varname_len = sizeof(oid_ifname) / sizeof(oid);
-        ifentry = varname + 9;
-        instance = varname + 10;
-        request = snmp_pdu_create(SNMP_MSG_GETNEXT);
-
-        *instance = oldindex;
-        *ifentry = IFINDEX;
-        snmp_add_null_var(request, varname, varname_len);
-        *ifentry = IFNAME;
-        snmp_add_null_var(request, varname, varname_len);
-        *ifentry = IFOPERSTATUS;
-        snmp_add_null_var(request, varname, varname_len);
-        *ifentry = INOCTETS;
-        snmp_add_null_var(request, varname, varname_len);
-        *ifentry = OUTOCTETS;
-        snmp_add_null_var(request, varname, varname_len);
-
-        while ((status =
-                snmp_synch_response(Session, request,
-                                    &response)) == STAT_SUCCESS) {
-            if (response->errstat != SNMP_ERR_NOSUCHNAME)
-                break;
-            if ((request =
-                 snmp_fix_pdu(response, SNMP_MSG_GETNEXT)) == NULL)
-                break;
-            snmp_free_pdu(response);
-        }
-        if (status != STAT_SUCCESS
-            || response->errstat != SNMP_ERR_NOERROR) {
-            fprintf(stderr,
-                    "SNMP request failed for interface %d, variable %ld out of %d interfaces (IF)\n",
-                    ifnum, response->errindex, cfg_nnets);
-            cfg_nnets = ifnum;
-            break;
-        }
-        for (var = response->variables; var; var = var->next_variable) {
-            if (snmp_get_do_debugging()) {
-                print_variable(var->name, var->name_length, var);
-            }
-            if (!var->val.integer)
-                continue;
-            switch (var->name[9]) {
-            case IFINDEX:
-                ifindex = *var->val.integer;
-                for (cur_if = if_table;
-                     cur_if->ifindex != ifindex && cur_if->ifindex != 0;
-                     cur_if++);
-                cur_if->ifindex = ifindex;
-                break;
-            case INOCTETS:
-                sprintf(cur_if->ioctets, "%lu", *var->val.integer);
-                i = strlen(cur_if->ioctets);
-                if (i > max_ioctets)
-                    max_ioctets = i;
-                break;
-            case OUTOCTETS:
-                sprintf(cur_if->ooctets, "%lu", *var->val.integer);
-                i = strlen(cur_if->ooctets);
-                if (i > max_ooctets)
-                    max_ooctets = i;
-                break;
-            case IFNAME:
-                oldindex = var->name[10];
-                if (var->val_len >= sizeof(cur_if->name))
-                    var->val_len = sizeof(cur_if->name) - 1;
-                memmove(cur_if->name, var->val.string, var->val_len);
-                cur_if->name[var->val_len] = 0;
-                if ((i = strlen(cur_if->name) + 1) > max_name)
-                    max_name = i;
-                break;
-            case IFOPERSTATUS:
-                cur_if->operstatus = *var->val.integer;
-                break;
-            }
-        }
-
-        snmp_free_pdu(response);
-
-        if (intrface != NULL && strcmp(cur_if->name, intrface) != 0) {
-            cur_if->name[0] = 0;
-            continue;
-        }
-        if (cur_if->operstatus != MIB_IFSTATUS_UP) {
-            cp = strchr(cur_if->name, '\0');
-            *cp++ = '*';
-            *cp = '\0';
-        }
-    }
-
-    printf("%*.*s %*.*s %*.*s %*.*s %*.*s ",
-           -max_name, max_name, "Name",
-           -max_route, max_route, "Network",
-           -max_ip, max_ip, "Address",
-           max_ioctets, max_ioctets, "Ioctets",
-           max_ooctets, max_ooctets, "Ooctets");
-    putchar('\n');
-    for (ifnum = 0, cur_if = if_table; ifnum < cfg_nnets;
-         ifnum++, cur_if++) {
-        if (cur_if->name[0] == 0)
-            continue;
-        printf("%*.*s ", -max_name, max_name, cur_if->name);
-        printf("%*.*s ", -max_route, max_route, cur_if->route);
-        printf("%*.*s ", -max_ip, max_ip, cur_if->ip);
-        printf("%*s %*s", max_ioctets, cur_if->ioctets,
-               max_ioctets, cur_if->ooctets);
-        putchar('\n');
-    }
-    free(if_table);
-}
-
-#define        MAXIF   128
-struct iftot {
-    char            ift_name[128];      /* interface name */
-    unsigned int    ift_ip;     /* input packets */
-    unsigned int    ift_ie;     /* input errors */
-    unsigned int    ift_op;     /* output packets */
-    unsigned int    ift_oe;     /* output errors */
-    unsigned int    ift_co;     /* collisions */
-} iftot[MAXIF];
-
-u_char          signalled;      /* set if alarm goes off "early" */
-
-/*
- * timerSet sets or resets the timer to fire in "interval" seconds.
- * timerPause waits only if the timer has not fired.
- * timing precision is not considered important.
- */
-
-#if (defined(WIN32) || defined(cygwin))
-static int      sav_int;
-static time_t   timezup;
-static void
-timerSet(int interval_seconds)
-{
-    sav_int = interval_seconds;
-    timezup = time(0) + interval_seconds;
-}
-
-/*
- * you can do better than this ! 
- */
-static void
-timerPause(void)
-{
-    time_t          now;
-    while (time(&now) < timezup)
-#ifdef WIN32
-        Sleep(400);
-#else
-    {
-        struct timeval  tx;
-        tx.tv_sec = 0;
-        tx.tv_usec = 400 * 1000;        /* 400 milliseconds */
-        select(0, 0, 0, 0, &tx);
-    }
-#endif
-}
-
-#else
-
-/*
- * Called if an interval expires before sidewaysintpr has completed a loop.
- * Sets a flag to not wait for the alarm.
- */
-RETSIGTYPE
-catchalarm(int sig)
-{
-    signalled = YES;
-}
-
-static void
-timerSet(int interval_seconds)
-{
-#ifdef HAVE_SIGSET
-    (void) sigset(SIGALRM, catchalarm);
-#else
-    (void) signal(SIGALRM, catchalarm);
-#endif
-    signalled = NO;
-    (void) alarm(interval_seconds);
-}
-
-static void
-timerPause(void)
-{
-#ifdef HAVE_SIGHOLD
-    sighold(SIGALRM);
-    if (!signalled) {
-        sigpause(SIGALRM);
-    }
-#else
-    int             oldmask;
-    oldmask = sigblock(sigmask(SIGALRM));
-    if (!signalled) {
-        sigpause(0);
-    }
-    sigsetmask(oldmask);
-#endif
-}
-
-#endif                          /* !WIN32 && !cygwin */
-
-/*
- * Print a running summary of interface statistics.
- * Repeat display every interval seconds, showing statistics
- * collected over that interval.  Assumes that interval is non-zero.
- * First line printed at top of screen is always cumulative.
- */
-static void
-sidewaysintpr(unsigned int interval)
-{
-    register struct iftot *ip, *total;
-    register int    line;
-    struct iftot   *lastif, *sum, *interesting, ifnow, *now = &ifnow;
-    netsnmp_variable_list *var;
-    oid             varname[MAX_OID_LEN], *instance, *ifentry;
-    size_t          varname_len;
-    int             ifnum, cfg_nnets;
-
-    lastif = iftot;
-    sum = iftot + MAXIF - 1;
-    total = sum - 1;
-    interesting = iftot;
-    var =
-        getvarbyname(Session, oid_cfg_nnets,
-                     sizeof(oid_cfg_nnets) / sizeof(oid));
-    if (var) {
-        cfg_nnets = *var->val.integer;
-        snmp_free_var(var);
-    } else
-        return;
-    memmove(varname, oid_ifname, sizeof(oid_ifname));
-    varname_len = sizeof(oid_ifname) / sizeof(oid);
-    for (ifnum = 1, ip = iftot; ifnum <= cfg_nnets; ifnum++) {
-        char           *cp;
-
-        ip->ift_name[0] = '(';
-        varname[10] = ifnum;
-        var = getvarbyname(Session, varname, varname_len);
-        if (var) {
-            if (var->val_len >= (sizeof(ip->ift_name) - 3))
-                var->val_len = (sizeof(ip->ift_name) - 4);
-            memmove(ip->ift_name + 1, var->val.string, var->val_len);
-            snmp_free_var(var);
-        }
-        cp = (char *) strchr(ip->ift_name, ' ');
-        if (cp != NULL)
-            *cp = '\0';
-        if (intrface && strcmp(ip->ift_name + 1, intrface) == 0)
-            interesting = ip;
-        ip->ift_name[15] = '\0';
-        cp = (char *) strchr(ip->ift_name, '\0');
-        sprintf(cp, ")");
-        ip++;
-        if (ip >= iftot + MAXIF - 2)
-            break;
-    }
-    lastif = ip;
-
-    timerSet(interval);
-
-  banner:
-    printf("     input   %-6.6s     output       ", interesting->ift_name);
-    if (lastif - iftot > 0)
-        printf("                 input  (Total)     output");
-    for (ip = iftot; ip < iftot + MAXIF; ip++) {
-        ip->ift_ip = 0;
-        ip->ift_ie = 0;
-        ip->ift_op = 0;
-        ip->ift_oe = 0;
-        ip->ift_co = 0;
-    }
-    putchar('\n');
-    printf("%10.10s %8.8s %10.10s %8.8s %8.8s ",
-           "packets", "errs", "packets", "errs", "colls");
-    if (lastif - iftot > 0)
-        printf("%10.10s %8.8s %10.10s %8.8s %8.8s ",
-               "packets", "errs", "packets", "errs", "colls");
-    putchar('\n');
-    fflush(stdout);
-    line = 0;
-  loop:
-    sum->ift_ip = 0;
-    sum->ift_ie = 0;
-    sum->ift_op = 0;
-    sum->ift_oe = 0;
-    sum->ift_co = 0;
-    memmove(varname, oid_ifinucastpkts, sizeof(oid_ifinucastpkts));
-    varname_len = sizeof(oid_ifinucastpkts) / sizeof(oid);
-    ifentry = varname + 9;
-    instance = varname + 10;
-    for (ifnum = 1, ip = iftot; ifnum <= cfg_nnets && ip < lastif;
-         ip++, ifnum++) {
-        memset(now, 0, sizeof(*now));
-        *instance = ifnum;
-        *ifentry = INUCASTPKTS;
-        var = getvarbyname(Session, varname, varname_len);
-        if (var) {
-            now->ift_ip = *var->val.integer;
-            snmp_free_var(var);
-        }
-        *ifentry = INNUCASTPKTS;
-        var = getvarbyname(Session, varname, varname_len);
-        if (var) {
-            now->ift_ip += *var->val.integer;
-            snmp_free_var(var);
-        }
-        *ifentry = INERRORS;
-        var = getvarbyname(Session, varname, varname_len);
-        if (var) {
-            now->ift_ie = *var->val.integer;
-            snmp_free_var(var);
-        }
-        *ifentry = OUTUCASTPKTS;
-        var = getvarbyname(Session, varname, varname_len);
-        if (var) {
-            now->ift_op = *var->val.integer;
-            snmp_free_var(var);
-        }
-        *ifentry = OUTNUCASTPKTS;
-        var = getvarbyname(Session, varname, varname_len);
-        if (var) {
-            now->ift_op += *var->val.integer;
-            snmp_free_var(var);
-        }
-        *ifentry = OUTERRORS;
-        var = getvarbyname(Session, varname, varname_len);
-        if (var) {
-            now->ift_oe = *var->val.integer;
-            snmp_free_var(var);
-        }
-
-        if (ip == interesting)
-            printf("%10d %8d %10d %8d %8d ",
-                   now->ift_ip - ip->ift_ip,
-                   now->ift_ie - ip->ift_ie,
-                   now->ift_op - ip->ift_op,
-                   now->ift_oe - ip->ift_oe, now->ift_co - ip->ift_co);
-        ip->ift_ip = now->ift_ip;
-        ip->ift_ie = now->ift_ie;
-        ip->ift_op = now->ift_op;
-        ip->ift_oe = now->ift_oe;
-        ip->ift_co = now->ift_co;
-        sum->ift_ip += ip->ift_ip;
-        sum->ift_ie += ip->ift_ie;
-        sum->ift_op += ip->ift_op;
-        sum->ift_oe += ip->ift_oe;
-        sum->ift_co += ip->ift_co;
-    }
-    if (lastif - iftot > 0)
-        printf("%10d %8d %10d %8d %8d ",
-               sum->ift_ip - total->ift_ip,
-               sum->ift_ie - total->ift_ie,
-               sum->ift_op - total->ift_op,
-               sum->ift_oe - total->ift_oe, sum->ift_co - total->ift_co);
-    *total = *sum;
-    putchar('\n');
-    fflush(stdout);
-    line++;
-
-    timerPause();
-    timerSet(interval);
-
-    if (line == 21)
-        goto banner;
-    goto loop;
- /*NOTREACHED*/}