home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 29 Fixes_o / 29-Fixes_o.zip / tcpcsd2.zip / BASECSD2.EXE / SAMPLES / SNMPSAMP / DPISAMPL.C1 < prev    next >
Text File  |  1992-11-27  |  47KB  |  1,247 lines

  1. /*********************************************************************/
  2. /*                                                                   */
  3. /* SNMP-DPI - SNMP Distributed Programming Interface                 */
  4. /*                                                                   */
  5. /*   May 1991 - Version 1.0  - SNMP-DPI Version 1.0 (RFC1228)        */
  6. /*                             Created by IBM Research.              */
  7. /*   Feb 1992 - Version 1.1  - Allow enterpriseID to be passed with  */
  8. /*                             a (enterprise specific) trap          */
  9. /*                           - allow multiple variables to be passed */
  10. /*                           - Use 4 octets (INTEGER from RFC1157)   */
  11. /*                             for generic and specific type.        */
  12. /*   Jun 1992                - Make it run on OS/2 as well           */
  13. /*                                                                   */
  14. /* Copyright None                                                    */
  15. /*                                                                   */
  16. /* dpisample.c  - a sample SNMP-DPI subagent                         */
  17. /*              - can be used to test agent DPI implementations.     */
  18. /*                                                                   */
  19. /*  For testing with XGMON and/or SQESERV (SNMP Query Engine)        */
  20. /*  it is best to keep the following define for OID in sync          */
  21. /*  with the spiSample objectID in the MIB description file          */
  22. /*  (mib_desc for XGMON, MIB_DESC DATA for SQESERV on VM and         */
  23. /*   MIB@DESC.DATA for SQESERV on MVS).                              */
  24. /*                                                                   */
  25. /*  See dpisample README file for more info.                         */
  26. /*                                                                   */
  27. /*********************************************************************/
  28.  
  29. #define OID                      "1.3.6.1.4.1.2.2.1.4."
  30. #define ENTERPRISE_OID           "1.3.6.1.4.1.2.2.1.4"  /* dpiSample */
  31. #define ifIndex                  "1.3.6.1.2.1.2.2.1.1.0"
  32. #define egpNeighAddr             "1.3.6.1.2.8.5.1.2.0"
  33. #define PUBLIC_COMMUNITY_NAME    "public"
  34.  
  35. #if defined(VM) || defined(MVS)
  36.  
  37. #define SNMPAGENTUSERID          "SNMPD"
  38. #define SNMPIUCVNAME             "SNMP_DPI"
  39. #pragma csect(CODE,  "$DPISAMP")
  40. #pragma csect(STATIC,"#DPISAMP")
  41. #include <manifest.h>            /* VM specific things */
  42. #include "snmpnms.h"             /* short external names for VM/MVS */
  43. #include "snmp_vm.h"             /* more of those short names */
  44. #include <saiucv.h>
  45. #include <bsdtime.h>
  46. #include <bsdtypes.h>
  47. #include <socket.h>
  48. #include <in.h>
  49. #include <netdb.h>
  50. #include <inet.h>
  51. extern char   ebcdicto[], asciitoe[];
  52. #pragma linkage(cmxlate,OS)
  53. #define DO_ETOA(a) cmxlate((a),ebcdictoascii,strlen((a)))
  54. #define DO_ATOE(a) cmxlate((a),asciitoebcdic,strlen((a)))
  55. #define DO_ERROR(a) tcperror((a))
  56. #define LOOPBACK "loopback"
  57. #define IUCV TRUE
  58. #define max(a,b) (((a) > (b)) ? (a) : (b))
  59. #define min(a,b) (((a) < (b)) ? (a) : (b))
  60.  
  61. #else  /* we are not on VM or MVS */
  62.  
  63. #ifdef OS2
  64. #include <stdlib.h>
  65. #include <types.h>
  66. #include <doscalls.h>
  67. #ifndef sleep
  68. #define sleep(a) DOSSLEEP(1000 * (a))
  69. #endif
  70. #define close soclose
  71. /*char * malloc(); */
  72. /*unsigned long strtoul(); */
  73. #endif
  74.  
  75. #include <sys/time.h>
  76. #include <sys/types.h>
  77. #include <sys/socket.h>
  78. #include <netinet/in.h>
  79. #include <netdb.h>
  80. // #include <arpa/inet.h>
  81. #define DO_ETOA(a) ;          /* no need for this */
  82. #define DO_ATOE(a) ;          /* no need for this */
  83. #define DO_ERROR(a) perror((a))
  84. #define LOOPBACK "localhost"
  85. #define IUCV FALSE
  86. #ifdef AIX221
  87. #define isdigit(c) (((c) >= '0') && ((c) <= '9'))
  88. #else
  89. // #include <sys/select.h>
  90. #endif /* AIX221 */
  91.  
  92. #endif /* defined(VM) || defined(MVS) */
  93.  
  94. #include <stdio.h>
  95. #ifdef OS2
  96. #include <dpi/snmp_dpi.h>
  97. #else
  98. #include "snmp_dpi.h"
  99. #endif
  100.  
  101. #define WAIT_FOR_AGENT 3   /* time to wait before closing agent fd */
  102.  
  103. #ifndef TRUE
  104. #define TRUE 1
  105. #define FALSE 0
  106. #endif
  107.  
  108. #ifdef _NO_PROTO                             /* for classic K&R C */
  109. static void check_arguments();
  110. static void send_packet();
  111. static void print_val();
  112. static void usage();
  113. static void init_connection();
  114. static void init_variables();
  115. static void await_and_read_packet();
  116. static void handle_packet();
  117. static void do_get();
  118. static void do_set();
  119. static void issue_traps();
  120. static void issue_one_trap();
  121. static void issue_one_trape();
  122. static void issue_std_traps();
  123. static void issue_ent_traps();
  124. static void issue_ent_trapse();
  125. static void do_register();
  126. static void dump_bfr();
  127. static struct dpi_set_packet *addtoset();
  128. extern unsigned long lookup_host();
  129.  
  130. #else  /* _NO_PROTO */                       /* for ANSI-C compiler */
  131.  
  132. static void check_arguments(const int argc, char *argv[]);
  133. static void send_packet(const char * packet);
  134. static void print_val(const int index);
  135. static void usage(const char *progname, const int exit_rc);
  136. static void init_connection(void);
  137. static void init_variables(void);
  138. static void await_and_read_packet(void);
  139. static void handle_packet(void);
  140. static void do_get(void);
  141. static void do_set(void);
  142. static void issue_traps(void);
  143. static void issue_one_trap(void);
  144. static void issue_one_trape(void);
  145. static void issue_std_traps(void);
  146. static void issue_ent_traps(void);
  147. static void issue_ent_trapse(void);
  148. static void do_register(void);
  149. static void dump_bfr(const char *buf, const int len);
  150. static struct dpi_set_packet *addtoset(struct dpi_set_packet *data,
  151.                                        int stype);
  152. extern unsigned long lookup_host(const char *hostname);
  153.  
  154. #endif /* _NO_PROTO */
  155.  
  156. #define OSTRING              "hex01-04:"
  157. #define DSTRING              "Initial Display String"
  158. #define COMMAND              "None"
  159. #define BUFSIZE               4096
  160. #define TIMEOUT               3
  161. #define PACKET_LEN(packet)   (((unsigned char)*(packet)) * 256 + \
  162.                               ((unsigned char)*((packet) + 1)) + 2)
  163.  
  164. /* We have the following instances for OID.x variables */
  165.                                       /* 0 - table */
  166. static          long number      = 0; /* 1 - a number */
  167. static unsigned char *ostring    = 0; /* 2 - octet string */
  168. static          int  ostring_len = 0; /*     and its length */
  169. static unsigned char *objectID   = 0; /* 3 - objectID */
  170. static          int  objectID_len= 0; /*     and its length */
  171.                                       /* 4 - some empty variable */
  172. static unsigned long ipaddr      = 0; /* 5 - ipaddress */
  173. static unsigned long counter     = 1; /* 6 - a counter */
  174. static unsigned long gauge       = 1; /* 7 - a gauge */
  175. static unsigned long ticks       = 1; /* 8 - time ticks */
  176. static unsigned char *dstring    = 0; /* 9 - display string */
  177. static unsigned char *command    = 0; /* 10 - command */
  178.  
  179. static char *DPI_var[] = {
  180.    "dpiSample",
  181.    "dpiSampleNumber",
  182.    "dpiSampleOctetString",
  183.    "dpiSampleObjectID",
  184.    "dpiSampleEmpty",
  185.    "dpiSampleInetAddress",
  186.    "dpiSampleCounter",
  187.    "dpiSampleGauge",
  188.    "dpiSampleTimeTicks",
  189.    "dpiSampleDisplayString",
  190.    "dpiSampleCommand"
  191. };
  192.  
  193. static short int valid_types[] = { /* SNMP_TYPEs accepted on SET */
  194.         -1,                        /* 0 do not check type */
  195.         SNMP_TYPE_NUMBER,          /* 1 number */
  196.         SNMP_TYPE_STRING,          /* 2 octet string */
  197.         SNMP_TYPE_OBJECT,          /* 3 object identifier */
  198.         -1, /* SNMP_TYPE_EMPTY */  /* 4 do not check type */
  199.         SNMP_TYPE_INTERNET,        /* 5 internet address */
  200.         SNMP_TYPE_COUNTER,         /* 6 counter */
  201.         SNMP_TYPE_GAUGE,           /* 7 gauge */
  202.         SNMP_TYPE_TICKS,           /* 8 time ticks */
  203.         SNMP_TYPE_STRING,          /* 9 display string */
  204.         SNMP_TYPE_STRING           /* 10 command (display string) */
  205. #define OID_COUNT_FOR_TRAPS   9
  206. #define OID_COUNT             10
  207. };
  208.  
  209. static char         *packet = NULL;   /* ptr to send packet. */
  210. static char          inbuf[BUFSIZE];  /* buffer for receive packets */
  211. static int           dpi_fd;          /* fd for socket to DPI agent */
  212. static short int     dpi_port;        /* DPI_port at agent */
  213. static unsigned long dpi_ipaddress;   /* IP address of DPI agent */
  214. static char         *dpi_hostname;    /* hostname of DPI agent */
  215. static char         *dpi_userid;      /* userid of DPI agent VM/MVS */
  216. static char         *var_gid;         /* groupID received */
  217. static char         *var_oid;         /* objectID received */
  218. static int           var_index;       /* OID variable index */
  219. static unsigned char var_type;        /* SET value type */
  220. static char         *var_value;       /* SET value */
  221. static short int     var_value_len;   /* SET value length */
  222. static int           debug_lvl = 0;   /* current debug level */
  223. static int           use_iucv = IUCV; /* optional use of AF_IUCV */
  224. static int           do_quit  = FALSE;/* Quit in await loop */
  225. static int           trap_gtype = 0;  /* trap generic type */
  226. static int           trap_stype = 0;  /* trap specific type */
  227. static char         *trap_data = NULL;/* trap data */
  228. static int           do_trap  = 0;    /* switch for traps  */
  229. #define ONE_TRAP        1
  230. #define ONE_TRAPE       2
  231. #define STD_TRAPS       3
  232. #define ENT_TRAPS       4
  233. #define ENT_TRAPSE      5
  234. #define ALL_TRAPS       6
  235. #define MAX_TRAPE_DATA 10             /* data for extended trap */
  236. static long   trape_gtype = 6;        /* trap generic type */
  237. static long   trape_stype = 11;       /* trap specific type */
  238. static char  *trape_eprise = NULL;    /* enterprise id */
  239. static char  *trape_data[MAX_TRAPE_DATA]; /* pointers to data values */
  240. static int    trape_datacnt;          /* actual number of values */
  241.  
  242. #ifdef _NO_PROTO                      /* for classic K&R C */
  243. main(argc, argv)                      /* main line */
  244. int   argc;
  245. char *argv[];
  246. #else  /* _NO_PROTO */                /* for ANSI-C compiler */
  247. main(const int argc, char *argv[])    /* main line */
  248. #endif /* _NO_PROTO */
  249. {
  250.    check_arguments(argc, argv);       /* check callers arguments */
  251.    dpi_ipaddress = lookup_host(dpi_hostname); /* get ip address */
  252.    init_connection();                 /* connect to specified agent */
  253.    init_variables();                  /* initialize our variables */
  254.    if (do_trap) {                     /* we just need to do traps */
  255.       issue_traps();                  /* issue the trap(s) */
  256.       sleep(WAIT_FOR_AGENT);          /* sleep a bit, so agent can */
  257.       close(dpi_fd);                  /* read data before we close */
  258.       exit(0);                        /* and that's it */
  259.    }                                  /* end if (do_trap) */
  260.    do_register();                     /* register our objectIDs */
  261.    printf("%s ready and awaiting queries from agent\n",argv[0]);
  262.    while (do_quit == FALSE) {         /* forever until quit or error */
  263.       await_and_read_packet();        /* wait for next packet */
  264.       handle_packet();                /* handle it */
  265.       if (do_trap) issue_traps();     /* request to issue traps */
  266.    }                                  /* while loop */
  267.    sleep(WAIT_FOR_AGENT);             /* allow agent to read response */
  268.    printf("Quitting, %s set to: quit\n",DPI_var[10]);
  269.    exit(2);                           /* sampleDisplayString == quit */
  270. }
  271.  
  272. #ifdef _NO_PROTO                      /* for classic K&R C */
  273. static void issue_traps()
  274. #else  /* _NO_PROTO */                /* for ANSI-C compiler */
  275. static void issue_traps(void)
  276. #endif /* _NO_PROTO */
  277. {
  278.    switch (do_trap) {              /* let's see which one(s) */
  279.    case ONE_TRAP:                  /* only need to issue one trap */
  280.      issue_one_trap();             /* go issue the one trap */
  281.      break;
  282.    case ONE_TRAPE:                 /* only need to issue one trape */
  283.      issue_one_trape();            /* go issue the one trape */
  284.      break;
  285.    case STD_TRAPS:                 /* only need to issue std traps */
  286.      issue_std_traps();            /* standard traps gtypes 0-5 */
  287.      break;
  288.    case ENT_TRAPS:                 /* only need to issue ent traps */
  289.      issue_ent_traps();            /* enterprise specific traps */
  290.      break;
  291.    case ENT_TRAPSE:                /* only need to issue ent trapse */
  292.      issue_ent_trapse();           /* enterprise specific trapse */
  293.      break;
  294.    case ALL_TRAPS:                 /* only need to issue std traps */
  295.      issue_std_traps();            /* standard traps gtypes 0-5 */
  296.      issue_ent_traps();            /* enterprise specific traps */
  297.      issue_ent_trapse();           /* enterprise specific trapse */
  298.      break;
  299.    default:
  300.      break;
  301.    }                               /* end switch (do_trap) */
  302.    do_trap = 0;                    /* reset do_trap switch */
  303. }
  304.  
  305. #ifdef _NO_PROTO                             /* for classic K&R C */
  306. static void await_and_read_packet()    /* await packet from DPI agent */
  307. #else  /* _NO_PROTO */                       /* for ANSI-C compiler */
  308. static void await_and_read_packet(void)/* await packet from DPI agent */
  309. #endif /* _NO_PROTO */
  310. {
  311.    int len, rc, bytes_to_read, bytes_read = 0;
  312. #ifdef OS2
  313.    int socks[5];
  314. #else
  315.    fd_set read_mask;
  316. #endif
  317.    struct timeval timeout;
  318.  
  319. #ifdef OS2
  320.    socks[0] = dpi_fd;
  321.    rc = select(socks, 1, 0, 0, -1L);
  322. #else
  323.    FD_ZERO(&read_mask);
  324.    FD_SET(dpi_fd, &read_mask);                    /* wait for data */
  325.    rc = select(dpi_fd+1, &read_mask, NULL, NULL, NULL);
  326. #endif
  327.    if (rc != 1) {                                 /* exit on error */
  328.       DO_ERROR("await_and_read_packet:  select");
  329.       close(dpi_fd);
  330.       exit(1);
  331.    }
  332. #ifdef OS2
  333.    len = recv(dpi_fd, inbuf, 2, 0);           /* read 2 bytes first */
  334. #else
  335.    len = read(dpi_fd, inbuf, 2);              /* read 2 bytes first */
  336. #endif
  337.    if (len <= 0) {                            /* exit on error or EOF */
  338.       if (len < 0) DO_ERROR("await_and_read_packet:  read");
  339.       else printf("Quitting, EOF received from DPI-agent\n");
  340.       close(dpi_fd);
  341.       exit(1);
  342.    }
  343.    bytes_to_read = (inbuf[0] << 8) + inbuf[1]; /* bytes to follow */
  344.    if (BUFSIZE < (bytes_to_read + 2)) {        /* exit if too much */
  345.       printf("Quitting, packet larger than %d byte buffer\n",BUFSIZE);
  346.       close(dpi_fd);
  347.       exit(1);
  348.    }
  349.    while (bytes_to_read > 0) {                /* while bytes to read */
  350. #ifdef OS2
  351.       socks[0] = dpi_fd;
  352.       len = select(socks, 1, 0, 0, 3000L);
  353. #else
  354.       timeout.tv_sec  = 3;                    /* wait max 3 seconds */
  355.       timeout.tv_usec = 0;
  356.       FD_SET(dpi_fd, &read_mask);             /* check for data */
  357.       len = select(dpi_fd+1, &read_mask, NULL, NULL, &timeout);
  358. #endif
  359.       if (len == 1) {                         /* select returned OK */
  360. #ifdef OS2
  361.          len = recv(dpi_fd, &inbuf[2] + bytes_read, bytes_to_read, 0);
  362. #else
  363.          len = read(dpi_fd, &inbuf[2] + bytes_read, bytes_to_read);
  364. #endif
  365.       } /* end if (len == 1) */
  366.       if (len <= 0) {                         /* exit on error or EOF */
  367.          if (len < 0) DO_ERROR("await_and_read_packet:  read");
  368.          printf("Can't read remainder of packet\n");
  369.          close(dpi_fd);
  370.          exit(1);
  371.       } else {                                /* count bytes_read */
  372.          bytes_read    += len;
  373.          bytes_to_read -= len;
  374.       }
  375.    }  /* while (bytes_to_read > 0) */
  376. }
  377.  
  378. #ifdef _NO_PROTO                             /* for classic K&R C */
  379. static void handle_packet()     /* handle DPI packet from agent */
  380. #else  /* _NO_PROTO */                       /* for ANSI-C compiler */
  381. static void handle_packet(void) /* handle DPI packet from agent */
  382. #endif /* _NO_PROTO */
  383. {
  384.    struct   snmp_dpi_hdr   *hdr;
  385.  
  386.    if (debug_lvl > 2) {
  387.       printf("Received following SNMP-DPI packet:\n");
  388.       dump_bfr(inbuf, PACKET_LEN(inbuf));
  389.    }
  390.    hdr = pDPIpacket(inbuf);                /* parse received packet */
  391.    if (hdr == 0) {                         /* ignore if can't parse */
  392.       printf("Ignore received packet, could not parse it!\n");
  393.       return;
  394.    }
  395.    packet   = NULL;
  396.    var_type = 0;
  397.    var_oid  = "";
  398.    var_gid  = "";
  399.    switch (hdr->packet_type) {
  400.      /* extract pointers and/or data from specific packet types, */
  401.      /* such that we can use them independent of packet type. */
  402.      case SNMP_DPI_GET:
  403.        if (debug_lvl > 0) printf("SNMP_DPI_GET for ");
  404.        var_oid       = hdr->packet_body.dpi_get->object_id;
  405.        break;
  406.      case SNMP_DPI_GET_NEXT:
  407.        if (debug_lvl > 0) printf("SNMP_DPI_GET_NEXT for ");
  408.        var_oid       = hdr->packet_body.dpi_next->object_id;
  409.        var_gid       = hdr->packet_body.dpi_next->group_id;
  410.        break;
  411.      case SNMP_DPI_SET:
  412.        if (debug_lvl > 0) printf("SNMP_DPI_SET for ");
  413.        var_value_len = hdr->packet_body.dpi_set->value_len;
  414.        var_value     = hdr->packet_body.dpi_set->value;
  415.        var_oid       = hdr->packet_body.dpi_set->object_id;
  416.        var_type      = hdr->packet_body.dpi_set->type;
  417.        break;
  418.      default:   /* Return a GEN_ERROR */
  419.        if (debug_lvl > 0) printf("Unexpected packet_type %d, genErr\n",
  420.                                   hdr->packet_type);
  421.        packet = mkDPIresponse(SNMP_GEN_ERR, NULL);
  422.        fDPIparse(hdr); /* return storage allocated by pDPIpacket() */
  423.        send_packet(packet);
  424.        return;
  425.        break;
  426.    } /* end switch(hdr->packet_type) */
  427.    if (debug_lvl > 0) printf("objectID: %s \n",var_oid);
  428.  
  429.    if (strlen(var_oid) <= strlen(OID)) { /* not in our tree */
  430.       if (hdr->packet_type == SNMP_DPI_GET_NEXT) var_index = 0; /* OK */
  431.       else { /* cannot handle */
  432.          if (debug_lvl>0) printf("...Ignored %s, noSuchName\n",var_oid);
  433.          packet = mkDPIresponse(SNMP_NO_SUCH_NAME, NULL);
  434.          fDPIparse(hdr); /* return storage allocated by pDPIpacket() */
  435.          send_packet(packet);
  436.          return;
  437.       }
  438.    } else {  /* Extract our variable index (from OID.index.instance) */
  439.       /* We handle any instance the same (we only have one instance) */
  440.       var_index = atoi(&var_oid[strlen(OID)]);
  441.    }
  442.    if (debug_lvl > 1) {
  443.       printf("...The groupID=%s\n",var_gid);
  444.       printf("...Handle as if objectID=%s%d\n",OID,var_index);
  445.    }
  446.    switch (hdr->packet_type) {
  447.      case SNMP_DPI_GET:
  448.        do_get();               /* do a get to return response */
  449.        break;
  450.      case SNMP_DPI_GET_NEXT:
  451.      { char toid[256];         /* space for temporary objectID */
  452.        var_index++;            /* do a get for the next variable */
  453.        sprintf(toid,"%s%d",OID,var_index); /* construct objectID */
  454.        var_oid = toid;         /* point to it */
  455.        do_get();               /* do a get to return response */
  456.      } break;
  457.      case SNMP_DPI_SET:
  458.        if (debug_lvl > 1) printf("...value_type=%d\n",var_type);
  459.        do_set();               /* set new value first */
  460.        if (packet) break;      /* some error response was generated */
  461.        do_get();               /* do a get to return response */
  462.        break;
  463.    }
  464.    fDPIparse(hdr);     /* return storage allocated by pDPIpacket() */
  465. }
  466.  
  467. #ifdef _NO_PROTO                             /* for classic K&R C */
  468. static void do_get()       /* handle SNMP_GET request */
  469. #else  /* _NO_PROTO */                       /* for ANSI-C compiler */
  470. static void do_get(void)   /* handle SNMP_GET request */
  471. #endif /* _NO_PROTO */
  472. {
  473.    struct dpi_set_packet *data = NULL;
  474.  
  475.    switch (var_index) {
  476.     case 0: /* table, cannot be queried by itself */
  477.      printf("...Should not issue GET for table %s.0\n", OID);
  478.      break;
  479.     case 1:  /* a number */
  480.      data = mkDPIset(var_oid,SNMP_TYPE_NUMBER,sizeof(number),&number);
  481.      break;
  482.     case 2:  /* an octet_string (can have binary data) */
  483.      data = mkDPIset(var_oid,SNMP_TYPE_STRING,ostring_len,ostring);
  484.      break;
  485.     case 3: /* object id */
  486.      data = mkDPIset(var_oid,SNMP_TYPE_OBJECT,objectID_len,objectID);
  487.      break;
  488.     case 4: /* some empty variable */
  489.      data = mkDPIset(var_oid,SNMP_TYPE_EMPTY,0,NULL);
  490.      break;
  491.     case 5: /* internet address */
  492.      data = mkDPIset(var_oid,SNMP_TYPE_INTERNET,sizeof(ipaddr),&ipaddr);
  493.      break;
  494.     case 6: /* counter (unsigned) */
  495.      data =mkDPIset(var_oid,SNMP_TYPE_COUNTER,sizeof(counter),&counter);
  496.      break;
  497.     case 7: /* gauge (unsigned) */
  498.      data = mkDPIset(var_oid,SNMP_TYPE_GAUGE,sizeof(gauge),&gauge);
  499.      break;
  500.     case 8: /* time ticks (unsigned) */
  501.      data = mkDPIset(var_oid,SNMP_TYPE_TICKS,sizeof(ticks),&ticks);
  502.      break;
  503.     case 9:  /* a display_string (printable ascii only) */
  504.      DO_ETOA(dstring);
  505.      data = mkDPIset(var_oid,SNMP_TYPE_STRING,strlen(dstring),dstring);
  506.      DO_ATOE(dstring);
  507.      break;
  508.     case 10:  /* a command request (command is a display string) */
  509.      DO_ETOA(command);
  510.      data = mkDPIset(var_oid,SNMP_TYPE_STRING,strlen(command),command);
  511.      DO_ATOE(command);
  512.      break;
  513.     default: /* Return a NoSuchName */
  514.      if (debug_lvl > 1)
  515.         printf("...GET[NEXT] for %s, not found\n", var_oid);
  516.      break;
  517.    } /* end switch (var_index) */
  518.  
  519.    if (data) {
  520.       if (debug_lvl > 0) {
  521.          printf("...Sending response oid: %s type: %d\n",
  522.                 var_oid, data->type);
  523.          printf("......Current value: ");
  524.          print_val(var_index); /* prints \n at end */
  525.       }
  526.       packet = mkDPIresponse(SNMP_NO_ERROR,data);
  527.    } else { /* Could have been an error in mkDPIset though */
  528.       if (debug_lvl > 0) printf("...Sending response noSuchName\n");
  529.       packet = mkDPIresponse(SNMP_NO_SUCH_NAME,NULL);
  530.    } /* end if (data) */
  531.    if (packet) send_packet(packet);
  532. }
  533.  
  534. #ifdef _NO_PROTO                             /* for classic K&R C */
  535. static void do_set()      /* handle SNMP_SET request */
  536. #else  /* _NO_PROTO */                       /* for ANSI-C compiler */
  537. static void do_set(void)  /* handle SNMP_SET request */
  538. #endif /* _NO_PROTO */
  539. {
  540.    unsigned long *ulp;
  541.             long *lp;
  542.  
  543.   if (valid_types[var_index] != var_type &&
  544.       valid_types[var_index] != -1) {
  545.       printf("...Ignored set request with type %d, expect type %d,",
  546.              var_type, valid_types[var_index]);
  547.       printf(" Returning badValue\n");
  548.       packet = mkDPIresponse(SNMP_BAD_VALUE, NULL);
  549.       if (packet) send_packet(packet);
  550.       return;
  551.    }
  552.    switch (var_index) {
  553.     case 0: /* table, cannot set table. */
  554.      if (debug_lvl > 0) printf("...Ignored set TABLE, noSuchName\n");
  555.      packet = mkDPIresponse(SNMP_NO_SUCH_NAME,NULL);
  556.      break;
  557.     case 1:  /* a number */
  558.      lp      = (long *)var_value;
  559.      number  = *lp;
  560.      break;
  561.     case 2:  /* an octet_string (can have binary data) */
  562.      free(ostring);
  563.      ostring = (char *)malloc(var_value_len + 1);
  564.      bcopy(var_value, ostring, var_value_len);
  565.      ostring_len = var_value_len;
  566.      ostring[var_value_len] = '\0'; /* so we can use it as a string */
  567.      break;
  568.     case 3: /* object id */
  569.      free(objectID);
  570.      objectID   = (char *)malloc(var_value_len + 1);
  571.      bcopy(var_value, objectID, var_value_len);
  572.      objectID_len = var_value_len;
  573.      if (objectID[objectID_len -1]) {
  574.         objectID[objectID_len++] = '\0'; /* a valid one needs a null */
  575.         if (debug_lvl > 0)
  576.            printf("...added a terminating null to objectID\n");
  577.      }
  578.      break;
  579.     case 4: /* an empty variable, cannot set */
  580.      if (debug_lvl > 0) printf("...Ignored set EMPTY, readOnly\n");
  581.      packet = mkDPIresponse(SNMP_READ_ONLY,NULL);
  582.      break;
  583.     case 5: /* Internet address */
  584.      ulp     = (unsigned long *)var_value;
  585.      ipaddr  = *ulp;
  586.      break;
  587.     case 6: /* counter (unsigned) */
  588.      ulp     = (unsigned long *)var_value;
  589.      counter = *ulp;
  590.      break;
  591.     case 7: /* gauge (unsigned) */
  592.      ulp     = (unsigned long *)var_value;
  593.      gauge   = *ulp;
  594.      break;
  595.     case 8: /* time ticks (unsigned) */
  596.      ulp     = (unsigned long *)var_value;
  597.      ticks   = *ulp;
  598.      break;
  599.     case 9:  /* a display_string (printable ascii only) */
  600.      free(dstring);
  601.      dstring = (char *)malloc(var_value_len + 1);
  602.      bcopy(var_value, dstring, var_value_len);
  603.      dstring[var_value_len] = '\0'; /* so we can use it as a string */
  604.      DO_ATOE(dstring);
  605.      break;
  606.     case 10:  /* a request to execute a command */
  607.      free(command);
  608.      command = (char *)malloc(var_value_len + 1);
  609.      bcopy(var_value, command, var_value_len);
  610.      command[var_value_len] = '\0'; /* so we can use it as a string */
  611.      DO_ATOE(command);
  612.      if (strcmp("all_traps",command) == 0) do_trap = ALL_TRAPS;
  613.      else if (strcmp("std_traps",command) == 0) do_trap = STD_TRAPS;
  614.      else if (strcmp("ent_traps",command) == 0) do_trap = ENT_TRAPS;
  615.      else if (strcmp("ent_trapse",command) == 0) do_trap = ENT_TRAPSE;
  616.      else if (strcmp("all_traps",command) == 0) do_trap = ALL_TRAPS;
  617.      else if (strcmp("quit",command) == 0) do_quit = TRUE;
  618.      else break;
  619.      if (debug_lvl > 0)
  620.         printf("...Action requested: %s set to: %s\n",
  621.                 DPI_var[10], command);
  622.      break;
  623.     default: /* NoSuchName */
  624.      if (debug_lvl > 0)
  625.         printf("...Ignored set for %s, noSuchName\n", var_oid);
  626.      packet = mkDPIresponse(SNMP_NO_SUCH_NAME,NULL);
  627.      break;
  628.   } /* end switch (var_index) */
  629.   if (packet) send_packet(packet);
  630. }
  631.  
  632. #ifdef _NO_PROTO                      /* for classic K&R C */
  633. static void issue_std_traps()
  634. #else  /* _NO_PROTO */                /* for ANSI-C compiler */
  635. static void issue_std_traps(void)
  636. #endif /* _NO_PROTO */
  637. {
  638.    trap_stype = 0;
  639.    trap_data  = dpi_hostname;
  640.    for (trap_gtype=0; trap_gtype<6; trap_gtype++) {
  641.        issue_one_trap();
  642.        if (trap_gtype == 0) sleep(10); /* some managers purge cache */
  643.    }
  644. }
  645.  
  646. #ifdef _NO_PROTO                      /* for classic K&R C */
  647. static void issue_ent_traps()
  648. #else  /* _NO_PROTO */                /* for ANSI-C compiler */
  649. static void issue_ent_traps(void)
  650. #endif /* _NO_PROTO */
  651. {
  652.    char temp_string[256];
  653.  
  654.    trap_gtype = 6;
  655.    for (trap_stype = 1; trap_stype < 10; trap_stype++) {
  656.      trap_data = temp_string;
  657.      switch (trap_stype) {
  658.      case 1 :
  659.        sprintf(temp_string,"%ld",number);
  660.        break;
  661.      case 2 :
  662.        sprintf(temp_string,"%s",ostring);
  663.        break;
  664.      case 3 :
  665.        trap_data = objectID;
  666.        break;
  667.      case 4 :
  668.        trap_data = "";
  669.        break;
  670.      case 5 :
  671.        trap_data = dpi_hostname;
  672.        break;
  673.      case 6 :
  674.        sleep(1); /* give manager a break */
  675.        sprintf(temp_string,"%lu",counter);
  676.        break;
  677.      case 7 :
  678.        sprintf(temp_string,"%lu",gauge);
  679.        break;
  680.      case 8 :
  681.        sprintf(temp_string,"%lu",ticks);
  682.        break;
  683.      case 9 :
  684.        trap_data = dstring;
  685.        break;
  686.      } /* end switch (trap_stype) */
  687.      issue_one_trap();
  688.    }
  689. }
  690.  
  691. /*  issue a set of extended traps, pass enterprise ID and multiple
  692.  *  variable (assume octect string) as passed by caller
  693.  */
  694. #ifdef _NO_PROTO                      /* for classic K&R C */
  695. static void issue_ent_trapse()
  696. #else  /* _NO_PROTO */                /* for ANSI-C compiler */
  697. static void issue_ent_trapse(void)
  698. #endif /* _NO_PROTO */
  699. {
  700.   int i, n;
  701.   struct dpi_set_packet *data = NULL;
  702.   unsigned char *packet = NULL;
  703.   unsigned long ipaddr, ulnum;
  704.   char oid[256];
  705.   char *cp;
  706.  
  707.   trape_gtype = 6;
  708.   trape_eprise = ENTERPRISE_OID;
  709.   for (n=11; n < (11+OID_COUNT_FOR_TRAPS); n++) {
  710.       data = 0;
  711.       trape_stype = n;
  712.       for (i=1; i<=(n-10); i++)
  713.           data = addtoset(data, i);
  714.       if (data == 0) {
  715.          printf("Could not make dpi_set_packet\n");
  716.          return;
  717.       }
  718.       packet = mkDPItrape(trape_gtype,trape_stype,data,trape_eprise);
  719.       if ((debug_lvl > 0) && (packet)) {
  720.          printf("sending trape packet: %lu %lu enterprise=%s\n",
  721.                  trape_gtype, trape_stype, trape_eprise);
  722.       }
  723.       if (packet) send_packet(packet);
  724.       else printf("Could not make trape packet\n");
  725.   }
  726. }
  727.  
  728. /*  issue one extended trap, pass enterprise ID and multiple
  729.  *  variable (assume octect string) as passed by caller
  730.  */
  731. #ifdef _NO_PROTO                      /* for classic K&R C */
  732. static void issue_one_trape()
  733. #else  /* _NO_PROTO */                /* for ANSI-C compiler */
  734. static void issue_one_trape(void)
  735. #endif /* _NO_PROTO */
  736. {
  737.   struct dpi_set_packet *data = NULL;
  738.   unsigned char *packet = NULL;
  739.   char oid[256];
  740.   char *cp;
  741.   int i;
  742.  
  743.   for (i=0; i<trape_datacnt; i++) {
  744.       sprintf(oid,"%s2.%d",OID,i);
  745.       /* assume an octet_string (could have hex data) */
  746.       data = mkDPIlist(data, oid, SNMP_TYPE_STRING,
  747.                        strlen(trape_data[i]), trape_data[i]);
  748.       if (data == 0) {
  749.          printf("Could not make dpiset_packet\n");
  750.       } else if (debug_lvl > 0) {
  751.          printf("Preparing: [oid=%s] value: ", oid);
  752.          printf("'");
  753.          for (cp = trape_data[i]; *cp; cp++)  /* loop through data */
  754.              printf("%2.2x",*cp);             /* hex print one byte */
  755.          printf("'H\n");
  756.       }
  757.   }
  758.   packet = mkDPItrape(trape_gtype,trape_stype,data,trape_eprise);
  759.   if ((debug_lvl > 0) && (packet)) {
  760.      printf("sending trape packet: %lu %lu enterprise=%s\n",
  761.              trape_gtype, trape_stype, trape_eprise);
  762.   }
  763.   if (packet) send_packet(packet);
  764.   else printf("Could not make trape packet\n");
  765. }
  766.  
  767. #ifdef _NO_PROTO                      /* for classic K&R C */
  768. static void issue_one_trap()
  769. #else  /* _NO_PROTO */                /* for ANSI-C compiler */
  770. static void issue_one_trap(void)
  771. #endif /* _NO_PROTO */
  772. {
  773.   long int num;  /* must be 4 bytes */
  774.   struct dpi_set_packet *data = NULL;
  775.   unsigned char *packet = NULL;
  776.   unsigned long ipaddr, ulnum;
  777.   char oid[256];
  778.   char *cp;
  779.  
  780.   switch (trap_gtype) {
  781.   /*  all traps are handled more or less the same sofar.  */
  782.   /*  could put specific handling here if needed/wanted.  */
  783.   case 0:  /* simulate cold start */
  784.   case 1:  /* simulate warm start */
  785.   case 4:  /* simulate authentication failure */
  786.     strcpy(oid,"none");
  787.     break;
  788.   case 2:  /* simulate link down  */
  789.   case 3:  /* simulate link up    */
  790.     strcpy(oid,ifIndex);
  791.     num = 1;
  792.     data = mkDPIset(oid, SNMP_TYPE_NUMBER, sizeof(num), &num);
  793.     break;
  794.   case 5:  /* simulate EGP neighbor loss */
  795.     strcpy(oid,egpNeighAddr);
  796.     ipaddr = lookup_host(trap_data);
  797.     data = mkDPIset(oid, SNMP_TYPE_INTERNET, sizeof(ipaddr), &ipaddr);
  798.     break;
  799.   case 6:  /* simulate enterprise specific trap */
  800.     sprintf(oid,"%s%d.0",OID, trap_stype);
  801.     switch (trap_stype) {
  802.     case 1:  /* a number */
  803.       num  = strtol(trap_data,(char **)0,10);
  804.       data = mkDPIset(oid, SNMP_TYPE_NUMBER, sizeof(num), &num);
  805.       break;
  806.     case 2:  /* an octet_string (could have hex data) */
  807.       data = mkDPIset(oid,SNMP_TYPE_STRING,strlen(trap_data),trap_data);
  808.       break;
  809.     case 3: /* object id */
  810.       data = mkDPIset(oid,SNMP_TYPE_OBJECT,strlen(trap_data) + 1,
  811.                       trap_data);
  812.       break;
  813.     case 4: /* an empty variable value */
  814.       data = mkDPIset(oid, SNMP_TYPE_EMPTY, 0, 0);
  815.       break;
  816.     case 5: /* internet address */
  817.       ipaddr = lookup_host(trap_data);
  818.       data = mkDPIset(oid, SNMP_TYPE_INTERNET, sizeof(ipaddr), &ipaddr);
  819.       break;
  820.     case 6: /* counter (unsigned) */
  821.       ulnum  = strtoul(trap_data,(char **)0,10);
  822.       data = mkDPIset(oid, SNMP_TYPE_COUNTER, sizeof(ulnum), &ulnum);
  823.       break;
  824.     case 7: /* gauge (unsigned) */
  825.       ulnum  = strtoul(trap_data,(char **)0,10);
  826.       data = mkDPIset(oid, SNMP_TYPE_GAUGE, sizeof(ulnum), &ulnum);
  827.       break;
  828.     case 8: /* time ticks (unsigned) */
  829.       ulnum  = strtoul(trap_data,(char **)0,10);
  830.       data = mkDPIset(oid, SNMP_TYPE_TICKS, sizeof(num), &ulnum);
  831.       break;
  832.     case 9:  /* a display_string (ascii only) */
  833.       DO_ETOA(trap_data);
  834.       data = mkDPIset(oid,SNMP_TYPE_STRING,strlen(trap_data),trap_data);
  835.       DO_ATOE(trap_data);
  836.       break;
  837.     default: /* handle as string */
  838.       printf("Unknown specific trap type: %s, assume octet_string\n",
  839.               trap_stype);
  840.       data = mkDPIset(oid,SNMP_TYPE_STRING,strlen(trap_data),trap_data);
  841.       break;
  842.     } /* end switch (trap_stype) */
  843.     break;
  844.   default: /* unknown trap */
  845.     printf("Unknown general trap type: %s\n", trap_gtype);
  846.     return;
  847.     break;
  848.   } /* end switch (trap_gtype) */
  849.  
  850.   packet = mkDPItrap(trap_gtype,trap_stype,data);
  851.   if ((debug_lvl > 0) && (packet)) {
  852.      printf("sending trap packet: %u %u [oid=%s] value: ",
  853.             trap_gtype, trap_stype, oid);
  854.      if (trap_stype == 2) {
  855.         printf("'");
  856.         for (cp = trap_data; *cp; cp++)      /* loop through data */
  857.             printf("%2.2x",*cp);             /* hex print one byte */
  858.         printf("'H\n");
  859.      } else printf("%s\n", trap_data);
  860.   }
  861.   if (packet) send_packet(packet);
  862.   else printf("Could not make trap packet\n");
  863. }
  864.  
  865. #ifdef _NO_PROTO                             /* for classic K&R C */
  866. static void send_packet(packet)              /* DPI packet to agent */
  867. char *packet;
  868. #else  /* _NO_PROTO */                       /* for ANSI-C compiler */
  869. static void send_packet(const char *packet)  /* DPI packet to agent */
  870. #endif /* _NO_PROTO */
  871. {
  872.    int rc;
  873.  
  874.    if (debug_lvl > 2) {
  875.       printf("...Sending DPI packet:\n");
  876.       dump_bfr(packet, PACKET_LEN(packet));
  877.    }
  878. #ifdef OS2
  879.    rc = send(dpi_fd,packet,PACKET_LEN(packet),0);
  880. #else
  881.    rc = write(dpi_fd,packet,PACKET_LEN(packet));
  882. #endif
  883.    if (rc != PACKET_LEN(packet)) DO_ERROR("send_packet:  write");
  884.    /* no need to free packet (static buffer in mkDPI.... routine) */
  885. }
  886.  
  887. #ifdef _NO_PROTO                             /* for classic K&R C */
  888. static void do_register()  /* register our objectIDs with agent */
  889. #else  /* _NO_PROTO */                       /* for ANSI-C compiler */
  890. static void do_register(void)  /* register our objectIDs with agent */
  891. #endif /* _NO_PROTO */
  892. {
  893.    int  i, rc;
  894.    char toid[256];
  895.  
  896.    if (debug_lvl > 0) printf("Registering variables:\n");
  897.    for (i=1; i<=OID_COUNT; i++) {
  898.        sprintf(toid,"%s%d.",OID,i);
  899.        packet = mkDPIregister(toid);
  900. #ifdef OS2
  901.        rc     = send(dpi_fd, packet, PACKET_LEN(packet),0);
  902. #else
  903.        rc     = write(dpi_fd, packet, PACKET_LEN(packet));
  904. #endif
  905.        if (rc <= 0) {
  906.           DO_ERROR("do_register:  write");
  907.           printf("Quitting, unsuccessful register for %s\n",toid);
  908.           close(dpi_fd);
  909.           exit(1);
  910.        }
  911.        if (debug_lvl > 0) {
  912.           printf("...Registered: %-25s oid: %s\n",DPI_var[i],toid);
  913.           printf("......Initial value: ");
  914.           print_val(i); /* prints \n at end */
  915.        }
  916.    }
  917. }
  918.  
  919. /*  add specified variable to list of variable in the dpi_set_packet
  920.  */
  921. #ifdef _NO_PROTO                      /* for classic K&R C */
  922. struct dpi_set_packet *addtoset(data, stype)
  923. struct dpi_set_packet *data;
  924. int stype;
  925. #else  /* _NO_PROTO */                /* for ANSI-C compiler */
  926. struct dpi_set_packet *addtoset(struct dpi_set_packet *data, int stype)
  927. #endif /* _NO_PROTO */
  928. {
  929.     char var_oid[256];
  930.  
  931.     sprintf(var_oid,"%s%d.0",OID, stype);
  932.     switch (stype) {
  933.     case 1:  /* a number */
  934.       data = mkDPIlist(data, var_oid, SNMP_TYPE_NUMBER,
  935.                        sizeof(number), &number);
  936.       break;
  937.     case 2:  /* an octet_string (can have binary data) */
  938.      data = mkDPIlist(data, var_oid, SNMP_TYPE_STRING,
  939.                       ostring_len, ostring);
  940.      break;
  941.     case 3: /* object id */
  942.      data = mkDPIlist(data, var_oid, SNMP_TYPE_OBJECT,
  943.                       objectID_len, objectID);
  944.      break;
  945.     case 4: /* some empty variable */
  946.      data = mkDPIlist(data, var_oid, SNMP_TYPE_EMPTY, 0, NULL);
  947.      break;
  948.     case 5: /* internet address */
  949.      data = mkDPIlist(data, var_oid, SNMP_TYPE_INTERNET,
  950.                       sizeof(ipaddr), &ipaddr);
  951.      break;
  952.     case 6: /* counter (unsigned) */
  953.      data =mkDPIlist(data, var_oid, SNMP_TYPE_COUNTER,
  954.                      sizeof(counter), &counter);
  955.      break;
  956.     case 7: /* gauge (unsigned) */
  957.      data = mkDPIlist(data, var_oid, SNMP_TYPE_GAUGE,
  958.                       sizeof(gauge), &gauge);
  959.      break;
  960.     case 8: /* time ticks (unsigned) */
  961.      data = mkDPIlist(data, var_oid, SNMP_TYPE_TICKS,
  962.                       sizeof(ticks), &ticks);
  963.      break;
  964.     case 9:  /* a display_string (printable ascii only) */
  965.      DO_ETOA(dstring);
  966.      data = mkDPIlist(data, var_oid, SNMP_TYPE_STRING,
  967.                       strlen(dstring), dstring);
  968.      DO_ATOE(dstring);
  969.      break;
  970.     } /* end switch (stype) */
  971.     return(data);
  972. }
  973.  
  974. #ifdef _NO_PROTO                             /* for classic K&R C */
  975. static void print_val(index)
  976. int index;
  977. #else  /* _NO_PROTO */                       /* for ANSI-C compiler */
  978. static void print_val(const int index)
  979. #endif /* _NO_PROTO */
  980. {
  981.    char *cp;
  982.    struct in_addr display_ipaddr;
  983.  
  984.    switch (index) {
  985.    case 1 :
  986.      printf("%ld\n",number);
  987.      break;
  988.    case 2 :
  989.      printf("'");
  990.      for (cp = ostring; cp < ostring + ostring_len; cp++)
  991.          printf("%2.2x",*cp);
  992.      printf("'H\n");
  993.      break;
  994.    case 3 :
  995.      printf("%*s\n", objectID_len, objectID);
  996.      break;
  997.    case 4 :
  998.      printf("no value (EMPTY)\n");
  999.      break;
  1000.   case 5 :
  1001.      display_ipaddr.s_addr = (u_long) ipaddr;
  1002.      printf("%s\n",inet_ntoa(display_ipaddr));
  1003. /*   This worked on VM, MVS and AIX, but not on OS/2
  1004.  *   printf("%d.%d.%d.%d\n", (ipaddr >> 24), ((ipaddr << 8) >> 24),
  1005.  *          ((ipaddr << 16) >> 24), ((ipaddr << 24) >> 24));
  1006.  */
  1007.      break;
  1008.    case 6 :
  1009.      printf("%lu\n",counter);
  1010.      break;
  1011.    case 7 :
  1012.      printf("%lu\n",gauge);
  1013.      break;
  1014.    case 8 :
  1015.      printf("%lu\n",ticks);
  1016.      break;
  1017.    case 9 :
  1018.      printf("%s\n",dstring);
  1019.      break;
  1020.    case 10 :
  1021.      printf("%s\n",command);
  1022.      break;
  1023.    } /* end switch(index) */
  1024. }
  1025.  
  1026. #ifdef _NO_PROTO                             /* for classic K&R C */
  1027. static void check_arguments(argc, argv)      /* check arguments */
  1028. int   argc;
  1029. char *argv[];
  1030. #else  /* _NO_PROTO */                       /* for ANSI-C compiler */
  1031. static void check_arguments(const int argc, char *argv[])
  1032. #endif /* _NO_PROTO */
  1033. {
  1034.    char *hname, *cname;
  1035.    int i, j;
  1036.  
  1037.    dpi_userid = hname = cname = NULL;
  1038.    for (i=1; argc > i; i++) {
  1039.       if (strcmp(argv[i],"-d") == 0) {
  1040.          i++;
  1041.          if (argc > i) {
  1042.             debug_lvl = atoi(argv[i]);
  1043.             if (debug_lvl >= 5) {
  1044.                DPIdebug(1);
  1045.             }
  1046.          }
  1047.       } else if (strcmp(argv[i],"-trap") == 0) {
  1048.          if (argc > i+3) {
  1049.             trap_gtype = atoi(argv[i+1]);
  1050.             trap_stype = atoi(argv[i+2]);
  1051.             trap_data  = argv[i+3];
  1052.             i = i + 3;
  1053.             do_trap = ONE_TRAP;
  1054.          } else usage(argv[0], 1);
  1055.       } else if (strcmp(argv[i],"-trape") == 0) {
  1056.          if (argc > i+4) {
  1057.             trape_gtype  = strtoul(argv[i+1],(char**)0,10);
  1058.             trape_stype  = strtoul(argv[i+2],(char**)0,10);
  1059.             trape_eprise = argv[i+3];
  1060.             for (i = i + 4, j = 0;
  1061.                  (argc > i) && (j < MAX_TRAPE_DATA);
  1062.                  i++, j++) {
  1063.                 trape_data[j]  = argv[i];
  1064.             }
  1065.             trape_datacnt = j;
  1066.             do_trap = ONE_TRAPE;
  1067.             break;  /* -trape must be last option */
  1068.          } else usage(argv[0], 1);
  1069.       } else if (strcmp(argv[i],"-all_traps") == 0) {
  1070.          do_trap = ALL_TRAPS;
  1071.       } else if (strcmp(argv[i],"-std_traps") == 0) {
  1072.          do_trap = STD_TRAPS;
  1073.       } else if (strcmp(argv[i],"-ent_traps") == 0) {
  1074.          do_trap = ENT_TRAPS;
  1075.       } else if (strcmp(argv[i],"-ent_trapse") == 0) {
  1076.          do_trap = ENT_TRAPSE;
  1077. #if defined(VM) || defined(MVS)
  1078.       } else if (strcmp(argv[i],"-inet") == 0) {
  1079.          use_iucv = 0;
  1080.       } else if (strcmp(argv[i],"-iucv") == 0) {
  1081.          use_iucv = TRUE;
  1082.       } else if (strcmp(argv[i],"-u") == 0) {
  1083.          use_iucv = TRUE;  /* -u implies -iucv */
  1084.          i++;
  1085.          if (argc > i) {
  1086.             dpi_userid = argv[i];
  1087.          }
  1088. #endif
  1089.       } else if (strcmp(argv[i],"?") == 0) {
  1090.          usage(argv[0], 0);
  1091.       } else {
  1092.         if (hname == NULL) hname = argv[i];
  1093.         else if (cname == NULL) cname = argv[i];
  1094.         else usage(argv[0], 1);
  1095.       }
  1096.    }
  1097.    if (hname == NULL) hname = LOOPBACK;              /* use default */
  1098.    if (cname == NULL) cname = PUBLIC_COMMUNITY_NAME; /* use default */
  1099. #if defined(VM) || defined(MVS)
  1100.    if (dpi_userid == NULL) dpi_userid = SNMPAGENTUSERID;
  1101.    if (debug_lvl > 2)
  1102.       printf("hname=%s, cname=%s, userid=%s\n",hname,cname,dpi_userid);
  1103. #else
  1104.    if (debug_lvl > 2)
  1105.       printf("hname=%s, cname=%s\n",hname,cname);
  1106. #endif
  1107.    if (use_iucv != TRUE) {
  1108.       DO_ETOA(cname);                                /* for VM or MVS */
  1109.       dpi_port = query_DPI_port(hname,cname);
  1110.       DO_ATOE(cname);                                /* for VM or MVS */
  1111.       if (dpi_port == -1) {
  1112.          printf("No response from agent at %s(%s)\n",hname,cname);
  1113.          exit(1);
  1114.       }
  1115.    } else dpi_port == -1;
  1116.    dpi_hostname = hname;
  1117. }
  1118.  
  1119. #ifdef _NO_PROTO                             /* for classic K&R C */
  1120. static void usage(pname, exit_rc)
  1121. char *pname;
  1122. int   exit_rc;
  1123. #else  /* _NO_PROTO */                       /* for ANSI-C compiler */
  1124. static void usage(const char *pname, const int exit_rc)
  1125. #endif /* _NO_PROTO */
  1126. {
  1127.    printf("Usage: %s [-d debug_lvl] [-trap g_type s_type data]", pname);
  1128.    printf(" [-all_traps]\n");
  1129.    printf("%*s[-trape g_type s_type enterprise data1 data2 .. datan]\n",
  1130.           strlen(pname)+8,"");
  1131.    printf("%*s[-std_traps] [-ent_traps] [-ent_trapse]\n",
  1132.           strlen(pname)+8,"");
  1133. #if defined(VM) || defined(MVS)
  1134.    printf("%*s[-iucv] [-u agent_userid]\n",strlen(pname)+8, "");
  1135.    printf("%*s", strlen(pname)+8, "");
  1136.    printf("[-inet] [agent_hostname [community_name]]\n");
  1137.    printf("default: -d 0 -iucv -u %s\n", SNMPAGENTUSERID);
  1138.    printf("         -inet %s %s\n", LOOPBACK, PUBLIC_COMMUNITY_NAME);
  1139. #else
  1140.    printf("%*s[agent_hostname [community_name]]\n",strlen(pname)+8,"");
  1141.    printf("default: -d 0 %s %s\n", LOOPBACK, PUBLIC_COMMUNITY_NAME);
  1142. #endif
  1143.    exit(exit_rc);
  1144. }
  1145.  
  1146. #ifdef _NO_PROTO                     /* for classic K&R C */
  1147. static void init_variables()         /* initialize our variables */
  1148. #else  /* _NO_PROTO */               /* for ANSI-C compiler */
  1149. static void init_variables(void)     /* initialize our variables */
  1150. #endif /* _NO_PROTO */
  1151. {
  1152.    char ch, *cp;
  1153.  
  1154.    ostring  = (char *)malloc(strlen(OSTRING) + 4 + 1 );
  1155.    bcopy(OSTRING,ostring,strlen(OSTRING));
  1156.    ostring_len = strlen(OSTRING);
  1157.    for (ch=1;ch<5;ch++)               /* add hex data 0x01020304 */
  1158.         ostring[ostring_len++] = ch;
  1159.    ostring[ostring_len] = '\0';       /* so we can use it as a string */
  1160.    objectID     = (char *)malloc(strlen(OID));
  1161.    objectID_len = strlen(OID);
  1162.    bcopy(OID,objectID,strlen(OID));
  1163.    if (objectID[objectID_len - 1] == '.')  /* if trailing dot, */
  1164.        objectID[objectID_len - 1] = '\0';  /* remove it */
  1165.    else objectID_len++;                    /* length includes null */
  1166.    dstring  = (char *)malloc(strlen(DSTRING)+1);
  1167.    bcopy(DSTRING,dstring,strlen(DSTRING)+1);
  1168.    command  = (char *)malloc(strlen(COMMAND)+1);
  1169.    bcopy(COMMAND,command,strlen(COMMAND)+1);
  1170.    ipaddr = dpi_ipaddress;
  1171.  
  1172. }
  1173.  
  1174. #ifdef _NO_PROTO                     /* for classic K&R C */
  1175. static void init_connection()        /* connect to the DPI agent */
  1176. #else  /* _NO_PROTO */               /* for ANSI-C compiler */
  1177. static void init_connection(void)    /* connect to the DPI agent */
  1178. #endif /* _NO_PROTO */
  1179. {
  1180.     int                   rc;
  1181.     int               sasize;        /* size of socket structure */
  1182.     struct sockaddr_in   sin;        /* socket address AF_INET */
  1183.     struct sockaddr      *sa;        /* socket address general */
  1184. #if defined(VM) || defined (MVS)
  1185.     struct sockaddr_iucv siu;        /* socket address AF_IUCV */
  1186.  
  1187.     if (use_iucv == TRUE) {
  1188.        printf("Connecting to %s DPI_port %d userid %s (TCP, AF_IUCV)\n",
  1189.               dpi_hostname,dpi_port,dpi_userid);
  1190.        bzero(&siu,sizeof(siu));
  1191.        siu.siucv_family = AF_IUCV;
  1192.        siu.siucv_addr = dpi_ipaddress;
  1193.        siu.siucv_port = dpi_port;
  1194.        memset(siu.siucv_nodeid, ' ', sizeof(siu.siucv_nodeid));
  1195.        memset(siu.siucv_userid, ' ', sizeof(siu.siucv_userid));
  1196.        memset(siu.siucv_name, ' ', sizeof(siu.siucv_name));
  1197.        bcopy(dpi_userid, siu.siucv_userid, min(8,strlen(dpi_userid)));
  1198.        bcopy(SNMPIUCVNAME, siu.siucv_name, min(8,strlen(SNMPIUCVNAME)));
  1199.        dpi_fd = socket(AF_IUCV, SOCK_STREAM, 0);
  1200.        sa     = (struct sockaddr *) &siu;
  1201.        sasize = sizeof(struct sockaddr_iucv);
  1202.     } else {
  1203. #endif
  1204.        printf("Connecting to %s DPI_port %d (TCP, AF_INET)\n",
  1205.               dpi_hostname,dpi_port);
  1206.        bzero(&sin,sizeof(sin));
  1207.        sin.sin_family      = AF_INET;
  1208.        sin.sin_port        = htons(dpi_port);
  1209.        sin.sin_addr.s_addr = dpi_ipaddress;
  1210.        dpi_fd = socket(AF_INET, SOCK_STREAM, 0);
  1211.        sa     = (struct sockaddr *) &sin;
  1212.        sasize = sizeof(struct sockaddr_in);
  1213. #if defined(VM) || defined (MVS)
  1214.     }
  1215. #endif
  1216.     if (dpi_fd < 0) {                            /* exit on error */
  1217.        DO_ERROR("init_connection:  socket");
  1218.        exit(1);
  1219.     }
  1220.     rc = connect(dpi_fd, sa, sasize);            /* connect to agent */
  1221.     if (rc != 0) {                               /* exit on error */
  1222.        DO_ERROR("init_connection:  connect");
  1223.        close(dpi_fd);
  1224.        exit(1);
  1225.     }
  1226. }
  1227.  
  1228. #ifdef _NO_PROTO                             /* for classic K&R C */
  1229. static void dump_bfr(buf, len)               /* hex dump buffer */
  1230. char *buf;
  1231. int   len;
  1232. #else  /* _NO_PROTO */                       /* for ANSI-C compiler */
  1233. static void dump_bfr(const char *buf, const int len)
  1234. #endif /* _NO_PROTO */
  1235. {
  1236.    register int i;
  1237.  
  1238.    if (len == 0) printf("     empty buffer\n"); /* buffer is empty */
  1239.    for (i=0;i<len;i++) {                     /* loop through buffer */
  1240.        if ((i&15) == 0) printf("     ");     /* indent new line */
  1241.        printf("%2.2x",(unsigned char)buf[i]);/* hex print one byte */
  1242.        if ((i&15) == 15) printf("\n");       /* nl every 16 bytes */
  1243.        else if ((i&3) == 3) printf(" ");     /* space every 4 bytes */
  1244.    }
  1245.    if (i&15) printf("\n");                   /* always end with nl */
  1246. }
  1247.