Blame apps/snmpgetnext.c

Packit Service b38f0b
/*
Packit Service b38f0b
 * snmpgetnext.c - send snmp GETNEXT requests to a network entity.
Packit Service b38f0b
 *
Packit Service b38f0b
 */
Packit Service b38f0b
/***********************************************************************
Packit Service b38f0b
	Copyright 1988, 1989, 1991, 1992 by Carnegie Mellon University
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 and that
Packit Service b38f0b
both that copyright notice and this permission notice appear in
Packit Service b38f0b
supporting documentation, and that the name of CMU not be
Packit Service b38f0b
used in advertising or publicity pertaining to distribution of the
Packit Service b38f0b
software without specific, written prior permission.
Packit Service b38f0b
Packit Service b38f0b
CMU 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
CMU 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
#include <stdio.h>
Packit Service b38f0b
#include <ctype.h>
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
#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
#define NETSNMP_DS_APP_DONT_FIX_PDUS 0
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
        while (*optarg) {
Packit Service b38f0b
            switch (*optarg++) {
Packit Service b38f0b
            case 'f':
Packit Service b38f0b
                netsnmp_ds_toggle_boolean(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
					  NETSNMP_DS_APP_DONT_FIX_PDUS);
Packit Service b38f0b
                break;
Packit Service b38f0b
            default:
Packit Service b38f0b
                fprintf(stderr, "Unknown flag passed to -C: %c\n",
Packit Service b38f0b
                        optarg[-1]);
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: snmpgetnext ");
Packit Service b38f0b
    snmp_parse_args_usage(stderr);
Packit Service b38f0b
    fprintf(stderr, " OID [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,
Packit Service b38f0b
            "\t\t\t  f:  do not fix errors and retry the request\n");
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
    netsnmp_pdu    *pdu, *response;
Packit Service b38f0b
    netsnmp_variable_list *vars;
Packit Service b38f0b
    int             arg;
Packit Service b38f0b
    int             count;
Packit Service b38f0b
    int             current_name = 0;
Packit Service b38f0b
    char           *names[SNMP_MAX_CMDLINE_OIDS];
Packit Service b38f0b
    oid             name[MAX_OID_LEN];
Packit Service b38f0b
    size_t          name_length;
Packit Service b38f0b
    int             status;
Packit Service b38f0b
    int             failures = 0;
Packit Service b38f0b
    int             exitval = 1;
Packit Service b38f0b
Packit Service b38f0b
    SOCK_STARTUP;
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * get the common command line arguments 
Packit Service b38f0b
     */
Packit Service b38f0b
    switch (arg = 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
    if (arg >= argc) {
Packit Service b38f0b
        fprintf(stderr, "Missing object name\n");
Packit Service b38f0b
        usage();
Packit Service b38f0b
        goto out;
Packit Service b38f0b
    }
Packit Service b38f0b
    if ((argc - arg) > SNMP_MAX_CMDLINE_OIDS) {
Packit Service b38f0b
        fprintf(stderr, "Too many object identifiers specified. ");
Packit Service b38f0b
        fprintf(stderr, "Only %d allowed in one request.\n", SNMP_MAX_CMDLINE_OIDS);
Packit Service b38f0b
        usage();
Packit Service b38f0b
        goto out;
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * get the object names 
Packit Service b38f0b
     */
Packit Service b38f0b
    for (; arg < argc; arg++)
Packit Service b38f0b
        names[current_name++] = argv[arg];
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("snmpgetnext", &session);
Packit Service b38f0b
        goto out;
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * create PDU for GET request and add object names to request 
Packit Service b38f0b
     */
Packit Service b38f0b
    pdu = snmp_pdu_create(SNMP_MSG_GETNEXT);
Packit Service b38f0b
Packit Service b38f0b
    for (count = 0; count < current_name; count++) {
Packit Service b38f0b
        name_length = MAX_OID_LEN;
Packit Service b38f0b
        if (snmp_parse_oid(names[count], name, &name_length) == NULL) {
Packit Service b38f0b
            snmp_perror(names[count]);
Packit Service b38f0b
            failures++;
Packit Service b38f0b
        } else
Packit Service b38f0b
            snmp_add_null_var(pdu, name, name_length);
Packit Service b38f0b
    }
Packit Service b38f0b
    if (failures)
Packit Service b38f0b
        goto close_session;
Packit Service b38f0b
Packit Service b38f0b
    exitval = 0;
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * do the request 
Packit Service b38f0b
     */
Packit Service b38f0b
  retry:
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
            for (vars = response->variables; vars;
Packit Service b38f0b
                 vars = vars->next_variable)
Packit Service b38f0b
                print_variable(vars->name, vars->name_length, vars);
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
                if (vars)
Packit Service b38f0b
                    fprint_objid(stderr, vars->name, vars->name_length);
Packit Service b38f0b
                fprintf(stderr, "\n");
Packit Service b38f0b
                exitval = 2;
Packit Service b38f0b
            }
Packit Service b38f0b
Packit Service b38f0b
            /*
Packit Service b38f0b
             * retry if the errored variable was successfully removed 
Packit Service b38f0b
             */
Packit Service b38f0b
            if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
					NETSNMP_DS_APP_DONT_FIX_PDUS)) {
Packit Service b38f0b
                pdu = snmp_fix_pdu(response, SNMP_MSG_GETNEXT);
Packit Service b38f0b
                snmp_free_pdu(response);
Packit Service b38f0b
                response = NULL;
Packit Service b38f0b
                if (pdu != NULL)
Packit Service b38f0b
                    goto retry;
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
                session.peername);
Packit Service b38f0b
        exitval = 1;
Packit Service b38f0b
    } else {                    /* status == STAT_ERROR */
Packit Service b38f0b
        snmp_sess_perror("snmpgetnext", ss);
Packit Service b38f0b
        exitval = 1;
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    if (response)
Packit Service b38f0b
        snmp_free_pdu(response);
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
}