Blame apps/snmptest.c

Packit fcad23
/*
Packit fcad23
 * snmptest.c - send snmp requests to a network entity.
Packit fcad23
 *
Packit fcad23
 * Usage: snmptest -v 1 [-q] hostname community [objectID]
Packit fcad23
 *
Packit fcad23
 */
Packit fcad23
/***********************************************************************
Packit fcad23
	Copyright 1988, 1989, 1991, 1992 by Carnegie Mellon University
Packit fcad23
Packit fcad23
                      All Rights Reserved
Packit fcad23
Packit fcad23
Permission to use, copy, modify, and distribute this software and its
Packit fcad23
documentation for any purpose and without fee is hereby granted,
Packit fcad23
provided that the above copyright notice appear in all copies and that
Packit fcad23
both that copyright notice and this permission notice appear in
Packit fcad23
supporting documentation, and that the name of CMU not be
Packit fcad23
used in advertising or publicity pertaining to distribution of the
Packit fcad23
software without specific, written prior permission.
Packit fcad23
Packit fcad23
CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
Packit fcad23
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
Packit fcad23
CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
Packit fcad23
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
Packit fcad23
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
Packit fcad23
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
Packit fcad23
SOFTWARE.
Packit fcad23
******************************************************************/
Packit fcad23
#include <net-snmp/net-snmp-config.h>
Packit fcad23
Packit fcad23
#if HAVE_STDLIB_H
Packit fcad23
#include <stdlib.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_UNISTD_H
Packit fcad23
#include <unistd.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_STRING_H
Packit fcad23
#include <string.h>
Packit fcad23
#else
Packit fcad23
#include <strings.h>
Packit fcad23
#endif
Packit fcad23
#include <sys/types.h>
Packit fcad23
#if HAVE_NETINET_IN_H
Packit fcad23
#include <netinet/in.h>
Packit fcad23
#endif
Packit fcad23
#include <stdio.h>
Packit fcad23
#include <ctype.h>
Packit fcad23
#if TIME_WITH_SYS_TIME
Packit fcad23
# include <sys/time.h>
Packit fcad23
# include <time.h>
Packit fcad23
#else
Packit fcad23
# if HAVE_SYS_TIME_H
Packit fcad23
#  include <sys/time.h>
Packit fcad23
# else
Packit fcad23
#  include <time.h>
Packit fcad23
# endif
Packit fcad23
#endif
Packit fcad23
#if HAVE_SYS_SELECT_H
Packit fcad23
#include <sys/select.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_NETDB_H
Packit fcad23
#include <netdb.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_ARPA_INET_H
Packit fcad23
#include <arpa/inet.h>
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#include <net-snmp/net-snmp-includes.h>
Packit fcad23
Packit fcad23
int             command = SNMP_MSG_GET;
Packit fcad23
Packit fcad23
static int      input_variable(netsnmp_variable_list *);
Packit fcad23
Packit fcad23
void
Packit fcad23
usage(void)
Packit fcad23
{
Packit fcad23
    fprintf(stderr, "USAGE: snmptest ");
Packit fcad23
    snmp_parse_args_usage(stderr);
Packit fcad23
    fprintf(stderr, "\n\n");
Packit fcad23
    snmp_parse_args_descriptions(stderr);
Packit fcad23
}
Packit fcad23
Packit fcad23
int
Packit fcad23
main(int argc, char *argv[])
Packit fcad23
{
Packit fcad23
    netsnmp_session session, *ss;
Packit fcad23
    netsnmp_pdu    *pdu = NULL, *response, *copy = NULL;
Packit fcad23
    netsnmp_variable_list *vars, *vp;
Packit fcad23
    netsnmp_transport *transport = NULL;
Packit fcad23
    int             ret;
Packit fcad23
    int             exit_code = 1;
Packit fcad23
    int             status, count;
Packit fcad23
    char            input[128];
Packit fcad23
    int             varcount, nonRepeaters = -1, maxRepetitions;
Packit fcad23
Packit fcad23
    SOCK_STARTUP;
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * get the common command line arguments 
Packit fcad23
     */
Packit fcad23
    switch (snmp_parse_args(argc, argv, &session, NULL, NULL)) {
Packit fcad23
    case NETSNMP_PARSE_ARGS_ERROR:
Packit fcad23
        goto out;
Packit fcad23
    case NETSNMP_PARSE_ARGS_SUCCESS_EXIT:
Packit fcad23
        exit_code = 0;
Packit fcad23
        goto out;
Packit fcad23
    case NETSNMP_PARSE_ARGS_ERROR_USAGE:
Packit fcad23
        usage();
Packit fcad23
        goto out;
Packit fcad23
    default:
Packit fcad23
        break;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * open an SNMP session 
Packit fcad23
     */
Packit fcad23
    ss = snmp_open(&session);
Packit fcad23
    if (ss == NULL) {
Packit fcad23
        /*
Packit fcad23
         * diagnose snmp_open errors with the input netsnmp_session pointer 
Packit fcad23
         */
Packit fcad23
        snmp_sess_perror("snmptest", &session);
Packit fcad23
        goto out;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    varcount = 0;
Packit fcad23
    for(;;) {
Packit fcad23
        vars = NULL;
Packit fcad23
        for (ret = 1; ret != 0;) {
Packit fcad23
            vp = (netsnmp_variable_list *)
Packit fcad23
                malloc(sizeof(netsnmp_variable_list));
Packit fcad23
            memset(vp, 0, sizeof(netsnmp_variable_list));
Packit fcad23
Packit fcad23
            while ((ret = input_variable(vp)) == -1);
Packit fcad23
            if (ret == 1) {
Packit fcad23
                varcount++;
Packit fcad23
                /*
Packit fcad23
                 * add it to the list 
Packit fcad23
                 */
Packit fcad23
                if (vars == NULL) {
Packit fcad23
                    /*
Packit fcad23
                     * if first variable 
Packit fcad23
                     */
Packit fcad23
                    pdu = snmp_pdu_create(command);
Packit fcad23
                    pdu->variables = vp;
Packit fcad23
                } else {
Packit fcad23
                    vars->next_variable = vp;
Packit fcad23
                }
Packit fcad23
                vars = vp;
Packit fcad23
            } else {
Packit fcad23
                /*
Packit fcad23
                 * free the last (unused) variable 
Packit fcad23
                 */
Packit fcad23
                if (vp->name)
Packit fcad23
                    free((char *) vp->name);
Packit fcad23
                if (vp->val.string)
Packit fcad23
                    free((char *) vp->val.string);
Packit fcad23
                free((char *) vp);
Packit fcad23
Packit fcad23
                if (command == SNMP_MSG_GETBULK) {
Packit fcad23
                    if (nonRepeaters == -1) {
Packit fcad23
                        nonRepeaters = varcount;
Packit fcad23
                        ret = -1;       /* so we collect more variables */
Packit fcad23
                        printf("Now input the repeating variables\n");
Packit fcad23
                    } else {
Packit fcad23
                        printf("What repeat count? ");
Packit fcad23
                        fflush(stdout);
Packit fcad23
                        if (!fgets(input, sizeof(input), stdin)) {
Packit fcad23
                            printf("Quitting,  Goodbye\n");
Packit fcad23
                            exit_code = 0;
Packit fcad23
                            goto out;
Packit fcad23
                        }
Packit fcad23
                        maxRepetitions = atoi(input);
Packit fcad23
                        pdu->non_repeaters = nonRepeaters;
Packit fcad23
                        pdu->max_repetitions = maxRepetitions;
Packit fcad23
                    }
Packit fcad23
                }
Packit fcad23
            }
Packit fcad23
            if (varcount == 0 && ret == 0) {
Packit fcad23
                if (!copy) {
Packit fcad23
                    printf("No PDU to send.\n");
Packit fcad23
                    ret = -1;
Packit fcad23
                } else {
Packit fcad23
                    pdu = snmp_clone_pdu(copy);
Packit fcad23
                    printf("Resending last PDU.\n");
Packit fcad23
                }
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
        copy = snmp_clone_pdu(pdu);
Packit fcad23
        if (command == SNMP_MSG_TRAP2) {
Packit fcad23
            /*
Packit fcad23
             * No response needed 
Packit fcad23
             */
Packit fcad23
            if (!snmp_send(ss, pdu)) {
Packit fcad23
                snmp_free_pdu(pdu);
Packit fcad23
                snmp_sess_perror("snmptest", ss);
Packit fcad23
            }
Packit fcad23
        } else {
Packit fcad23
            status = snmp_synch_response(ss, pdu, &response);
Packit fcad23
            if (status == STAT_SUCCESS) {
Packit fcad23
                if (command == SNMP_MSG_INFORM &&
Packit fcad23
                    response->errstat == SNMP_ERR_NOERROR) {
Packit fcad23
                    printf("Inform Acknowledged\n");
Packit fcad23
                } else {
Packit fcad23
                    switch (response->command) {
Packit fcad23
                    case SNMP_MSG_GET:
Packit fcad23
                        printf("Received Get Request ");
Packit fcad23
                        break;
Packit fcad23
                    case SNMP_MSG_GETNEXT:
Packit fcad23
                        printf("Received Getnext Request ");
Packit fcad23
                        break;
Packit fcad23
                    case SNMP_MSG_RESPONSE:
Packit fcad23
                        printf("Received Get Response ");
Packit fcad23
                        break;
Packit fcad23
#ifndef NETSNMP_NO_WRITE_SUPPORT
Packit fcad23
                    case SNMP_MSG_SET:
Packit fcad23
                        printf("Received Set Request ");
Packit fcad23
                        break;
Packit fcad23
#endif /* NETSNMP_NO_WRITE_SUPPORT */
Packit fcad23
                    case SNMP_MSG_TRAP:
Packit fcad23
                        printf("Received Trap Request ");
Packit fcad23
                        break;
Packit fcad23
                    case SNMP_MSG_GETBULK:
Packit fcad23
                        printf("Received Bulk Request ");
Packit fcad23
                        break;
Packit fcad23
                    case SNMP_MSG_INFORM:
Packit fcad23
                        printf("Received Inform Request ");
Packit fcad23
                        break;
Packit fcad23
                    case SNMP_MSG_TRAP2:
Packit fcad23
                        printf("Received SNMPv2 Trap Request ");
Packit fcad23
                        break;
Packit fcad23
                    }
Packit fcad23
                    transport = snmp_sess_transport(snmp_sess_pointer(ss));
Packit fcad23
                    if (transport != NULL && transport->f_fmtaddr != NULL) {
Packit fcad23
                        char *addr_string = transport->f_fmtaddr(transport,
Packit fcad23
                                                                 response->
Packit fcad23
                                                                 transport_data,
Packit fcad23
                                                                 response->
Packit fcad23
                                                                 transport_data_length);
Packit fcad23
                        if (addr_string != NULL) {
Packit fcad23
                            printf("from %s\n", addr_string);
Packit fcad23
                            free(addr_string);
Packit fcad23
                        }
Packit fcad23
                    } else {
Packit fcad23
                        printf("from <UNKNOWN>\n");
Packit fcad23
                    }
Packit fcad23
                    printf
Packit fcad23
                        ("requestid 0x%lX errstat 0x%lX errindex 0x%lX\n",
Packit fcad23
                         response->reqid, response->errstat,
Packit fcad23
                         response->errindex);
Packit fcad23
                    if (response->errstat == SNMP_ERR_NOERROR) {
Packit fcad23
                        for (vars = response->variables; vars;
Packit fcad23
                             vars = vars->next_variable)
Packit fcad23
                            print_variable(vars->name, vars->name_length,
Packit fcad23
                                           vars);
Packit fcad23
                    } else {
Packit fcad23
                        printf("Error in packet.\nReason: %s\n",
Packit fcad23
                               snmp_errstring(response->errstat));
Packit fcad23
                        if (response->errindex != 0) {
Packit fcad23
                            for (count = 1, vars = response->variables;
Packit fcad23
                                 vars && count != response->errindex;
Packit fcad23
                                 vars = vars->next_variable, count++);
Packit fcad23
                            if (vars) {
Packit fcad23
                                printf("Failed object: ");
Packit fcad23
                                print_objid(vars->name, vars->name_length);
Packit fcad23
                            }
Packit fcad23
                            printf("\n");
Packit fcad23
                        }
Packit fcad23
                    }
Packit fcad23
                }
Packit fcad23
            } else if (status == STAT_TIMEOUT) {
Packit fcad23
                printf("Timeout: No Response from %s\n", session.peername);
Packit fcad23
            } else {            /* status == STAT_ERROR */
Packit fcad23
                snmp_sess_perror("snmptest", ss);
Packit fcad23
            }
Packit fcad23
Packit fcad23
            if (response)
Packit fcad23
                snmp_free_pdu(response);
Packit fcad23
        }
Packit fcad23
        varcount = 0;
Packit fcad23
        nonRepeaters = -1;
Packit fcad23
    }
Packit fcad23
    /* NOTREACHED */
Packit fcad23
Packit fcad23
out:
Packit fcad23
    SOCK_CLEANUP;
Packit fcad23
    return exit_code;
Packit fcad23
}
Packit fcad23
Packit fcad23
int
Packit fcad23
input_variable(netsnmp_variable_list * vp)
Packit fcad23
{
Packit fcad23
    char            buf[256];
Packit fcad23
    size_t          val_len;
Packit fcad23
    u_char          ch;
Packit fcad23
Packit fcad23
    printf("Variable: ");
Packit fcad23
    fflush(stdout);
Packit fcad23
    if (!fgets(buf, sizeof(buf), stdin)) {
Packit fcad23
        printf("Quitting,  Goobye\n");
Packit fcad23
        SOCK_CLEANUP;
Packit fcad23
        exit(0);
Packit fcad23
    }
Packit fcad23
    val_len = strlen(buf);
Packit fcad23
Packit fcad23
    if (val_len == 0 || *buf == '\n') {
Packit fcad23
        vp->name_length = 0;
Packit fcad23
        return 0;
Packit fcad23
    }
Packit fcad23
    if (buf[val_len - 1] == '\n')
Packit fcad23
        buf[--val_len] = 0;
Packit fcad23
    if (*buf == '$') {
Packit fcad23
        switch (toupper((unsigned char)(buf[1]))) {
Packit fcad23
        case 'G':
Packit fcad23
            command = SNMP_MSG_GET;
Packit fcad23
            printf("Request type is Get Request\n");
Packit fcad23
            break;
Packit fcad23
        case 'N':
Packit fcad23
            command = SNMP_MSG_GETNEXT;
Packit fcad23
            printf("Request type is Getnext Request\n");
Packit fcad23
            break;
Packit fcad23
#ifndef NETSNMP_NO_WRITE_SUPPORT
Packit fcad23
        case 'S':
Packit fcad23
            command = SNMP_MSG_SET;
Packit fcad23
            printf("Request type is Set Request\n");
Packit fcad23
            break;
Packit fcad23
#endif /* NETSNMP_NO_WRITE_SUPPORT */
Packit fcad23
        case 'B':
Packit fcad23
            command = SNMP_MSG_GETBULK;
Packit fcad23
            printf("Request type is Bulk Request\n");
Packit fcad23
            printf
Packit fcad23
                ("Enter a blank line to terminate the list of non-repeaters\n");
Packit fcad23
            printf("and to begin the repeating variables\n");
Packit fcad23
            break;
Packit fcad23
        case 'I':
Packit fcad23
            command = SNMP_MSG_INFORM;
Packit fcad23
            printf("Request type is Inform Request\n");
Packit fcad23
            printf("(Are you sending to the right port?)\n");
Packit fcad23
            break;
Packit fcad23
        case 'T':
Packit fcad23
            command = SNMP_MSG_TRAP2;
Packit fcad23
            printf("Request type is SNMPv2 Trap Request\n");
Packit fcad23
            printf("(Are you sending to the right port?)\n");
Packit fcad23
            break;
Packit fcad23
        case 'D':
Packit fcad23
            if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, 
Packit fcad23
                                       NETSNMP_DS_LIB_DUMP_PACKET)) {
Packit fcad23
                netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, 
Packit fcad23
                                       NETSNMP_DS_LIB_DUMP_PACKET, 0);
Packit fcad23
                printf("Turned packet dump off\n");
Packit fcad23
            } else {
Packit fcad23
                netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, 
Packit fcad23
                                       NETSNMP_DS_LIB_DUMP_PACKET, 1);
Packit fcad23
                printf("Turned packet dump on\n");
Packit fcad23
            }
Packit fcad23
            break;
Packit fcad23
        case 'Q':
Packit fcad23
            switch ((toupper((unsigned char)(buf[2])))) {
Packit fcad23
            case '\n':
Packit fcad23
            case 0:
Packit fcad23
                printf("Quitting,  Goodbye\n");
Packit fcad23
                SOCK_CLEANUP;
Packit fcad23
                exit(0);
Packit fcad23
                break;
Packit fcad23
            case 'P':
Packit fcad23
                if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, 
Packit fcad23
                                           NETSNMP_DS_LIB_QUICK_PRINT)) {
Packit fcad23
                    netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, 
Packit fcad23
                                           NETSNMP_DS_LIB_QUICK_PRINT, 0);
Packit fcad23
                    printf("Turned quick printing off\n");
Packit fcad23
                } else {
Packit fcad23
                    netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, 
Packit fcad23
                                           NETSNMP_DS_LIB_QUICK_PRINT, 1);
Packit fcad23
                    printf("Turned quick printing on\n");
Packit fcad23
                }
Packit fcad23
                break;
Packit fcad23
            }
Packit fcad23
            break;
Packit fcad23
        default:
Packit fcad23
            printf("Bad command\n");
Packit fcad23
        }
Packit fcad23
        return -1;
Packit fcad23
    }
Packit fcad23
    {
Packit fcad23
	oid     name[MAX_OID_LEN];
Packit fcad23
	vp->name_length = MAX_OID_LEN;
Packit fcad23
	if (!snmp_parse_oid(buf, name, &vp->name_length)) {
Packit fcad23
	    snmp_perror(buf);
Packit fcad23
	    return -1;
Packit fcad23
	}
Packit fcad23
	vp->name = snmp_duplicate_objid(name, vp->name_length);
Packit fcad23
    }
Packit fcad23
Packit fcad23
    if (command == SNMP_MSG_INFORM
Packit fcad23
        || command == SNMP_MSG_TRAP2
Packit fcad23
#ifndef NETSNMP_NO_WRITE_SUPPORT
Packit fcad23
        || command == SNMP_MSG_SET
Packit fcad23
#endif /* NETSNMP_NO_WRITE_SUPPORT */
Packit fcad23
        ) {
Packit fcad23
        printf("Type [i|u|s|x|d|n|o|t|a]: ");
Packit fcad23
        fflush(stdout);
Packit fcad23
        if (!fgets(buf, sizeof(buf), stdin)) {
Packit fcad23
            printf("Quitting,  Goodbye\n");
Packit fcad23
            SOCK_CLEANUP;
Packit fcad23
            exit(0);
Packit fcad23
        }
Packit fcad23
        ch = *buf;
Packit fcad23
        switch (ch) {
Packit fcad23
        case 'i':
Packit fcad23
            vp->type = ASN_INTEGER;
Packit fcad23
            break;
Packit fcad23
        case 'u':
Packit fcad23
            vp->type = ASN_UNSIGNED;
Packit fcad23
            break;
Packit fcad23
        case 's':
Packit fcad23
            vp->type = ASN_OCTET_STR;
Packit fcad23
            break;
Packit fcad23
        case 'x':
Packit fcad23
            vp->type = ASN_OCTET_STR;
Packit fcad23
            break;
Packit fcad23
        case 'd':
Packit fcad23
            vp->type = ASN_OCTET_STR;
Packit fcad23
            break;
Packit fcad23
        case 'n':
Packit fcad23
            vp->type = ASN_NULL;
Packit fcad23
            break;
Packit fcad23
        case 'o':
Packit fcad23
            vp->type = ASN_OBJECT_ID;
Packit fcad23
            break;
Packit fcad23
        case 't':
Packit fcad23
            vp->type = ASN_TIMETICKS;
Packit fcad23
            break;
Packit fcad23
        case 'a':
Packit fcad23
            vp->type = ASN_IPADDRESS;
Packit fcad23
            break;
Packit fcad23
        default:
Packit fcad23
            printf
Packit fcad23
                ("bad type \"%c\", use \"i\", \"u\", \"s\", \"x\", \"d\", \"n\", \"o\", \"t\", or \"a\".\n",
Packit fcad23
                 *buf);
Packit fcad23
            return -1;
Packit fcad23
        }
Packit fcad23
      getValue:
Packit fcad23
        printf("Value: ");
Packit fcad23
        fflush(stdout);
Packit fcad23
        if (!fgets(buf, sizeof(buf), stdin)) {
Packit fcad23
            printf("Quitting,  Goodbye\n");
Packit fcad23
            SOCK_CLEANUP;
Packit fcad23
            exit(0);
Packit fcad23
        }
Packit fcad23
        switch (vp->type) {
Packit fcad23
        case ASN_INTEGER:
Packit fcad23
            vp->val.integer = (long *) malloc(sizeof(long));
Packit fcad23
            *(vp->val.integer) = atoi(buf);
Packit fcad23
            vp->val_len = sizeof(long);
Packit fcad23
            break;
Packit fcad23
        case ASN_UNSIGNED:
Packit fcad23
            vp->val.integer = (long *) malloc(sizeof(long));
Packit fcad23
            *(vp->val.integer) = strtoul(buf, NULL, 0);
Packit fcad23
            vp->val_len = sizeof(long);
Packit fcad23
            break;
Packit fcad23
        case ASN_OCTET_STR:
Packit fcad23
            if (ch == 'd') {
Packit fcad23
                size_t          buf_len = 256;
Packit fcad23
                val_len = 0;
Packit fcad23
                if ((vp->val.string = (u_char *) malloc(buf_len)) == NULL) {
Packit fcad23
                    printf("malloc failure\n");
Packit fcad23
                    goto getValue;
Packit fcad23
                }
Packit fcad23
                if (!snmp_decimal_to_binary(&(vp->val.string), &buf_len,
Packit fcad23
                                            &val_len, 1, buf)) {
Packit fcad23
                    printf("Bad value or no sub-identifier > 255\n");
Packit fcad23
                    free(vp->val.string);
Packit fcad23
                    goto getValue;
Packit fcad23
                }
Packit fcad23
                vp->val_len = val_len;
Packit fcad23
            } else if (ch == 's') {
Packit fcad23
                /*
Packit fcad23
                 * -1 to omit trailing newline  
Packit fcad23
                 */
Packit fcad23
                vp->val.string = (u_char *) malloc(strlen(buf) - 1);
Packit fcad23
                if (vp->val.string == NULL) {
Packit fcad23
                    printf("malloc failure\n");
Packit fcad23
                    goto getValue;
Packit fcad23
                }
Packit fcad23
                memcpy(vp->val.string, buf, strlen(buf) - 1);
Packit fcad23
                vp->val.string[sizeof(vp->val.string)-1] = 0;
Packit fcad23
                vp->val_len = strlen(buf) - 1;
Packit fcad23
            } else if (ch == 'x') {
Packit fcad23
                size_t          buf_len = 256;
Packit fcad23
                val_len = 0;
Packit fcad23
                if ((vp->val.string = (u_char *) malloc(buf_len)) == NULL) {
Packit fcad23
                    printf("malloc failure\n");
Packit fcad23
                    goto getValue;
Packit fcad23
                }
Packit fcad23
                if (!snmp_hex_to_binary(&(vp->val.string), &buf_len,
Packit fcad23
                                        &val_len, 1, buf)) {
Packit fcad23
                    printf("Bad value (need pairs of hex digits)\n");
Packit fcad23
                    free(vp->val.string);
Packit fcad23
                    goto getValue;
Packit fcad23
                }
Packit fcad23
                vp->val_len = val_len;
Packit fcad23
            }
Packit fcad23
            break;
Packit fcad23
        case ASN_NULL:
Packit fcad23
            vp->val_len = 0;
Packit fcad23
            vp->val.string = NULL;
Packit fcad23
            break;
Packit fcad23
        case ASN_OBJECT_ID:
Packit fcad23
            if ('\n' == buf[strlen(buf) - 1])
Packit fcad23
                buf[strlen(buf) - 1] = '\0';
Packit fcad23
	    else {
Packit fcad23
		oid value[MAX_OID_LEN];
Packit fcad23
		vp->val_len = MAX_OID_LEN;
Packit fcad23
		if (0 == read_objid(buf, value, &vp->val_len)) {
Packit fcad23
		    printf("Unrecognised OID value\n");
Packit fcad23
		    goto getValue;
Packit fcad23
		}
Packit fcad23
		vp->val.objid = snmp_duplicate_objid(value, vp->val_len);
Packit fcad23
		vp->val_len *= sizeof(oid);
Packit fcad23
	    }
Packit fcad23
            break;
Packit fcad23
        case ASN_TIMETICKS:
Packit fcad23
            vp->val.integer = (long *) malloc(sizeof(long));
Packit fcad23
            *(vp->val.integer) = atoi(buf);
Packit fcad23
            vp->val_len = sizeof(long);
Packit fcad23
            break;
Packit fcad23
        case ASN_IPADDRESS:
Packit fcad23
            vp->val.integer = (long *) malloc(sizeof(long));
Packit fcad23
            *(vp->val.integer) = inet_addr(buf);
Packit fcad23
            vp->val_len = sizeof(long);
Packit fcad23
            break;
Packit fcad23
        default:
Packit fcad23
            printf("Internal error\n");
Packit fcad23
            break;
Packit fcad23
        }
Packit fcad23
    } else {                    /* some form of get message */
Packit fcad23
        vp->type = ASN_NULL;
Packit fcad23
        vp->val_len = 0;
Packit fcad23
    }
Packit fcad23
    return 1;
Packit fcad23
}