>  기사  >  데이터 베이스  >  用NET-SNMP软件包开发简单客户端代理(5)

用NET-SNMP软件包开发简单客户端代理(5)

WBOY
WBOY원래의
2016-06-07 15:31:181410검색

6.3.3 ExampleTable_access.c /*ExampleTable_access.c*/ /* * Note: this file originally auto-generated by mib2c using * :mib2c.access_functions.conf,v 1.9 2004/10/14 12:57:33 dts12 Exp $ */ #include net-snmp/net-snmp-config.h #includenet-snm

6.3.3       ExampleTable_access.c

/*ExampleTable_access.c*/

/*

 * Note: this file originally auto-generated by mib2c using

 *        : mib2c.access_functions.conf,v 1.9 2004/10/14 12:57:33 dts12 Exp $

 */

 

#include

#include

#include

#include "ExampleTable_access.h"

#include "ExampleTable_enums.h"

#include

 

struct ExampleTable_entry {

    long MachineNumber;

    char MachineStatus[10];

    u_long CheckTime;

    long   MonSet;

    struct ExampleTable_entry *next;

};

 

struct ExampleTable_entry  *ExampleTable_head=NULL;

 

/* create a new row in the (unsorted) table */

struct ExampleTable_entry *

ExampleTable_createEntry(long  MachineNumber,

                                           char *MachineStatus,

                                           u_long CheckTime,

                                           long MonSet

                                                      )

 {

    struct ExampleTable_entry *entry;

 

    entry = SNMP_MALLOC_TYPEDEF(struct ExampleTable_entry);

    if (!entry)

        return NULL;

 

    entry->MachineNumber = MachineNumber;

    strcpy(entry->MachineStatus ,MachineStatus);

    entry->CheckTime     = CheckTime;

       entry->MonSet        =MonSet;

    entry->next          = ExampleTable_head;

    ExampleTable_head    = entry;

   

    return entry;

}

 

/* remove a row from the table */

void

ExampleTable_removeEntry( struct ExampleTable_entry *entry )

{

    struct ExampleTable_entry *ptr, *prev;

 

    if (!entry)

        return;    /* Nothing to remove */

 

    for ( ptr  = ExampleTable_head, prev = NULL;

          ptr != NULL;

          prev = ptr, ptr = ptr->next ) {

        if ( ptr == entry )

            break;

    }

    if ( !ptr )

        return;    /* Can't find it */

 

    if ( prev == NULL )

        ExampleTable_head = ptr->next;

    else

        prev->next = ptr->next;

 

     SNMP_FREE( entry );   /* XXX - release any other internal resources */

}

 

void data_read(void)

{

       FILE *fp;

  int i;

  struct  ExampleTable_entry *temp;

      fp=fopen("data.txt","r");

      while (ExampleTable_head)/*clean link list begin*/

              {

                     temp=ExampleTable_head->next;

                     ExampleTable_removeEntry(ExampleTable_head);

                     ExampleTable_head=temp;

              }/*clean link list end*/

             

       temp=SNMP_MALLOC_TYPEDEF(struct ExampleTable_entry);

       temp->next=NULL;

      

     /*set up a link list begin*/

       if(fp)

       {

  i=fscanf(fp,"%d %s %d %d",&temp->MachineNumber, temp->MachineStatus, &temp->CheckTime,&temp->MonSet);

  /*fscanf return reading var numbers .if EOF return -1.feof() dosen't work well*/

       while(i>0)

  {

              ExampleTable_createEntry(temp->MachineNumber,temp->MachineStatus,temp->CheckTime,temp->MonSet);

              i=fscanf(fp,"%d %s %d %d",&temp->MachineNumber, temp->MachineStatus, &temp->CheckTime,&temp->MonSet);

       }

SNMP_FREE(temp);

fclose(fp);/*set up a link list end*/

       }

       else

       {

              printf("Error:Can't open data.txt!\n");

              /*exit(1);*/

       }

}

 

 

static u_long long_ret;

/** returns the first data point within the ExampleTable table data.

 

    Set the my_loop_context variable to the first data point structure

    of your choice (from which you can find the next one).  This could

    be anything from the first node in a linked list, to an integer

    pointer containing the beginning of an array variable.

 

    Set the my_data_context variable to something to be returned to

    you later that will provide you with the data to return in a given

    row.  This could be the same pointer as what my_loop_context is

    set to, or something different.

 

    The put_index_data variable contains a list of snmp variable

    bindings, one for each index in your table.  Set the values of

    each appropriately according to the data matching the first row

    and return the put_index_data variable at the end of the function.

*/

netsnmp_variable_list *

ExampleTable_get_first_data_point(void **my_loop_context, void **my_data_context,

                          netsnmp_variable_list *put_index_data,

                          netsnmp_iterator_info *mydata)

{

    data_read();

    *my_loop_context = ExampleTable_head;

    *my_data_context = ExampleTable_head;

 

return ExampleTable_get_next_data_point(my_loop_context, my_data_context,

                                    put_index_data,  mydata );

}

 

/** functionally the same as ExampleTable_get_first_data_point, but

   my_loop_context has already been set to a previous value and should

   be updated to the next in the list.  For example, if it was a

   linked list, you might want to cast it to your local data type and

   then return my_loop_context->next.  The my_data_context pointer

   should be set to something you need later and the indexes in

   put_index_data updated again. */

netsnmp_variable_list *

ExampleTable_get_next_data_point(void **my_loop_context, void **my_data_context,

                         netsnmp_variable_list *put_index_data,

                         netsnmp_iterator_info *mydata)

{

       struct ExampleTable_entry *entry = (struct ExampleTable_entry *)*my_loop_context;

    netsnmp_variable_list *idx = put_index_data;

 

    if ( entry )

           {

        snmp_set_var_value( idx, (u_char *)&entry->MachineNumber, sizeof(entry->MachineNumber) );

        idx = idx->next_variable;

        *my_data_context = (void *)entry;

        *my_loop_context = (struct ExampleTable_entry *)entry->next;

           }

           else

                  {

        return NULL;

                  }

    return put_index_data;

      

}

 

/** Create a data_context for non-existent rows that SETs are performed on.

 *  return a void * pointer which will be passed to subsequent get_XXX

 *  and set_XXX functions for data retrival and modification during

 *  this SET request.

 *

 *  The indexes are encoded (in order) into the index_data pointer,

 *  and the column object which triggered the row creation is available

 *  via the column parameter, if it would be helpful to use that information.

 */

/*

void *

ExampleTable_create_data_context(netsnmp_variable_list *index_data) {

  

    return entry; /* XXX: you likely want to return a real pointer */

/*

}

*/

/** If the implemented set_* functions don't operate directly on the

   real-live data (which is actually recommended), then this function

   can be used to take a given my_data_context pointer and "commit" it

   to whereever the modified data needs to be put back to.  For

   example, if this was a routing table you could publish the modified

   routes back into the kernel at this point.

 

   new_or_del will be set to 1 if new, or -1 if it should be deleted

   or 0 if it is just a modification of an existing row.

 

   If you free the data yourself, make sure to *my_data_context = NULL */

int

ExampleTable_commit_row(void **my_data_context, int new_or_del)

{

    /** Add any necessary commit code here */

    /*  */

 

    /* return no errors.  And there shouldn't be any!!!  Ever!!!  You

    should have checked the values long before this. */

    return SNMP_ERR_NOERROR;

}

 

 

/* User-defined data access functions (per column) for data in table ExampleTable */

/*

 * NOTE:

 * - these get_ routines MUST return data that will not be freed (ie,

 *   use static variables or persistent data).  It will be copied, if

 *   needed, immediately after the get_ routine has been called.

 * - these SET routines must copy the incoming data and can not take

 *   ownership of the memory passed in by the val pointer.

 */

/** XXX: return a data pointer to the data for the MachineNumber column and set

         ret_len to its proper size in bytes. */

      long *get_MachineNumber(void *data_context, size_t *ret_len) {

          struct ExampleTable_entry *entry=(struct ExampleTable_entry *)data_context;

          long_ret=entry->MachineNumber;

          *ret_len=sizeof(long_ret);

        return &long_ret; /** XXX: replace this with a pointer to a real value */

      }

/** XXX: return a data pointer to the data for the MachineStatus column and set

         ret_len to its proper size in bytes. */

      char *get_MachineStatus(void *data_context, size_t *ret_len) {

        struct ExampleTable_entry *entry=(struct ExampleTable_entry *)data_context;

         

          *ret_len=strlen(entry->MachineStatus);

        return entry->MachineStatus; /** XXX: replace this with a pointer to a real value */

      }

/** XXX: return a data pointer to the data for the CheckTime column and set

         ret_len to its proper size in bytes. */

      u_long *get_CheckTime(void *data_context, size_t *ret_len) {

        struct ExampleTable_entry *entry=(struct ExampleTable_entry *)data_context;

          long_ret=entry->CheckTime;

          *ret_len=sizeof(long_ret);

        return &long_ret; /** XXX: replace this with a pointer to a real value */

      }

/** XXX: return a data pointer to the data for the MonSet column and set

         ret_len to its proper size in bytes. */

      long *get_MonSet(void *data_context, size_t *ret_len) {

        struct ExampleTable_entry *entry=(struct ExampleTable_entry *)data_context;

          long_ret=entry->MonSet;

          *ret_len=sizeof(long_ret);

        return &long_ret; /** XXX: replace this with a pointer to a real value */

      }

/** XXX: Set the value of the MonSet column and return

         SNMP_ERR_NOERROR on success

         SNMP_ERR_XXX     for SNMP deterministic error codes

         SNMP_ERR_GENERR  on generic failures (a last result response). */

      int set_MonSet(void *data_context, long *val, size_t val_len) {

                FILE *fp;

                struct ExampleTable_entry *temp=ExampleTable_head,*entry=data_context;

                 memcpy(&entry->MonSet, val, val_len);

                 fp=fopen("data.txt","w+");

                  if(!fp)

                     {DEBUGMSGTL(("set_MonSet","Open file failure\n"));           

                     return SNMP_ERR_NOACCESS;

                     }

           else

                 while(temp)

                 {

                        fprintf(fp,"\n%d %s %d %d",temp->MachineNumber,

                                             temp->MachineStatus,

                                                                  temp->CheckTime,

                                                                  temp->MonSet);

                        temp=temp->next;

                 }

          fclose(fp);

        return SNMP_ERR_NOERROR;  /** XXX: change if an error occurs */

      }

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:Codeforces Round #257 (Div. 2) 题解다음 기사:coretext2