On Tue, Sep 27, 2005 at 02:31:52PM +0100, Dave Shield wrote:
> On Tue, 2005-09-27 at 13:05 +0100, Patrick Welche wrote:
> > Good plan: snmpget:
> > 
> > { GetRequest(28) R=86800923  system.sysUpTime.0 }
> > { GetResponse(32) R=86800923  system.sysUpTime.0=1062737154 }
> > 
> > and my broken programme:
> > 
> > { GetRequest(36) R=1548568929  system.sysUpTime.0 .0.0.0.0.0[|snmp] }
> > { GetResponse(36) R=1548568929  [EMAIL PROTECTED] system.sysUpTime.0= 
> > .0.0.0.0.0=[|snmp] }
> 
> So it's adding two varbinds instead of one
> (the second of which is bogus)

ah - so the question is, what is the life cycle of a pdu?

    pdu=snmp_pdu_create(SNMP_MSG_GET);

gets me an empty pdu

    snmp_add_null_var
    snmp_add_null_var

adds two oids to it

    snmp_sess_synch_response

sends them off and

    snmp_free_pdu

core dumps saying its already free ?

Given the simple code attached, I still see

GetRequest(36) R=869755998  system.sysUpTime.0 .iso.org.dod.internet.mgmt[|snmp]
                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^
                                               this extra stuff

as opposed to

GetRequest(28) R=736117813  system.sysUpTime.0

from snmpget. Still playing spot the difference.. Any tips/hints?

Cheers,

Patrick
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>

void
do_send(void *sessp, netsnmp_pdu *pdu, netsnmp_pdu *response, netsnmp_session 
*ss)
{
        int i, status;
        netsnmp_variable_list *vars;

        status = snmp_sess_synch_response(sessp, pdu, &response);
        if (status == STAT_SUCCESS) {
                if ((response)->errstat == SNMP_ERR_NOERROR) {
printf("All...\n");
                        for (vars = (response)->variables; vars; vars = 
vars->next_variable)
                                print_variable(vars->name, vars->name_length, 
vars);
printf("...OK\n");
                } else {
                        fprintf(stderr, "Error in packet.\nReason %d/%ld: 
%s\n",snmp_errno,response->errstat,
                                        snmp_errstring((response)->errstat));
                        if ((response)->errindex != 0) {
                                fprintf(stderr, "Failed object: ");
                                for (i = 1, vars = (response)->variables;
                                                                vars && (i != 
(response)->errindex);
                                        vars = vars->next_variable, i++);
                                if (vars)
                                        fprint_objid(stderr, vars->name, 
vars->name_length);
                                fprintf(stderr, "\n");
                        }
                        exit(2);
                }
        } else if (status == STAT_TIMEOUT) {
                fprintf(stderr, "Timeout: No Response\n");
                exit(1);
        } else {                            /* status == STAT_ERROR */
                snmp_sess_perror("do_snmp", ss);
                exit(1);
        }
}
int
main()
{
#define NOIDS 3
        static const char *varname[]={
                "SNMPv2-MIB::sysUpTime.0",
                "SNMPv2-MIB::sysDescr.0",
                "IF-MIB::ifIndex.1"
        };

        void *sessp;
        netsnmp_session session, *ss;
        netsnmp_pdu *pdu;
        netsnmp_pdu *response;
        oid value[NOIDS][MAX_OID_LEN];
        size_t valuelen[NOIDS]; 
        int i, failures;
        struct tree *mibtree;

        /* just to keep gcc quiet */
        response=NULL;

        init_snmp("test");
        snmp_sess_init(&session);
        session.peername="localhost";
        session.version=SNMP_VERSION_1;
        session.community="hello";
        session.community_len=strlen(session.community);
        SOCK_STARTUP; /* ?? */
        sessp=snmp_sess_open(&session);
        ss=snmp_sess_session(sessp);
        if(ss==NULL) {
                snmp_perror("Couldn't establish the session");
                exit(1);  
        }

        init_mib();
        mibtree=read_module("SNMPv2-MIB");
        mibtree=read_module("IF-MIB");
        /* parse all oids */
        failures=0;
        for (i=0; i<NOIDS; ++i) {
                valuelen[i]=sizeof(value[i])/sizeof(oid);
                if (!snmp_parse_oid(varname[i], value[i], &valuelen[i])) {
                        snmp_perror(varname[i]);
                        failures++;
                }
fprintf(stderr,"%2d,%3d: ",i,valuelen[i]);
fprint_objid(stderr,value[i],valuelen[i]);
        };

        if (failures) {
                SOCK_CLEANUP;
                exit(1);
        }

        pdu=snmp_pdu_create(SNMP_MSG_GET);

        snmp_add_null_var(pdu,value[0],valuelen[0]);
        snmp_add_null_var(pdu,value[1],valuelen[1]);

        do_send(sessp, pdu, response, ss);

        snmp_free_pdu(pdu);
        if (response) snmp_free_pdu(response);

        pdu=snmp_pdu_create(SNMP_MSG_GET);

        value[2][valuelen[2]-1]=1;
        snmp_add_null_var(pdu,value[2],valuelen[2]);
        value[2][valuelen[2]-1]=2;
        snmp_add_null_var(pdu,value[2],valuelen[2]);
        value[2][valuelen[2]-1]=3;
        snmp_add_null_var(pdu,value[2],valuelen[2]);

        do_send(sessp, pdu, response, ss);

        snmp_free_pdu(pdu);
        if (response) snmp_free_pdu(response);

        shutdown_mib();
        snmp_sess_close(sessp);

        return 0;
}

Reply via email to