Blame apps/snmptable.c

Packit Service b38f0b
/*
Packit Service b38f0b
 * snmptable.c - walk a table and print it nicely
Packit Service b38f0b
 *
Packit Service b38f0b
 * Update: 1999-10-26 <rs-snmp@revelstone.com>
Packit Service b38f0b
 * Added ability to use MIB to query tables with non-sequential column OIDs
Packit Service b38f0b
 * Added code to handle sparse tables
Packit Service b38f0b
 *
Packit Service b38f0b
 * Update: 1998-07-17 <jhy@gsu.edu>
Packit Service b38f0b
 * Added text <special options> to usage().
Packit Service b38f0b
 */
Packit Service b38f0b
/**********************************************************************
Packit Service b38f0b
	Copyright 1997 Niels Baggesen
Packit Service b38f0b
Packit Service b38f0b
                      All Rights Reserved
Packit Service b38f0b
Packit Service b38f0b
Permission to use, copy, modify, and distribute this software and its 
Packit Service b38f0b
documentation for any purpose and without fee is hereby granted, 
Packit Service b38f0b
provided that the above copyright notice appear in all copies.
Packit Service b38f0b
Packit Service b38f0b
I DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
Packit Service b38f0b
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
Packit Service b38f0b
I BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
Packit Service b38f0b
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
Packit Service b38f0b
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
Packit Service b38f0b
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
Packit Service b38f0b
SOFTWARE.
Packit Service b38f0b
******************************************************************/
Packit Service b38f0b
#include <net-snmp/net-snmp-config.h>
Packit Service b38f0b
Packit Service b38f0b
#if HAVE_STDLIB_H
Packit Service b38f0b
#include <stdlib.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_UNISTD_H
Packit Service b38f0b
#include <unistd.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_STRING_H
Packit Service b38f0b
#include <string.h>
Packit Service b38f0b
#else
Packit Service b38f0b
#include <strings.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#include <sys/types.h>
Packit Service b38f0b
#if HAVE_NETINET_IN_H
Packit Service b38f0b
# include <netinet/in.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if TIME_WITH_SYS_TIME
Packit Service b38f0b
# include <sys/time.h>
Packit Service b38f0b
# include <time.h>
Packit Service b38f0b
#else
Packit Service b38f0b
# if HAVE_SYS_TIME_H
Packit Service b38f0b
#  include <sys/time.h>
Packit Service b38f0b
# else
Packit Service b38f0b
#  include <time.h>
Packit Service b38f0b
# endif
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_SYS_SELECT_H
Packit Service b38f0b
#include <sys/select.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#include <stdio.h>
Packit Service b38f0b
#if HAVE_NETDB_H
Packit Service b38f0b
#include <netdb.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_ARPA_INET_H
Packit Service b38f0b
#include <arpa/inet.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
#include <net-snmp/net-snmp-includes.h>
Packit Service b38f0b
Packit Service b38f0b
struct column {
Packit Service b38f0b
    int             width;
Packit Service b38f0b
    oid             subid;
Packit Service b38f0b
    char           *label;
Packit Service b38f0b
    char           *fmt;
Packit Service b38f0b
}              *column = NULL;
Packit Service b38f0b
Packit Service b38f0b
static char   **data = NULL;
Packit Service b38f0b
static char   **indices = NULL;
Packit Service b38f0b
static int      index_width = sizeof("index ") - 1;
Packit Service b38f0b
static int      fields;
Packit Service b38f0b
static int      entries;
Packit Service b38f0b
static int      allocated;
Packit Service b38f0b
static int      end_of_table = 1;
Packit Service b38f0b
static int      headers_only = 0;
Packit Service b38f0b
static int      no_headers = 0;
Packit Service b38f0b
static int      max_width = 0;
Packit Service b38f0b
static int      column_width = 0;
Packit Service b38f0b
static int      brief = 0;
Packit Service b38f0b
static int      show_index = 0;
Packit Service b38f0b
static const char    *left_justify_flag = "";
Packit Service b38f0b
static char    *field_separator = NULL;
Packit Service b38f0b
static char    *table_name;
Packit Service b38f0b
static oid      name[MAX_OID_LEN];
Packit Service b38f0b
static size_t   name_length;
Packit Service b38f0b
static oid      root[MAX_OID_LEN];
Packit Service b38f0b
static size_t   rootlen;
Packit Service b38f0b
static int      localdebug;
Packit Service b38f0b
static int      exitval = 1;
Packit Service b38f0b
static int      use_getbulk = 1;
Packit Service b38f0b
static int      max_getbulk = 10;
Packit Service b38f0b
static int      extra_columns = 0;
Packit Service b38f0b
Packit Service b38f0b
void            usage(void);
Packit Service b38f0b
void            get_field_names(void);
Packit Service b38f0b
void            get_table_entries(netsnmp_session * ss);
Packit Service b38f0b
void            getbulk_table_entries(netsnmp_session * ss);
Packit Service b38f0b
void            print_table(void);
Packit Service b38f0b
Packit Service b38f0b
static void
Packit Service b38f0b
optProc(int argc, char *const *argv, int opt)
Packit Service b38f0b
{
Packit Service b38f0b
    switch (opt) {
Packit Service b38f0b
    case 'C':
Packit Service b38f0b
        /*
Packit Service b38f0b
         * Handle new '-C' command-specific meta-options 
Packit Service b38f0b
         */
Packit Service b38f0b
        while (*optarg) {
Packit Service b38f0b
            switch (*optarg++) {
Packit Service b38f0b
            case 'w':
Packit Service b38f0b
		if (optind < argc) {
Packit Service b38f0b
		    if (argv[optind]) {
Packit Service b38f0b
			max_width = atoi(argv[optind]);
Packit Service b38f0b
			if (max_width == 0) {
Packit Service b38f0b
			    usage();
Packit Service b38f0b
			    fprintf(stderr, "Bad -Cw option: %s\n", 
Packit Service b38f0b
				    argv[optind]);
Packit Service b38f0b
			    exit(1);
Packit Service b38f0b
			}
Packit Service b38f0b
		    }
Packit Service b38f0b
		} else {
Packit Service b38f0b
		    usage();
Packit Service b38f0b
                    fprintf(stderr, "Bad -Cw option: no argument given\n");
Packit Service b38f0b
		    exit(1);
Packit Service b38f0b
		}
Packit Service b38f0b
		optind++;
Packit Service b38f0b
                break;
Packit Service b38f0b
            case 'c':
Packit Service b38f0b
		if (optind < argc) {
Packit Service b38f0b
		    if (argv[optind]) {
Packit Service b38f0b
			column_width = atoi(argv[optind]);
Packit Service b38f0b
			if (column_width <= 2) {
Packit Service b38f0b
			    usage();
Packit Service b38f0b
			    fprintf(stderr, "Bad -Cc option: %s\n", 
Packit Service b38f0b
				    argv[optind]);
Packit Service b38f0b
			    exit(1);
Packit Service b38f0b
			}
Packit Service b38f0b
                        /* Reduce by one for space at end of column */
Packit Service b38f0b
                        column_width -= 1;
Packit Service b38f0b
		    }
Packit Service b38f0b
		} else {
Packit Service b38f0b
		    usage();
Packit Service b38f0b
                    fprintf(stderr, "Bad -Cc option: no argument given\n");
Packit Service b38f0b
		    exit(1);
Packit Service b38f0b
		}
Packit Service b38f0b
		optind++;
Packit Service b38f0b
                break;
Packit Service b38f0b
            case 'l':
Packit Service b38f0b
                left_justify_flag = "-";
Packit Service b38f0b
                break;
Packit Service b38f0b
            case 'f':
Packit Service b38f0b
		if (optind < argc) {
Packit Service b38f0b
		    field_separator = argv[optind];
Packit Service b38f0b
		} else {
Packit Service b38f0b
                    usage();
Packit Service b38f0b
		    fprintf(stderr, "Bad -Cf option: no argument given\n");
Packit Service b38f0b
		    exit(1);
Packit Service b38f0b
		}
Packit Service b38f0b
		optind++;
Packit Service b38f0b
                break;
Packit Service b38f0b
            case 'h':
Packit Service b38f0b
                headers_only = 1;
Packit Service b38f0b
                break;
Packit Service b38f0b
            case 'H':
Packit Service b38f0b
                no_headers = 1;
Packit Service b38f0b
                break;
Packit Service b38f0b
            case 'B':
Packit Service b38f0b
                use_getbulk = 0;
Packit Service b38f0b
                break;
Packit Service b38f0b
            case 'b':
Packit Service b38f0b
                brief = 1;
Packit Service b38f0b
                break;
Packit Service b38f0b
            case 'i':
Packit Service b38f0b
                show_index = 1;
Packit Service b38f0b
                break;
Packit Service b38f0b
            case 'r':
Packit Service b38f0b
		if (optind < argc) {
Packit Service b38f0b
		    if (argv[optind]) {
Packit Service b38f0b
			max_getbulk = atoi(argv[optind]);
Packit Service b38f0b
			if (max_getbulk == 0) {
Packit Service b38f0b
			    usage();
Packit Service b38f0b
			    fprintf(stderr, "Bad -Cr option: %s\n", 
Packit Service b38f0b
				    argv[optind]);
Packit Service b38f0b
			    exit(1);
Packit Service b38f0b
			}
Packit Service b38f0b
		    }
Packit Service b38f0b
		} else {
Packit Service b38f0b
		    usage();
Packit Service b38f0b
                    fprintf(stderr, "Bad -Cr option: no argument given\n");
Packit Service b38f0b
		    exit(1);
Packit Service b38f0b
		}
Packit Service b38f0b
		optind++;
Packit Service b38f0b
                break;
Packit Service b38f0b
            default:
Packit Service b38f0b
                fprintf(stderr, "Bad option after -C: %c\n", optarg[-1]);
Packit Service b38f0b
                usage();
Packit Service b38f0b
                exit(1);
Packit Service b38f0b
            }
Packit Service b38f0b
        }
Packit Service b38f0b
        break;
Packit Service b38f0b
    }
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
usage(void)
Packit Service b38f0b
{
Packit Service b38f0b
    fprintf(stderr, "USAGE: snmptable ");
Packit Service b38f0b
    snmp_parse_args_usage(stderr);
Packit Service b38f0b
    fprintf(stderr, " TABLE-OID\n\n");
Packit Service b38f0b
    snmp_parse_args_descriptions(stderr);
Packit Service b38f0b
    fprintf(stderr,
Packit Service b38f0b
	    "  -C APPOPTS\t\tSet various application specific behaviours:\n");
Packit Service b38f0b
    fprintf(stderr, "\t\t\t  b:       brief field names\n");
Packit Service b38f0b
    fprintf(stderr, "\t\t\t  B:       do not use GETBULK requests\n");
Packit Service b38f0b
    fprintf(stderr, "\t\t\t  c<NUM>:  print table in columns of <NUM> chars width\n");
Packit Service b38f0b
    fprintf(stderr, "\t\t\t  f<STR>:  print table delimitied with <STR>\n");
Packit Service b38f0b
    fprintf(stderr, "\t\t\t  h:       print only the column headers\n");
Packit Service b38f0b
    fprintf(stderr, "\t\t\t  H:       print no column headers\n");
Packit Service b38f0b
    fprintf(stderr, "\t\t\t  i:       print index values\n");
Packit Service b38f0b
    fprintf(stderr, "\t\t\t  l:       left justify output\n");
Packit Service b38f0b
    fprintf(stderr, "\t\t\t  r<NUM>:  for GETBULK: set max-repeaters to <NUM>\n");
Packit Service b38f0b
    fprintf(stderr, "\t\t\t           for GETNEXT: retrieve <NUM> entries at a time\n");
Packit Service b38f0b
    fprintf(stderr, "\t\t\t  w<NUM>:  print table in parts of <NUM> chars width\n");
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
reverse_fields(void)
Packit Service b38f0b
{
Packit Service b38f0b
    struct column   tmp;
Packit Service b38f0b
    int             i;
Packit Service b38f0b
Packit Service b38f0b
    for (i = 0; i < fields / 2; i++) {
Packit Service b38f0b
        memcpy(&tmp, &(column[i]), sizeof(struct column));
Packit Service b38f0b
        memcpy(&(column[i]), &(column[fields - 1 - i]),
Packit Service b38f0b
               sizeof(struct column));
Packit Service b38f0b
        memcpy(&(column[fields - 1 - i]), &tmp, sizeof(struct column));
Packit Service b38f0b
    }
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
int
Packit Service b38f0b
main(int argc, char *argv[])
Packit Service b38f0b
{
Packit Service b38f0b
    netsnmp_session session, *ss;
Packit Service b38f0b
    int            total_entries = 0;
Packit Service b38f0b
Packit Service b38f0b
    SOCK_STARTUP;
Packit Service b38f0b
Packit Service b38f0b
    netsnmp_set_line_buffering(stdout);
Packit Service b38f0b
Packit Service b38f0b
    netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, 
Packit Service b38f0b
                           NETSNMP_DS_LIB_QUICK_PRINT, 1);
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * get the common command line arguments 
Packit Service b38f0b
     */
Packit Service b38f0b
    switch (snmp_parse_args(argc, argv, &session, "C:", optProc)) {
Packit Service b38f0b
    case NETSNMP_PARSE_ARGS_ERROR:
Packit Service b38f0b
        goto out;
Packit Service b38f0b
    case NETSNMP_PARSE_ARGS_SUCCESS_EXIT:
Packit Service b38f0b
        exitval = 0;
Packit Service b38f0b
        goto out;
Packit Service b38f0b
    case NETSNMP_PARSE_ARGS_ERROR_USAGE:
Packit Service b38f0b
        usage();
Packit Service b38f0b
        goto out;
Packit Service b38f0b
    default:
Packit Service b38f0b
        break;
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * get the initial object and subtree 
Packit Service b38f0b
     */
Packit Service b38f0b
    /*
Packit Service b38f0b
     * specified on the command line 
Packit Service b38f0b
     */
Packit Service b38f0b
    if (optind + 1 != argc) {
Packit Service b38f0b
        fprintf(stderr, "Must have exactly one table name\n");
Packit Service b38f0b
        usage();
Packit Service b38f0b
        goto out;
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    rootlen = MAX_OID_LEN;
Packit Service b38f0b
    if (!snmp_parse_oid(argv[optind], root, &rootlen)) {
Packit Service b38f0b
        snmp_perror(argv[optind]);
Packit Service b38f0b
        goto out;
Packit Service b38f0b
    }
Packit Service b38f0b
    localdebug = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, 
Packit Service b38f0b
                                        NETSNMP_DS_LIB_DUMP_PACKET);
Packit Service b38f0b
Packit Service b38f0b
    get_field_names();
Packit Service b38f0b
    reverse_fields();
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * open an SNMP session 
Packit Service b38f0b
     */
Packit Service b38f0b
    ss = snmp_open(&session);
Packit Service b38f0b
    if (ss == NULL) {
Packit Service b38f0b
        /*
Packit Service b38f0b
         * diagnose snmp_open errors with the input netsnmp_session pointer 
Packit Service b38f0b
         */
Packit Service b38f0b
        snmp_sess_perror("snmptable", &session);
Packit Service b38f0b
        goto out;
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
#ifndef NETSNMP_DISABLE_SNMPV1
Packit Service b38f0b
    if (ss->version == SNMP_VERSION_1)
Packit Service b38f0b
        use_getbulk = 0;
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
    exitval = 0;
Packit Service b38f0b
Packit Service b38f0b
    do {
Packit Service b38f0b
        entries = 0;
Packit Service b38f0b
        allocated = 0;
Packit Service b38f0b
        if (!headers_only) {
Packit Service b38f0b
            if (use_getbulk)
Packit Service b38f0b
                getbulk_table_entries(ss);
Packit Service b38f0b
            else
Packit Service b38f0b
                get_table_entries(ss);
Packit Service b38f0b
        }
Packit Service b38f0b
Packit Service b38f0b
        if (exitval)
Packit Service b38f0b
            goto close_session;
Packit Service b38f0b
Packit Service b38f0b
        if (entries || headers_only)
Packit Service b38f0b
            print_table();
Packit Service b38f0b
Packit Service b38f0b
        if (data) {
Packit Service b38f0b
            int i, j;
Packit Service b38f0b
            for (i = 0; i < entries; i++)
Packit Service b38f0b
                for (j = 0; j < fields; j++)
Packit Service b38f0b
                free(data[i*fields+j]);
Packit Service b38f0b
            free (data);
Packit Service b38f0b
            data = NULL;
Packit Service b38f0b
        }
Packit Service b38f0b
Packit Service b38f0b
        if (indices) {
Packit Service b38f0b
            int i;
Packit Service b38f0b
            for (i = 0; i < entries; i++)
Packit Service b38f0b
                free(indices[i]);
Packit Service b38f0b
            free (indices);
Packit Service b38f0b
            indices = NULL;
Packit Service b38f0b
        }
Packit Service b38f0b
Packit Service b38f0b
        total_entries += entries;
Packit Service b38f0b
Packit Service b38f0b
    } while (!end_of_table);
Packit Service b38f0b
Packit Service b38f0b
    if (total_entries == 0)
Packit Service b38f0b
        printf("%s: No entries\n", table_name);
Packit Service b38f0b
    if (extra_columns)
Packit Service b38f0b
	printf("%s: WARNING: More columns on agent than in MIB\n", table_name);
Packit Service b38f0b
Packit Service b38f0b
    exitval = 0;
Packit Service b38f0b
Packit Service b38f0b
close_session:
Packit Service b38f0b
    snmp_close(ss);
Packit Service b38f0b
Packit Service b38f0b
out:
Packit Service b38f0b
    SOCK_CLEANUP;
Packit Service b38f0b
    return exitval;
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
print_table(void)
Packit Service b38f0b
{
Packit Service b38f0b
    int             entry, field, first_field, last_field = 0, width, part = 0;
Packit Service b38f0b
    char          **dp;
Packit Service b38f0b
    char            string_buf[SPRINT_MAX_LEN];
Packit Service b38f0b
    char           *index_fmt = NULL;
Packit Service b38f0b
    static int      first_pass = 1;
Packit Service b38f0b
Packit Service b38f0b
    if (!no_headers && !headers_only && first_pass)
Packit Service b38f0b
        printf("SNMP table: %s\n\n", table_name);
Packit Service b38f0b
Packit Service b38f0b
    for (field = 0; field < fields; field++) {
Packit Service b38f0b
        if (column_width != 0)
Packit Service b38f0b
            sprintf(string_buf, "%%%s%d.%ds", left_justify_flag,
Packit Service b38f0b
                    column_width + 1, column_width );
Packit Service b38f0b
        else if (field_separator == NULL)
Packit Service b38f0b
            sprintf(string_buf, "%%%s%ds", left_justify_flag,
Packit Service b38f0b
                    column[field].width + 1);
Packit Service b38f0b
        else if (field == 0 && !show_index)
Packit Service b38f0b
            sprintf(string_buf, "%%s");
Packit Service b38f0b
        else
Packit Service b38f0b
            sprintf(string_buf, "%s%%s", field_separator);
Packit Service b38f0b
        column[field].fmt = strdup(string_buf);
Packit Service b38f0b
    }
Packit Service b38f0b
    if (show_index) {
Packit Service b38f0b
        if (column_width)
Packit Service b38f0b
            sprintf(string_buf, "\nindex: %%s\n");
Packit Service b38f0b
        else if (field_separator == NULL)
Packit Service b38f0b
            sprintf(string_buf, "%%%s%ds", left_justify_flag, index_width);
Packit Service b38f0b
        else
Packit Service b38f0b
            sprintf(string_buf, "%%s");
Packit Service b38f0b
        index_fmt = strdup(string_buf);
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    while (last_field != fields) {
Packit Service b38f0b
        part++;
Packit Service b38f0b
        if (part != 1 && !no_headers)
Packit Service b38f0b
            printf("\nSNMP table %s, part %d\n\n", table_name, part);
Packit Service b38f0b
        first_field = last_field;
Packit Service b38f0b
        dp = data;
Packit Service b38f0b
        if (show_index && !no_headers && !column_width && first_pass) {
Packit Service b38f0b
            width = index_width;
Packit Service b38f0b
            printf(index_fmt, "index");
Packit Service b38f0b
        } else
Packit Service b38f0b
            width = 0;
Packit Service b38f0b
        for (field = first_field; field < fields; field++) {
Packit Service b38f0b
            if (max_width)
Packit Service b38f0b
            {
Packit Service b38f0b
                if (column_width) {
Packit Service b38f0b
                    if (!no_headers && first_pass) {
Packit Service b38f0b
                        width += column_width + 1;
Packit Service b38f0b
                        if (field != first_field && width > max_width) {
Packit Service b38f0b
                            printf("\n");
Packit Service b38f0b
                            width = column_width + 1;
Packit Service b38f0b
                        }
Packit Service b38f0b
                    }
Packit Service b38f0b
                }
Packit Service b38f0b
                else {
Packit Service b38f0b
                    width += column[field].width + 1;
Packit Service b38f0b
                    if (field != first_field && width > max_width)
Packit Service b38f0b
                        break;
Packit Service b38f0b
                }
Packit Service b38f0b
            }
Packit Service b38f0b
            if (!no_headers && first_pass)
Packit Service b38f0b
                printf(column[field].fmt, column[field].label);
Packit Service b38f0b
        }
Packit Service b38f0b
        last_field = field;
Packit Service b38f0b
        if (!no_headers && first_pass)
Packit Service b38f0b
            printf("\n");
Packit Service b38f0b
        for (entry = 0; entry < entries; entry++) {
Packit Service b38f0b
            width = 0;
Packit Service b38f0b
            if (show_index)
Packit Service b38f0b
            {
Packit Service b38f0b
                if (!column_width)
Packit Service b38f0b
                    width = index_width;
Packit Service b38f0b
                printf(index_fmt, indices[entry]);
Packit Service b38f0b
            }
Packit Service b38f0b
            for (field = first_field; field < last_field; field++) {
Packit Service b38f0b
                if (column_width && max_width) {
Packit Service b38f0b
                    width += column_width + 1;
Packit Service b38f0b
                    if (field != first_field && width > max_width) {
Packit Service b38f0b
                        printf("\n");
Packit Service b38f0b
                        width = column_width + 1;
Packit Service b38f0b
                    }
Packit Service b38f0b
                }
Packit Service b38f0b
                printf(column[field].fmt, dp[field] ? dp[field] : "?");
Packit Service b38f0b
            }
Packit Service b38f0b
            dp += fields;
Packit Service b38f0b
            printf("\n");
Packit Service b38f0b
        }
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    first_pass = 0;
Packit Service b38f0b
    if (index_fmt)
Packit Service b38f0b
        free(index_fmt);
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
get_field_names(void)
Packit Service b38f0b
{
Packit Service b38f0b
    char           *buf = NULL, *name_p = NULL;
Packit Service b38f0b
    size_t          buf_len = 0, out_len = 0;
Packit Service b38f0b
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit Service b38f0b
    struct tree    *tbl = NULL;
Packit Service b38f0b
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit Service b38f0b
    int             going = 1;
Packit Service b38f0b
Packit Service b38f0b
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit Service b38f0b
    tbl = get_tree(root, rootlen, get_tree_head());
Packit Service b38f0b
    if (tbl) {
Packit Service b38f0b
        tbl = tbl->child_list;
Packit Service b38f0b
        if (tbl) {
Packit Service b38f0b
            root[rootlen++] = tbl->subid;
Packit Service b38f0b
            tbl = tbl->child_list;
Packit Service b38f0b
        } else {
Packit Service b38f0b
            root[rootlen++] = 1;
Packit Service b38f0b
            going = 0;
Packit Service b38f0b
        }
Packit Service b38f0b
    }
Packit Service b38f0b
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit Service b38f0b
Packit Service b38f0b
    if (sprint_realloc_objid
Packit Service b38f0b
        ((u_char **)&buf, &buf_len, &out_len, 1, root, rootlen - 1)) {
Packit Service b38f0b
        table_name = buf;
Packit Service b38f0b
        buf = NULL;
Packit Service b38f0b
        buf_len = out_len = 0;
Packit Service b38f0b
    } else {
Packit Service b38f0b
        table_name = strdup("[TRUNCATED]");
Packit Service b38f0b
        out_len = 0;
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    fields = 0;
Packit Service b38f0b
    while (going) {
Packit Service b38f0b
        fields++;
Packit Service b38f0b
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit Service b38f0b
        if (tbl) {
Packit Service b38f0b
            if (tbl->access == MIB_ACCESS_NOACCESS) {
Packit Service b38f0b
                fields--;
Packit Service b38f0b
                tbl = tbl->next_peer;
Packit Service b38f0b
                if (!tbl) {
Packit Service b38f0b
                    going = 0;
Packit Service b38f0b
                }
Packit Service b38f0b
                continue;
Packit Service b38f0b
            }
Packit Service b38f0b
            root[rootlen] = tbl->subid;
Packit Service b38f0b
            tbl = tbl->next_peer;
Packit Service b38f0b
            if (!tbl)
Packit Service b38f0b
                going = 0;
Packit Service b38f0b
        } else {
Packit Service b38f0b
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit Service b38f0b
            root[rootlen] = fields;
Packit Service b38f0b
#ifndef NETSNMP_DISABLE_MIB_LOADING
Packit Service b38f0b
        }
Packit Service b38f0b
#endif /* NETSNMP_DISABLE_MIB_LOADING */
Packit Service b38f0b
        out_len = 0;
Packit Service b38f0b
        if (sprint_realloc_objid
Packit Service b38f0b
            ((u_char **)&buf, &buf_len, &out_len, 1, root, rootlen + 1)) {
Packit Service b38f0b
            name_p = strrchr(buf, '.');
Packit Service b38f0b
            if (name_p == NULL) {
Packit Service b38f0b
                name_p = strrchr(buf, ':');
Packit Service b38f0b
            }
Packit Service b38f0b
            if (name_p == NULL) {
Packit Service b38f0b
                name_p = buf;
Packit Service b38f0b
            } else {
Packit Service b38f0b
                name_p++;
Packit Service b38f0b
            }
Packit Service b38f0b
        } else {
Packit Service b38f0b
            break;
Packit Service b38f0b
        }
Packit Service b38f0b
        if (localdebug) {
Packit Service b38f0b
            printf("%s %c\n", buf, name_p[0]);
Packit Service b38f0b
        }
Packit Service b38f0b
        if ('0' <= name_p[0] && name_p[0] <= '9') {
Packit Service b38f0b
            fields--;
Packit Service b38f0b
            break;
Packit Service b38f0b
        }
Packit Service b38f0b
        if (fields == 1) {
Packit Service b38f0b
            column = (struct column *) malloc(sizeof(*column));
Packit Service b38f0b
        } else {
Packit Service b38f0b
            column =
Packit Service b38f0b
                (struct column *) realloc(column,
Packit Service b38f0b
                                          fields * sizeof(*column));
Packit Service b38f0b
        }
Packit Service b38f0b
        column[fields - 1].label = strdup(name_p);
Packit Service b38f0b
        column[fields - 1].width = strlen(name_p);
Packit Service b38f0b
        column[fields - 1].subid = root[rootlen];
Packit Service b38f0b
    }
Packit Service b38f0b
    if (fields == 0) {
Packit Service b38f0b
        fprintf(stderr, "Was that a table? %s\n", table_name);
Packit Service b38f0b
        exit(1);
Packit Service b38f0b
    }
Packit Service b38f0b
    if (name_p) {
Packit Service b38f0b
        *name_p = 0;
Packit Service b38f0b
        memmove(name, root, rootlen * sizeof(oid));
Packit Service b38f0b
        name_length = rootlen + 1;
Packit Service b38f0b
        name_p = strrchr(buf, '.');
Packit Service b38f0b
        if (name_p == NULL) {
Packit Service b38f0b
            name_p = strrchr(buf, ':');
Packit Service b38f0b
        }
Packit Service b38f0b
        if (name_p != NULL) {
Packit Service b38f0b
            *name_p = 0;
Packit Service b38f0b
        }
Packit Service b38f0b
    }
Packit Service b38f0b
    if (brief && fields > 1) {
Packit Service b38f0b
        char           *f1, *f2;
Packit Service b38f0b
        int             common = strlen(column[0].label);
Packit Service b38f0b
        int             field, len;
Packit Service b38f0b
        for (field = 1; field < fields; field++) {
Packit Service b38f0b
            f1 = column[field - 1].label;
Packit Service b38f0b
            f2 = column[field].label;
Packit Service b38f0b
            while (*f1 && *f1++ == *f2++);
Packit Service b38f0b
            len = f2 - column[field].label - 1;
Packit Service b38f0b
            if (len < common)
Packit Service b38f0b
                common = len;
Packit Service b38f0b
        }
Packit Service b38f0b
        if (common) {
Packit Service b38f0b
            for (field = 0; field < fields; field++) {
Packit Service b38f0b
                column[field].label += common;
Packit Service b38f0b
                column[field].width -= common;
Packit Service b38f0b
            }
Packit Service b38f0b
        }
Packit Service b38f0b
    }
Packit Service b38f0b
    if (buf != NULL) {
Packit Service b38f0b
        free(buf);
Packit Service b38f0b
    }
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
get_table_entries(netsnmp_session * ss)
Packit Service b38f0b
{
Packit Service b38f0b
    int             running = 1;
Packit Service b38f0b
    netsnmp_pdu    *pdu, *response;
Packit Service b38f0b
    netsnmp_variable_list *vars;
Packit Service b38f0b
    int             count;
Packit Service b38f0b
    int             status;
Packit Service b38f0b
    int             i;
Packit Service b38f0b
    int             col;
Packit Service b38f0b
    char           *buf = NULL;
Packit Service b38f0b
    size_t          out_len = 0, buf_len = 0;
Packit Service b38f0b
    char           *cp;
Packit Service b38f0b
    char           *name_p = NULL;
Packit Service b38f0b
    char          **dp;
Packit Service b38f0b
    int             have_current_index;
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * TODO:
Packit Service b38f0b
     *   1) Deal with multiple index fields
Packit Service b38f0b
     *   2) Deal with variable length index fields
Packit Service b38f0b
     *   3) optimize to remove a sparse column from get-requests
Packit Service b38f0b
     */
Packit Service b38f0b
Packit Service b38f0b
    while (running &&
Packit Service b38f0b
           ((max_width && !column_width) || (entries < max_getbulk))) {
Packit Service b38f0b
        /*
Packit Service b38f0b
         * create PDU for GETNEXT request and add object name to request 
Packit Service b38f0b
         */
Packit Service b38f0b
        pdu = snmp_pdu_create(SNMP_MSG_GETNEXT);
Packit Service b38f0b
        for (i = 1; i <= fields; i++) {
Packit Service b38f0b
            name[rootlen] = column[i - 1].subid;
Packit Service b38f0b
            snmp_add_null_var(pdu, name, name_length);
Packit Service b38f0b
        }
Packit Service b38f0b
Packit Service b38f0b
        /*
Packit Service b38f0b
         * do the request 
Packit Service b38f0b
         */
Packit Service b38f0b
        status = snmp_synch_response(ss, pdu, &response);
Packit Service b38f0b
        if (status == STAT_SUCCESS) {
Packit Service b38f0b
            if (response->errstat == SNMP_ERR_NOERROR) {
Packit Service b38f0b
                /*
Packit Service b38f0b
                 * check resulting variables 
Packit Service b38f0b
                 */
Packit Service b38f0b
                vars = response->variables;
Packit Service b38f0b
                entries++;
Packit Service b38f0b
                if (entries >= allocated) {
Packit Service b38f0b
                    if (allocated == 0) {
Packit Service b38f0b
                        allocated = 10;
Packit Service b38f0b
                        data =
Packit Service b38f0b
                            (char **) malloc(allocated * fields *
Packit Service b38f0b
                                             sizeof(char *));
Packit Service b38f0b
                        memset(data, 0,
Packit Service b38f0b
                               allocated * fields * sizeof(char *));
Packit Service b38f0b
                        if (show_index)
Packit Service b38f0b
                            indices =
Packit Service b38f0b
                                (char **) malloc(allocated *
Packit Service b38f0b
                                                 sizeof(char *));
Packit Service b38f0b
                    } else {
Packit Service b38f0b
                        allocated += 10;
Packit Service b38f0b
                        data =
Packit Service b38f0b
                            (char **) realloc(data,
Packit Service b38f0b
                                              allocated * fields *
Packit Service b38f0b
                                              sizeof(char *));
Packit Service b38f0b
                        memset(data + entries * fields, 0,
Packit Service b38f0b
                               (allocated -
Packit Service b38f0b
                                entries) * fields * sizeof(char *));
Packit Service b38f0b
                        if (show_index)
Packit Service b38f0b
                            indices =
Packit Service b38f0b
                                (char **) realloc(indices,
Packit Service b38f0b
                                                  allocated *
Packit Service b38f0b
                                                  sizeof(char *));
Packit Service b38f0b
                    }
Packit Service b38f0b
                }
Packit Service b38f0b
                dp = data + (entries - 1) * fields;
Packit Service b38f0b
                col = -1;
Packit Service b38f0b
                end_of_table = 1;       /* assume end of table */
Packit Service b38f0b
                have_current_index = 0;
Packit Service b38f0b
                name_length = rootlen + 1;
Packit Service b38f0b
                for (vars = response->variables; vars;
Packit Service b38f0b
                     vars = vars->next_variable) {
Packit Service b38f0b
                    col++;
Packit Service b38f0b
                    name[rootlen] = column[col].subid;
Packit Service b38f0b
                    if ((vars->name_length < name_length) ||
Packit Service b38f0b
                        (vars->name[rootlen] != column[col].subid) ||
Packit Service b38f0b
                        memcmp(name, vars->name,
Packit Service b38f0b
                               name_length * sizeof(oid)) != 0
Packit Service b38f0b
                        || vars->type == SNMP_ENDOFMIBVIEW) {
Packit Service b38f0b
                        /*
Packit Service b38f0b
                         * not part of this subtree 
Packit Service b38f0b
                         */
Packit Service b38f0b
                        if (localdebug) {
Packit Service b38f0b
                            fprint_variable(stderr, vars->name,
Packit Service b38f0b
                                            vars->name_length, vars);
Packit Service b38f0b
                            fprintf(stderr, " => ignored\n");
Packit Service b38f0b
                        }
Packit Service b38f0b
                        continue;
Packit Service b38f0b
                    }
Packit Service b38f0b
Packit Service b38f0b
                    /*
Packit Service b38f0b
                     * save index off 
Packit Service b38f0b
                     */
Packit Service b38f0b
                    if (!have_current_index) {
Packit Service b38f0b
                        end_of_table = 0;
Packit Service b38f0b
                        have_current_index = 1;
Packit Service b38f0b
                        name_length = vars->name_length;
Packit Service b38f0b
                        memcpy(name, vars->name,
Packit Service b38f0b
                               name_length * sizeof(oid));
Packit Service b38f0b
                        out_len = 0;
Packit Service b38f0b
                        if (!sprint_realloc_objid
Packit Service b38f0b
                            ((u_char **)&buf, &buf_len, &out_len, 1, vars->name,
Packit Service b38f0b
                             vars->name_length)) {
Packit Service b38f0b
                            break;
Packit Service b38f0b
                        }
Packit Service b38f0b
                        i = vars->name_length - rootlen + 1;
Packit Service b38f0b
                        if (localdebug || show_index) {
Packit Service b38f0b
                            if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, 
Packit Service b38f0b
                                              NETSNMP_DS_LIB_EXTENDED_INDEX)) {
Packit Service b38f0b
                                name_p = strchr(buf, '[');
Packit Service b38f0b
                            } else {
Packit Service b38f0b
                                switch (netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID,
Packit Service b38f0b
                                                          NETSNMP_DS_LIB_OID_OUTPUT_FORMAT)) {
Packit Service b38f0b
                                case NETSNMP_OID_OUTPUT_MODULE:
Packit Service b38f0b
				case 0:
Packit Service b38f0b
                                    name_p = strchr(buf, ':');
Packit Service b38f0b
                                    break;
Packit Service b38f0b
                                case NETSNMP_OID_OUTPUT_SUFFIX:
Packit Service b38f0b
                                    name_p = buf;
Packit Service b38f0b
                                    break;
Packit Service b38f0b
                                case NETSNMP_OID_OUTPUT_FULL:
Packit Service b38f0b
                                case NETSNMP_OID_OUTPUT_NUMERIC:
Packit Service b38f0b
                                case NETSNMP_OID_OUTPUT_UCD:
Packit Service b38f0b
                                    name_p = buf + strlen(table_name)+1;
Packit Service b38f0b
                                    name_p = strchr(name_p, '.')+1;
Packit Service b38f0b
                                    break;
Packit Service b38f0b
				default:
Packit Service b38f0b
				    fprintf(stderr, "Unrecognized -O option: %d\n",
Packit Service b38f0b
					    netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID,
Packit Service b38f0b
							      NETSNMP_DS_LIB_OID_OUTPUT_FORMAT));
Packit Service b38f0b
				    exit(1);
Packit Service b38f0b
                                }
Packit Service b38f0b
                                name_p = strchr(name_p, '.') + 1;
Packit Service b38f0b
                            }
Packit Service b38f0b
                        }
Packit Service b38f0b
                        if (localdebug) {
Packit Service b38f0b
                            printf("Name: %s Index: %s\n", buf, name_p);
Packit Service b38f0b
                        }
Packit Service b38f0b
                        if (show_index) {
Packit Service b38f0b
                            indices[entries - 1] = strdup(name_p);
Packit Service b38f0b
                            i = strlen(name_p);
Packit Service b38f0b
                            if (i > index_width)
Packit Service b38f0b
                                index_width = i;
Packit Service b38f0b
                        }
Packit Service b38f0b
                    }
Packit Service b38f0b
Packit Service b38f0b
                    if (localdebug && buf) {
Packit Service b38f0b
                        printf("%s => taken\n", buf);
Packit Service b38f0b
                    }
Packit Service b38f0b
                    out_len = 0;
Packit Service b38f0b
                    sprint_realloc_value((u_char **)&buf, &buf_len, &out_len, 1,
Packit Service b38f0b
                                         vars->name, vars->name_length,
Packit Service b38f0b
                                         vars);
Packit Service b38f0b
                    for (cp = buf; *cp; cp++) {
Packit Service b38f0b
                        if (*cp == '\n') {
Packit Service b38f0b
                            *cp = ' ';
Packit Service b38f0b
                        }
Packit Service b38f0b
                    }
Packit Service b38f0b
                    dp[col] = buf;
Packit Service b38f0b
                    i = out_len;
Packit Service b38f0b
                    buf = NULL;
Packit Service b38f0b
                    buf_len = 0;
Packit Service b38f0b
                    if (i > column[col].width) {
Packit Service b38f0b
                        column[col].width = i;
Packit Service b38f0b
                    }
Packit Service b38f0b
                }
Packit Service b38f0b
                if (buf)
Packit Service b38f0b
                    free(buf);
Packit Service b38f0b
Packit Service b38f0b
                if (end_of_table) {
Packit Service b38f0b
                    --entries;
Packit Service b38f0b
                    /*
Packit Service b38f0b
                     * not part of this subtree 
Packit Service b38f0b
                     */
Packit Service b38f0b
                    if (localdebug) {
Packit Service b38f0b
                        printf("End of table: %s\n",
Packit Service b38f0b
                               buf ? (char *) buf : "[NIL]");
Packit Service b38f0b
                    }
Packit Service b38f0b
                    snmp_free_pdu(response);
Packit Service b38f0b
                    running = 0;
Packit Service b38f0b
                    continue;
Packit Service b38f0b
                }
Packit Service b38f0b
            } else {
Packit Service b38f0b
                /*
Packit Service b38f0b
                 * error in response, print it 
Packit Service b38f0b
                 */
Packit Service b38f0b
                running = 0;
Packit Service b38f0b
                if (response->errstat == SNMP_ERR_NOSUCHNAME) {
Packit Service b38f0b
                    printf("End of MIB\n");
Packit Service b38f0b
                    end_of_table = 1;
Packit Service b38f0b
                } else {
Packit Service b38f0b
                    fprintf(stderr, "Error in packet.\nReason: %s\n",
Packit Service b38f0b
                            snmp_errstring(response->errstat));
Packit Service b38f0b
                    if (response->errindex != 0) {
Packit Service b38f0b
                        fprintf(stderr, "Failed object: ");
Packit Service b38f0b
                        for (count = 1, vars = response->variables;
Packit Service b38f0b
                             vars && count != response->errindex;
Packit Service b38f0b
                             vars = vars->next_variable, count++)
Packit Service b38f0b
                            /*EMPTY*/;
Packit Service b38f0b
                        if (vars) {
Packit Service b38f0b
                            fprint_objid(stderr, vars->name,
Packit Service b38f0b
                                         vars->name_length);
Packit Service b38f0b
                        }
Packit Service b38f0b
                        fprintf(stderr, "\n");
Packit Service b38f0b
                    }
Packit Service b38f0b
                    exitval = 2;
Packit Service b38f0b
                }
Packit Service b38f0b
            }
Packit Service b38f0b
        } else if (status == STAT_TIMEOUT) {
Packit Service b38f0b
            fprintf(stderr, "Timeout: No Response from %s\n",
Packit Service b38f0b
                    ss->peername);
Packit Service b38f0b
            running = 0;
Packit Service b38f0b
            exitval = 1;
Packit Service b38f0b
        } else {                /* status == STAT_ERROR */
Packit Service b38f0b
            snmp_sess_perror("snmptable", ss);
Packit Service b38f0b
            running = 0;
Packit Service b38f0b
            exitval = 1;
Packit Service b38f0b
        }
Packit Service b38f0b
        if (response)
Packit Service b38f0b
            snmp_free_pdu(response);
Packit Service b38f0b
    }
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
getbulk_table_entries(netsnmp_session * ss)
Packit Service b38f0b
{
Packit Service b38f0b
    int             running = 1;
Packit Service b38f0b
    netsnmp_pdu    *pdu, *response;
Packit Service b38f0b
    netsnmp_variable_list *vars, *last_var;
Packit Service b38f0b
    int             count;
Packit Service b38f0b
    int             status;
Packit Service b38f0b
    int             i;
Packit Service b38f0b
    int             row, col;
Packit Service b38f0b
    char           *buf = NULL;
Packit Service b38f0b
    size_t          buf_len = 0, out_len = 0;
Packit Service b38f0b
    char           *cp;
Packit Service b38f0b
    char           *name_p = NULL;
Packit Service b38f0b
    char          **dp;
Packit Service b38f0b
Packit Service b38f0b
    while (running) {
Packit Service b38f0b
        /*
Packit Service b38f0b
         * create PDU for GETBULK request and add object name to request 
Packit Service b38f0b
         */
Packit Service b38f0b
        pdu = snmp_pdu_create(SNMP_MSG_GETBULK);
Packit Service b38f0b
        pdu->non_repeaters = 0;
Packit Service b38f0b
        pdu->max_repetitions = max_getbulk;
Packit Service b38f0b
        snmp_add_null_var(pdu, name, name_length);
Packit Service b38f0b
Packit Service b38f0b
        /*
Packit Service b38f0b
         * do the request 
Packit Service b38f0b
         */
Packit Service b38f0b
        status = snmp_synch_response(ss, pdu, &response);
Packit Service b38f0b
        if (status == STAT_SUCCESS) {
Packit Service b38f0b
            if (response->errstat == SNMP_ERR_NOERROR) {
Packit Service b38f0b
                /*
Packit Service b38f0b
                 * check resulting variables 
Packit Service b38f0b
                 */
Packit Service b38f0b
                vars = response->variables;
Packit Service b38f0b
                last_var = NULL;
Packit Service b38f0b
                while (vars) {
Packit Service b38f0b
                    out_len = 0;
Packit Service b38f0b
                    sprint_realloc_objid((u_char **)&buf, &buf_len, &out_len, 1,
Packit Service b38f0b
                                         vars->name, vars->name_length);
Packit Service b38f0b
                    if (vars->type == SNMP_ENDOFMIBVIEW ||
Packit Service b38f0b
                        memcmp(vars->name, name,
Packit Service b38f0b
                               rootlen * sizeof(oid)) != 0) {
Packit Service b38f0b
                        if (localdebug) {
Packit Service b38f0b
                            printf("%s => end of table\n",
Packit Service b38f0b
                                   buf ? (char *) buf : "[NIL]");
Packit Service b38f0b
                        }
Packit Service b38f0b
                        running = 0;
Packit Service b38f0b
                        break;
Packit Service b38f0b
                    }
Packit Service b38f0b
                    if (localdebug) {
Packit Service b38f0b
                        printf("%s => taken\n",
Packit Service b38f0b
                               buf ? (char *) buf : "[NIL]");
Packit Service b38f0b
                    }
Packit Service b38f0b
                    for (col = 0; col < fields; col++)
Packit Service b38f0b
                        if (column[col].subid == vars->name[rootlen])
Packit Service b38f0b
                            break;
Packit Service b38f0b
		    if (col == fields) {
Packit Service b38f0b
			extra_columns = 1;
Packit Service b38f0b
			last_var = vars;
Packit Service b38f0b
			vars = vars->next_variable;
Packit Service b38f0b
			continue;
Packit Service b38f0b
		    }
Packit Service b38f0b
                    if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, 
Packit Service b38f0b
                                              NETSNMP_DS_LIB_EXTENDED_INDEX)) {
Packit Service b38f0b
                        name_p = strchr(buf, '[');
Packit Service b38f0b
                        if (name_p == NULL) {
Packit Service b38f0b
                            running = 0;
Packit Service b38f0b
                            break;
Packit Service b38f0b
                        }
Packit Service b38f0b
                    } else {
Packit Service b38f0b
                        switch (netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID,
Packit Service b38f0b
                                                  NETSNMP_DS_LIB_OID_OUTPUT_FORMAT)) {
Packit Service b38f0b
                        case NETSNMP_OID_OUTPUT_MODULE:
Packit Service b38f0b
			case 0:
Packit Service b38f0b
                            name_p = strchr(buf, ':')+1;
Packit Service b38f0b
                            break;
Packit Service b38f0b
                        case NETSNMP_OID_OUTPUT_SUFFIX:
Packit Service b38f0b
                            name_p = buf;
Packit Service b38f0b
                            break;
Packit Service b38f0b
                        case NETSNMP_OID_OUTPUT_FULL:
Packit Service b38f0b
                        case NETSNMP_OID_OUTPUT_NUMERIC:
Packit Service b38f0b
                        case NETSNMP_OID_OUTPUT_UCD:
Packit Service b38f0b
                            name_p = buf + strlen(table_name)+1;
Packit Service b38f0b
                            name_p = strchr(name_p, '.')+1;
Packit Service b38f0b
                            break;
Packit Service b38f0b
			default:
Packit Service b38f0b
			    fprintf(stderr, "Unrecognized -O option: %d\n",
Packit Service b38f0b
				    netsnmp_ds_get_int(NETSNMP_DS_LIBRARY_ID,
Packit Service b38f0b
					              NETSNMP_DS_LIB_OID_OUTPUT_FORMAT));
Packit Service b38f0b
			    exit(1);
Packit Service b38f0b
                        }
Packit Service b38f0b
                        name_p = strchr(name_p, '.');
Packit Service b38f0b
                        if ( name_p == NULL ) {
Packit Service b38f0b
                            /* The 'strchr' call above failed, i.e. the results
Packit Service b38f0b
                             * don't seem to include instance subidentifiers! */
Packit Service b38f0b
                            running = 0;
Packit Service b38f0b
                            break;
Packit Service b38f0b
                        }
Packit Service b38f0b
                        name_p++;  /* Move on to the instance identifier */
Packit Service b38f0b
                    }
Packit Service b38f0b
                    for (row = 0; row < entries; row++)
Packit Service b38f0b
                        if (strcmp(name_p, indices[row]) == 0)
Packit Service b38f0b
                            break;
Packit Service b38f0b
                    if (row == entries) {
Packit Service b38f0b
                        entries++;
Packit Service b38f0b
                        if (entries >= allocated) {
Packit Service b38f0b
                            if (allocated == 0) {
Packit Service b38f0b
                                allocated = 10;
Packit Service b38f0b
                                data =
Packit Service b38f0b
                                    (char **) malloc(allocated * fields *
Packit Service b38f0b
                                                     sizeof(char *));
Packit Service b38f0b
                                memset(data, 0,
Packit Service b38f0b
                                       allocated * fields *
Packit Service b38f0b
                                       sizeof(char *));
Packit Service b38f0b
                                indices =
Packit Service b38f0b
                                    (char **) malloc(allocated *
Packit Service b38f0b
                                                     sizeof(char *));
Packit Service b38f0b
                            } else {
Packit Service b38f0b
                                allocated += 10;
Packit Service b38f0b
                                data =
Packit Service b38f0b
                                    (char **) realloc(data,
Packit Service b38f0b
                                                      allocated * fields *
Packit Service b38f0b
                                                      sizeof(char *));
Packit Service b38f0b
                                memset(data + entries * fields, 0,
Packit Service b38f0b
                                       (allocated -
Packit Service b38f0b
                                        entries) * fields *
Packit Service b38f0b
                                       sizeof(char *));
Packit Service b38f0b
                                indices =
Packit Service b38f0b
                                    (char **) realloc(indices,
Packit Service b38f0b
                                                      allocated *
Packit Service b38f0b
                                                      sizeof(char *));
Packit Service b38f0b
                            }
Packit Service b38f0b
                        }
Packit Service b38f0b
                        indices[row] = strdup(name_p);
Packit Service b38f0b
                        i = strlen(name_p);
Packit Service b38f0b
                        if (i > index_width)
Packit Service b38f0b
                            index_width = i;
Packit Service b38f0b
                    }
Packit Service b38f0b
                    dp = data + row * fields;
Packit Service b38f0b
                    out_len = 0;
Packit Service b38f0b
                    sprint_realloc_value((u_char **)&buf, &buf_len, &out_len, 1,
Packit Service b38f0b
                                         vars->name, vars->name_length,
Packit Service b38f0b
                                         vars);
Packit Service b38f0b
                    for (cp = buf; *cp; cp++)
Packit Service b38f0b
                        if (*cp == '\n')
Packit Service b38f0b
                            *cp = ' ';
Packit Service b38f0b
                    dp[col] = buf;
Packit Service b38f0b
                    i = out_len;
Packit Service b38f0b
                    buf = NULL;
Packit Service b38f0b
                    buf_len = 0;
Packit Service b38f0b
                    if (i > column[col].width)
Packit Service b38f0b
                        column[col].width = i;
Packit Service b38f0b
                    last_var = vars;
Packit Service b38f0b
                    vars = vars->next_variable;
Packit Service b38f0b
                }
Packit Service b38f0b
                if (last_var) {
Packit Service b38f0b
                    name_length = last_var->name_length;
Packit Service b38f0b
                    memcpy(name, last_var->name,
Packit Service b38f0b
                           name_length * sizeof(oid));
Packit Service b38f0b
                }
Packit Service b38f0b
                if (buf)
Packit Service b38f0b
                    free(buf);
Packit Service b38f0b
            } else {
Packit Service b38f0b
                /*
Packit Service b38f0b
                 * error in response, print it 
Packit Service b38f0b
                 */
Packit Service b38f0b
                running = 0;
Packit Service b38f0b
                if (response->errstat == SNMP_ERR_NOSUCHNAME) {
Packit Service b38f0b
                    printf("End of MIB\n");
Packit Service b38f0b
                } else {
Packit Service b38f0b
                    fprintf(stderr, "Error in packet.\nReason: %s\n",
Packit Service b38f0b
                            snmp_errstring(response->errstat));
Packit Service b38f0b
                    if (response->errstat == SNMP_ERR_NOSUCHNAME) {
Packit Service b38f0b
                        fprintf(stderr,
Packit Service b38f0b
                                "The request for this object identifier failed: ");
Packit Service b38f0b
                        for (count = 1, vars = response->variables;
Packit Service b38f0b
                             vars && count != response->errindex;
Packit Service b38f0b
                             vars = vars->next_variable, count++)
Packit Service b38f0b
                            /*EMPTY*/;
Packit Service b38f0b
                        if (vars) {
Packit Service b38f0b
                            fprint_objid(stderr, vars->name,
Packit Service b38f0b
                                         vars->name_length);
Packit Service b38f0b
                        }
Packit Service b38f0b
                        fprintf(stderr, "\n");
Packit Service b38f0b
                    }
Packit Service b38f0b
                    exitval = 2;
Packit Service b38f0b
                }
Packit Service b38f0b
            }
Packit Service b38f0b
        } else if (status == STAT_TIMEOUT) {
Packit Service b38f0b
            fprintf(stderr, "Timeout: No Response from %s\n",
Packit Service b38f0b
                    ss->peername);
Packit Service b38f0b
            running = 0;
Packit Service b38f0b
            exitval = 1;
Packit Service b38f0b
        } else {                /* status == STAT_ERROR */
Packit Service b38f0b
            snmp_sess_perror("snmptable", ss);
Packit Service b38f0b
            running = 0;
Packit Service b38f0b
            exitval = 1;
Packit Service b38f0b
        }
Packit Service b38f0b
        if (response)
Packit Service b38f0b
            snmp_free_pdu(response);
Packit Service b38f0b
    }
Packit Service b38f0b
}