SNMPTRAP.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:7k
源码类别:

操作系统开发

开发平台:

DOS

  1. /*
  2.  * SNMP Trap
  3.  * Copyright(c) 2000, Erick Engelke
  4.  *
  5.  */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <snmp.h>
  10. #include <rtos.h>
  11. #include <net.h>
  12. #define SNMP_TRAP_PORT 162
  13. // #define DEBUG
  14. #ifdef DEBUG
  15. #include <ctype.h>
  16. void dump(void *ptr, int len )
  17. {
  18.  unsigned char *p = ptr;
  19.  int x, y, xy;
  20.  char ch;
  21.          FILE *outfile;
  22.          outfile = fopen("dump", "a+t" );
  23.  fprintf(outfile,"n%u (0x%04x) bytesn", len, len );
  24.  for ( y = 0 ; y < len ; y+= 16 ) {
  25.   fprintf(outfile,"n%04x : ", y  );
  26.   for ( x = 0 ; x < 16 ; ++x ) {
  27. xy = x + y;
  28. fprintf(outfile, xy < len ? "%02x " : "   ", p[xy] );
  29.   }
  30.   fprintf(outfile," : ");
  31.   for ( x = 0 ; x < 16 ; ++x ) {
  32. xy = x + y;
  33. ch = p[ xy ];
  34. if ( ! isprint( ch )) ch = '*';
  35. fprintf(outfile, xy < len ? "%c" : "  ", ch );
  36.   }
  37.  }
  38.  fprintf(outfile,"n");
  39.          fclose(outfile);
  40. }
  41. #endif
  42. void ascii2id( char *p, SNMP_OBJECT *lp )
  43. {
  44.     char *t;
  45.     int i = 0;
  46.     char *s, *sstart;
  47.     s = sstart = kcalloc( strlen( p ) + 1, 1 );
  48.     strcpy( s, p );
  49.     do {
  50.         if (( t = strchr( s , '.' )) != NULL ) *t = 0;
  51.         lp->Id[ i ] = atol( s );
  52.         if ( t != NULL ) *t = '.';  // repair it
  53.         s = t + 1;
  54.         i++;
  55.     } while ( t );
  56.     lp->IdLen = i;
  57.     kfree( sstart );
  58. }
  59. static void copy_newoid( SNMP_OBJECT *dest, esnmp_oid *src )
  60. {
  61.     int i;
  62.     for ( i = 0 ; i < src->oidlen; ++i )
  63.         dest->Id[i] = src->oid[i];
  64.     dest->IdLen = src->oidlen;
  65. }
  66. int snmp_trap( DWORD remote_ip, char *community, char *entOID, char *OID, DWORD agent,
  67.         int genTrapType, int specTrapType, int valueType, void *value, int valueLen )
  68. {
  69.     return snmp_traps( remote_ip, community, entOID,
  70.         1, &OID, agent, genTrapType, specTrapType, &valueType, &value, &valueLen );
  71. }
  72. /* Multiple traps in one */
  73. int snmp_traps( DWORD remote_ip, char *community, char *entOID,
  74.         int count, char **OID, DWORD agent,
  75.         int genTrapType, int specTrapType, int *valueType, void **value, int *valueLen )
  76. {
  77.     SNMP_PDU           *pdu;
  78.     SNMP_OBJECT        *list;
  79.     BYTE               *buff;
  80.     int                 i;
  81.     BYTE                *buffptr;
  82.     unsigned            encodedLength;
  83.     udp_Socket *s;
  84. #define SNMP_BUF_SIZE 2048
  85. #define MAXOIDS 25
  86.     if ( count >= MAXOIDS ) return( 1 );        // out of memory
  87.     pdu = kcalloc( sizeof( SNMP_PDU ), MAXOIDS );
  88.     list = kcalloc( sizeof( SNMP_OBJECT ), MAXOIDS );
  89.     buff = kcalloc( SNMP_BUF_SIZE, 1 );
  90.     s = kcalloc( sizeof( udp_Socket ), 1 );
  91.     if ((s==NULL)||(buff==NULL)||(pdu==NULL)||(list==NULL)) {
  92.         if ( s ) kfree( s );
  93.         if ( buff ) kfree( buff );
  94.         if ( list ) kfree( list );
  95.         if ( pdu )  kfree( pdu );
  96.         return( 1 );
  97.     }
  98.     buffptr = &buff[0];
  99.     /* build the reply packet */
  100.     pdu->Trap.Type = SNMP_PDU_TRAP;
  101.     for(i = 0; i < SNMP_SIZE_BUFINT; ++i) {  // pack the rest with -1
  102.         pdu->Trap.Id[i] = -1;
  103.     }
  104.     ascii2id( (entOID==NULL)? "0.0" : entOID, &pdu->Trap );
  105.     if ( agent != 0 )
  106.         pdu->Trap.IpAddress = intel( agent );
  107.     else
  108.         pdu->Trap.IpAddress = intel( my_ip_addr );           // my hostAddr
  109.     pdu->Trap.General = genTrapType;     // (0-5) -> defined trap; 6 -> enterprise specific
  110.     pdu->Trap.Specific = specTrapType;   // 0 unless above is 6
  111.     pdu->Trap.Time = kupticks / 18L;
  112.     // build the response
  113.     memset( buff, -1, SNMP_BUF_SIZE );
  114.     encodedLength = SNMP_BUF_SIZE;  // default buffer size
  115.     for ( i = 0 ; i < count ; ++i ) {
  116.         if ( OID == NULL )
  117.             ascii2id( "1.3.6.1.2.1.1.0", &list[i] );
  118.         else
  119.             ascii2id( OID[i], &list[i] );
  120.         list[i].Type = valueType[i]; // eg. SNMP_OCTETSTR;
  121.         memcpy( list[i].Syntax.BufChr, value[i], valueLen[i] );
  122.         list[i].SyntaxLen = valueLen[i];
  123.     }
  124.     i = SnmpEnc( &buffptr, &encodedLength, pdu, community, strlen(community), list, count ); // encode it for transport
  125.     // write it out to the network
  126.     udp_open( s, 0, remote_ip, SNMP_TRAP_PORT, NULL );
  127.     tcp_tick(NULL );
  128. #ifdef DEBUG
  129.  dump( buffptr, encodedLength );
  130. #endif
  131.     sock_write( s, buffptr, encodedLength );
  132.     sock_close( s );
  133.     kfree( s );
  134.     kfree( buff );
  135.     kfree( list );
  136.     kfree( pdu );
  137.     return 0;
  138. }
  139. #ifdef NEVER
  140. int snmp_trap( DWORD remote_ip, char *community, char *OID, DWORD agent,
  141.         int genTrapType, int specTrapType, int valueType, void *value, int valueLen )
  142. {
  143.     SNMP_PDU           *pdu;
  144.     SNMP_OBJECT        *list;
  145.     BYTE               *buff;
  146.     BYTE                *buffptr;
  147.     unsigned            encodedLength;
  148.     int i;
  149.     udp_Socket *s;
  150.     pdu = kcalloc( sizeof( SNMP_PDU ), 1 );
  151.     list = kcalloc( sizeof( SNMP_OBJECT ), 1 );
  152.     buff = kcalloc( 2048, 1 );
  153.     s = kcalloc( sizeof( udp_Socket ), 1 );
  154.     if ((s==NULL)||(buff==NULL)||(pdu==NULL)||(list==NULL)) {
  155.         if ( s ) kfree( s );
  156.         if ( buff ) kfree( buff );
  157.         if ( list ) kfree( list );
  158.         if ( pdu )  kfree( pdu );
  159.         return( 1 );
  160.     }
  161.     buffptr = &buff[0];
  162.     /* build the reply packet */
  163.     pdu->Trap.Type = SNMP_PDU_TRAP;
  164.     for(i = 0; i < SNMP_SIZE_BUFINT; ++i) {  // pack the rest with -1
  165.         pdu->Trap.Id[i] = -1;
  166.     }
  167.     ascii2id( "5.6.7.8.9", &pdu->Trap );
  168.     if ( agent != 0 )
  169.         pdu->Trap.IpAddress = intel( agent );
  170.     else
  171.         pdu->Trap.IpAddress = intel( my_ip_addr );           // my hostAddr
  172.     pdu->Trap.General = genTrapType;     // (0-5) -> defined trap; 6 -> enterprise specific
  173.     pdu->Trap.Specific = specTrapType;   // 0 unless above is 6
  174.     pdu->Trap.Time = kupticks / 18L;
  175.     // build the response
  176.     ascii2id( "1.3.6.1.2.1.1.0", &list[0] );
  177.     list[0].Type = valueType; // eg. SNMP_OCTETSTR;
  178.     memcpy( list[0].Syntax.BufChr, value, valueLen );
  179. // eg. like strcpy( (char *)list[0].Syntax.BufChr, "foo" );
  180.     list[0].SyntaxLen = valueLen; // strlen( (const char *)list[0].Syntax.BufChr );
  181.     encodedLength = 2048;                                               // default buffer size
  182. //    for(i = 0; i<2048; ++i)  buff[i]=-1;
  183.     memset( buff, -1, 2048 );
  184.     i = SnmpEnc( &buffptr, &encodedLength, pdu, community, strlen(community), list, 1 );      // encode it for transport
  185.     // write it out to the network
  186.     udp_open( s, 0, remote_ip, SNMP_TRAP_PORT, NULL );
  187.     tcp_tick(NULL );
  188. #ifdef DEBUG
  189.     dump( buffptr, encodedLength );
  190. #endif // DEBUG
  191.     sock_write( s, buffptr, encodedLength );
  192.     sock_close( s );
  193.     kfree( s );
  194.     kfree( buff );
  195.     kfree( list );
  196.     kfree( pdu );
  197.     return 0;
  198. }
  199. #endif NEVER