mib.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:20k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /***********************************************************
  2. Copyright 1988, 1989 by Carnegie Mellon University
  3.                       All Rights Reserved
  4. Permission to use, copy, modify, and distribute this software and its 
  5. documentation for any purpose and without fee is hereby granted, 
  6. provided that the above copyright notice appear in all copies and that
  7. both that copyright notice and this permission notice appear in 
  8. supporting documentation, and that the name of CMU not be
  9. used in advertising or publicity pertaining to distribution of the
  10. software without specific, written prior permission.  
  11. CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  12. ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
  13. CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  14. ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  15. WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  16. ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  17. SOFTWARE.
  18. ******************************************************************/
  19. #include "config.h"
  20. #include <stdio.h>
  21. #if HAVE_UNISTD_H
  22. #include <unistd.h>
  23. #endif
  24. #if HAVE_STDLIB_H
  25. #include <stdlib.h>
  26. #endif
  27. #if HAVE_SYS_TYPES_H
  28. #include <sys/types.h>
  29. #endif
  30. #if HAVE_CTYPE_H
  31. #include <ctype.h>
  32. #endif
  33. #if HAVE_GNUMALLOC_H
  34. #include <gnumalloc.h>
  35. #elif HAVE_MALLOC_H && !defined(_SQUID_FREEBSD_) && !defined(_SQUID_NEXT_)
  36. #include <malloc.h>
  37. #endif
  38. #if HAVE_MEMORY_H
  39. #include <memory.h>
  40. #endif
  41. #ifdef HAVE_STRING_H
  42. #include <string.h>
  43. #endif
  44. #ifdef HAVE_STRINGS_H
  45. #include <strings.h>
  46. #endif
  47. #if HAVE_BSTRING_H
  48. #include <bstring.h>
  49. #endif
  50. #if HAVE_SYS_SOCKET_H
  51. #include <sys/socket.h>
  52. #endif
  53. #if HAVE_NETINET_IN_H
  54. #include <netinet/in.h>
  55. #endif
  56. #if HAVE_ARPA_INET_H
  57. #include <arpa/inet.h>
  58. #endif
  59. #if HAVE_SYS_TIME_H
  60. #include <sys/time.h>
  61. #endif
  62. #if HAVE_NETDB_H
  63. #include <netdb.h>
  64. #endif
  65. #include "asn1.h"
  66. #include "snmp.h"
  67. #include "snmp_pdu.h"
  68. #include "snmp_vars.h"
  69. #include "snmp_session.h"
  70. #include "snmp_impl.h"
  71. #include "snmp_api.h"
  72. #include "parse.h"
  73. #include "util.h"
  74. #include "snprintf.h"
  75. #if 0
  76. static void sprint_by_type();
  77. #endif
  78. #if 0
  79. static char *
  80. uptimeString(timeticks, buf)
  81.      int timeticks;
  82.      char *buf;
  83. {
  84.     int seconds, minutes, hours, days;
  85.     timeticks /= 100;
  86.     days = timeticks / (60 * 60 * 24);
  87.     timeticks %= (60 * 60 * 24);
  88.     hours = timeticks / (60 * 60);
  89.     timeticks %= (60 * 60);
  90.     minutes = timeticks / 60;
  91.     seconds = timeticks % 60;
  92.     if (days == 0) {
  93. snprintf(buf, 32, "%d:%02d:%02d", hours, minutes, seconds);
  94.     } else if (days == 1) {
  95. snprintf(buf, 32, "%d day, %d:%02d:%02d", days, hours, minutes, seconds);
  96.     } else {
  97. snprintf(buf, 32, "%d days, %d:%02d:%02d", days, hours, minutes, seconds);
  98.     }
  99.     return buf;
  100. }
  101. static void 
  102. sprint_hexstring(buf, cp, len)
  103.      char *buf;
  104.      u_char *cp;
  105.      int len;
  106. {
  107.     for (; len >= 16; len -= 16) {
  108. snprintf(buf, 26, "%02X %02X %02X %02X %02X %02X %02X %02X ", cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
  109. buf += strlen(buf);
  110. cp += 8;
  111. snprintf(buf, 26, "%02X %02X %02X %02X %02X %02X %02X %02Xn", cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
  112. buf += strlen(buf);
  113. cp += 8;
  114.     }
  115.     for (; len > 0; len--) {
  116. snprintf(buf, 4, "%02X ", *cp++);
  117. buf += strlen(buf);
  118.     }
  119.     *buf = '';
  120. }
  121. static void 
  122. sprint_asciistring(buf, cp, len)
  123.      char *buf;
  124.      u_char *cp;
  125.      int len;
  126. {
  127.     int x;
  128.     for (x = 0; x < len; x++) {
  129. if (isprint(*cp)) {
  130.     *buf++ = *cp++;
  131. } else {
  132.     *buf++ = '.';
  133.     cp++;
  134. }
  135. if ((x % 48) == 47)
  136.     *buf++ = 'n';
  137.     }
  138.     *buf = '';
  139. }
  140. static void
  141. sprint_octet_string(buf, var, foo, quiet)
  142.      char *buf;
  143.      variable_list *var;
  144.      void *foo;
  145.      int quiet;
  146. {
  147.     int hex, x;
  148.     u_char *cp;
  149.     if (var->type != ASN_OCTET_STR) {
  150. sprintf(buf, "Wrong Type (should be OCTET STRING): ");
  151. buf += strlen(buf);
  152. sprint_by_type(buf, var, (struct enum_list *) NULL, quiet);
  153. return;
  154.     }
  155.     hex = 0;
  156.     for (cp = var->val.string, x = 0; x < var->val_len; x++, cp++) {
  157. if (!(isprint(*cp) || isspace(*cp)))
  158.     hex = 1;
  159.     }
  160.     if (var->val_len <= 4)
  161. hex = 1; /* not likely to be ascii */
  162.     if (hex) {
  163. if (!quiet) {
  164.     sprintf(buf, "OCTET STRING-   (hex):t");
  165.     buf += strlen(buf);
  166. }
  167. sprint_hexstring(buf, var->val.string, var->val_len);
  168.     } else {
  169. if (!quiet) {
  170.     sprintf(buf, "OCTET STRING- (ascii):t");
  171.     buf += strlen(buf);
  172. }
  173. sprint_asciistring(buf, var->val.string, var->val_len);
  174.     }
  175. }
  176. static void
  177. sprint_opaque(buf, var, foo, quiet)
  178.      char *buf;
  179.      variable_list *var;
  180.      void *foo;
  181.      int quiet;
  182. {
  183.     if (var->type != SMI_OPAQUE) {
  184. sprintf(buf, "Wrong Type (should be Opaque): ");
  185. buf += strlen(buf);
  186. sprint_by_type(buf, var, (struct enum_list *) NULL, quiet);
  187. return;
  188.     }
  189.     if (!quiet) {
  190. sprintf(buf, "OPAQUE -   (hex):t");
  191. buf += strlen(buf);
  192.     }
  193.     sprint_hexstring(buf, var->val.string, var->val_len);
  194. }
  195. static void
  196. sprint_object_identifier(buf, var, foo, quiet)
  197.      char *buf;
  198.      variable_list *var;
  199.      void *foo;
  200.      int quiet;
  201. {
  202.     if (var->type != SMI_OBJID) {
  203. sprintf(buf, "Wrong Type (should be OBJECT IDENTIFIER): ");
  204. buf += strlen(buf);
  205. sprint_by_type(buf, var, (struct enum_list *) NULL, quiet);
  206. return;
  207.     }
  208.     if (!quiet) {
  209. sprintf(buf, "OBJECT IDENTIFIER:t");
  210. buf += strlen(buf);
  211.     }
  212.     sprint_objid(buf, (oid *) (var->val.objid), var->val_len / sizeof(oid));
  213. }
  214. static void
  215. sprint_timeticks(buf, var, foo, quiet)
  216.      char *buf;
  217.      variable_list *var;
  218.      void *foo;
  219.      int quiet;
  220. {
  221.     char timebuf[32];
  222.     if (var->type != SMI_TIMETICKS) {
  223. sprintf(buf, "Wrong Type (should be Timeticks): ");
  224. buf += strlen(buf);
  225. sprint_by_type(buf, var, (struct enum_list *) NULL, quiet);
  226. return;
  227.     }
  228.     if (!quiet) {
  229. sprintf(buf, "Timeticks: ");
  230. buf += strlen(buf);
  231.     }
  232.     sprintf(buf, "(%u) %s",
  233. *(var->val.integer),
  234. uptimeString(*(var->val.integer), timebuf));
  235. }
  236. static void
  237. sprint_integer(buf, var, enums, quiet)
  238.      char *buf;
  239.      variable_list *var;
  240.      struct enum_list *enums;
  241.      int quiet;
  242. {
  243.     char *enum_string = NULL;
  244.     if (var->type != SMI_INTEGER) {
  245. sprintf(buf, "Wrong Type (should be INTEGER): ");
  246. buf += strlen(buf);
  247. sprint_by_type(buf, var, (struct enum_list *) NULL, quiet);
  248. return;
  249.     }
  250.     for (; enums; enums = enums->next)
  251. if (enums->value == *var->val.integer) {
  252.     enum_string = enums->label;
  253.     break;
  254. }
  255.     if (!quiet) {
  256. sprintf(buf, "INTEGER: ");
  257. buf += strlen(buf);
  258.     }
  259.     if (enum_string == NULL)
  260. sprintf(buf, "%u", *var->val.integer);
  261.     else
  262. sprintf(buf, "%s(%u)", enum_string, *var->val.integer);
  263. }
  264. static void
  265. sprint_gauge(buf, var, foo, quiet)
  266.      char *buf;
  267.      variable_list *var;
  268.      void *foo;
  269.      int quiet;
  270. {
  271.     if (var->type != SMI_GAUGE32) {
  272. sprintf(buf, "Wrong Type (should be Gauge): ");
  273. buf += strlen(buf);
  274. sprint_by_type(buf, var, (struct enum_list *) NULL, quiet);
  275. return;
  276.     }
  277.     if (!quiet) {
  278. sprintf(buf, "Gauge: ");
  279. buf += strlen(buf);
  280.     }
  281.     sprintf(buf, "%u", *var->val.integer);
  282. }
  283. static void
  284. sprint_counter(buf, var, foo, quiet)
  285.      char *buf;
  286.      variable_list *var;
  287.      void *foo;
  288.      int quiet;
  289. {
  290.     if (var->type != SMI_COUNTER32) {
  291. sprintf(buf, "Wrong Type (should be Counter): ");
  292. buf += strlen(buf);
  293. sprint_by_type(buf, var, (struct enum_list *) NULL, quiet);
  294. return;
  295.     }
  296.     if (!quiet) {
  297. sprintf(buf, "Counter: ");
  298. buf += strlen(buf);
  299.     }
  300.     sprintf(buf, "%u", *var->val.integer);
  301. }
  302. static void
  303. sprint_networkaddress(buf, var, foo, quiet)
  304.      char *buf;
  305.      variable_list *var;
  306.      void *foo;
  307.      int quiet;
  308. {
  309.     int x, len;
  310.     u_char *cp;
  311.     if (!quiet) {
  312. sprintf(buf, "Network Address:t");
  313. buf += strlen(buf);
  314.     }
  315.     cp = var->val.string;
  316.     len = var->val_len;
  317.     for (x = 0; x < len; x++) {
  318. sprintf(buf, "%02X", *cp++);
  319. buf += strlen(buf);
  320. if (x < (len - 1))
  321.     *buf++ = ':';
  322.     }
  323. }
  324. static void
  325. sprint_ipaddress(buf, var, foo, quiet)
  326.      char *buf;
  327.      variable_list *var;
  328.      void *foo;
  329.      int quiet;
  330. {
  331.     u_char *ip;
  332.     if (var->type != SMI_IPADDRESS) {
  333. sprintf(buf, "Wrong Type (should be Ipaddress): ");
  334. buf += strlen(buf);
  335. sprint_by_type(buf, var, (struct enum_list *) NULL, quiet);
  336. return;
  337.     }
  338.     ip = var->val.string;
  339.     if (!quiet) {
  340. sprintf(buf, "IPAddress:t");
  341. buf += strlen(buf);
  342.     }
  343.     sprintf(buf, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
  344. }
  345. #endif
  346. #if 0
  347. static void
  348. sprint_unsigned_short(buf, var, foo, quiet)
  349.      char *buf;
  350.      variable_list *var;
  351.      void *foo;
  352.      int quiet;
  353. {
  354.     if (var->type != SMI_INTEGER) {
  355. sprintf(buf, "Wrong Type (should be INTEGER): ");
  356. buf += strlen(buf);
  357. sprint_by_type(buf, var, (struct enum_list *) NULL, quiet);
  358. return;
  359.     }
  360.     if (!quiet) {
  361. sprintf(buf, "INTEGER (0..65535): ");
  362. buf += strlen(buf);
  363.     }
  364.     sprintf(buf, "%u", *var->val.integer);
  365. }
  366. #endif
  367. #if 0
  368. static void
  369. sprint_null(buf, var, foo, quiet)
  370.      char *buf;
  371.      variable_list *var;
  372.      void *foo;
  373.      int quiet;
  374. {
  375.     if (var->type != SMI_NULLOBJ) {
  376. sprintf(buf, "Wrong Type (should be NULL): ");
  377. buf += strlen(buf);
  378. sprint_by_type(buf, var, (struct enum_list *) NULL, quiet);
  379. return;
  380.     }
  381.     sprintf(buf, "NULL");
  382. }
  383. static void
  384. sprint_unknowntype(buf, var, foo, quiet)
  385.      char *buf;
  386.      variable_list *var;
  387.      void *foo;
  388.      int quiet;
  389. {
  390. /*    sprintf(buf, "Variable has bad type"); */
  391.     sprint_by_type(buf, var, foo, quiet);
  392. }
  393. static void
  394. sprint_badtype(buf)
  395.      char *buf;
  396. {
  397.     sprintf(buf, "Variable has bad type");
  398. }
  399. static void
  400. sprint_by_type(buf, var, enums, quiet)
  401.      char *buf;
  402.      variable_list *var;
  403.      struct enum_list *enums;
  404.      int quiet;
  405. {
  406.     switch (var->type) {
  407.     case SMI_INTEGER:
  408. sprint_integer(buf, var, enums, quiet);
  409. break;
  410.     case SMI_STRING:
  411. sprint_octet_string(buf, var, enums, quiet);
  412. break;
  413.     case SMI_OPAQUE:
  414. sprint_opaque(buf, var, enums, quiet);
  415. break;
  416.     case SMI_OBJID:
  417. sprint_object_identifier(buf, var, enums, quiet);
  418. break;
  419.     case SMI_TIMETICKS:
  420. sprint_timeticks(buf, var, enums, quiet);
  421. break;
  422.     case SMI_GAUGE32:
  423. sprint_gauge(buf, var, enums, quiet);
  424. break;
  425.     case SMI_COUNTER32:
  426. sprint_counter(buf, var, enums, quiet);
  427. break;
  428.     case SMI_IPADDRESS:
  429. sprint_ipaddress(buf, var, enums, quiet);
  430. break;
  431.     case SMI_NULLOBJ:
  432. sprint_null(buf, var, enums, quiet);
  433. break;
  434.     default:
  435. sprint_badtype(buf, enums, quiet);
  436. break;
  437.     }
  438. }
  439. #endif
  440. static struct snmp_mib_tree *get_symbol();
  441. oid RFC1066_MIB[] =
  442. {1, 3, 6, 1, 2, 1};
  443. unsigned char RFC1066_MIB_text[] = ".iso.org.dod.internet.mgmt.mib";
  444. struct snmp_mib_tree *Mib;
  445. #if 0
  446. static void
  447. set_functions(subtree)
  448.      struct snmp_mib_tree *subtree;
  449. {
  450.     for (; subtree; subtree = subtree->next_peer) {
  451. switch (subtree->type) {
  452. case TYPE_OBJID:
  453.     subtree->printer = sprint_object_identifier;
  454.     break;
  455. case TYPE_OCTETSTR:
  456.     subtree->printer = sprint_octet_string;
  457.     break;
  458. case TYPE_INTEGER:
  459.     subtree->printer = sprint_integer;
  460.     break;
  461. case TYPE_NETADDR:
  462.     subtree->printer = sprint_networkaddress;
  463.     break;
  464. case TYPE_IPADDR:
  465.     subtree->printer = sprint_ipaddress;
  466.     break;
  467. case TYPE_COUNTER:
  468.     subtree->printer = sprint_counter;
  469.     break;
  470. case TYPE_GAUGE:
  471.     subtree->printer = sprint_gauge;
  472.     break;
  473. case TYPE_TIMETICKS:
  474.     subtree->printer = sprint_timeticks;
  475.     break;
  476. case TYPE_OPAQUE:
  477.     subtree->printer = sprint_opaque;
  478.     break;
  479. case TYPE_NULL:
  480.     subtree->printer = sprint_null;
  481.     break;
  482. case TYPE_OTHER:
  483. default:
  484.     subtree->printer = sprint_unknowntype;
  485.     break;
  486. }
  487. set_functions(subtree->child_list);
  488.     }
  489. }
  490. #endif
  491. void 
  492. init_mib(char *file)
  493. {
  494.     if (Mib != NULL)
  495. return;
  496.     if (file != NULL)
  497. Mib = read_mib(file);
  498. #if 0
  499.     set_functions(Mib);
  500. #endif
  501. }
  502. static struct snmp_mib_tree *
  503. find_rfc1066_mib(root)
  504.      struct snmp_mib_tree *root;
  505. {
  506.     oid *op = RFC1066_MIB;
  507.     struct snmp_mib_tree *tp;
  508.     int len;
  509.     for (len = sizeof(RFC1066_MIB) / sizeof(oid); len; len--, op++) {
  510. for (tp = root; tp; tp = tp->next_peer) {
  511.     if (tp->subid == *op) {
  512. root = tp->child_list;
  513. break;
  514.     }
  515. }
  516. if (tp == NULL)
  517.     return NULL;
  518.     }
  519.     return root;
  520. }
  521. static int
  522. lc_cmp(s1, s2)
  523.      char *s1, *s2;
  524. {
  525.     char c1, c2;
  526.     while (*s1 && *s2) {
  527. if (isupper(*s1))
  528.     c1 = tolower(*s1);
  529. else
  530.     c1 = *s1;
  531. if (isupper(*s2))
  532.     c2 = tolower(*s2);
  533. else
  534.     c2 = *s2;
  535. if (c1 != c2)
  536.     return ((c1 - c2) > 0 ? 1 : -1);
  537. s1++;
  538. s2++;
  539.     }
  540.     if (*s1)
  541. return -1;
  542.     if (*s2)
  543. return 1;
  544.     return 0;
  545. }
  546. static int
  547. parse_subtree(subtree, input, output, out_len)
  548.      struct snmp_mib_tree *subtree;
  549.      char *input;
  550.      oid *output;
  551.      int *out_len; /* number of subid's */
  552. {
  553.     char buf[128], *to = buf;
  554.     u_int subid = 0;
  555.     struct snmp_mib_tree *tp;
  556.     /*
  557.      * No empty strings.  Can happen if there is a trailing '.' or two '.'s
  558.      * in a row, i.e. "..".
  559.      */
  560.     if ((*input == '') ||
  561. (*input == '.'))
  562. return (0);
  563.     if (isdigit(*input)) {
  564. /*
  565.  * Read the number, then try to find it in the subtree.
  566.  */
  567. while (isdigit(*input)) {
  568.     subid *= 10;
  569.     subid += *input++ - '0';
  570. }
  571. for (tp = subtree; tp; tp = tp->next_peer) {
  572.     if (tp->subid == subid)
  573. goto found;
  574. }
  575. tp = NULL;
  576.     } else {
  577. /*
  578.  * Read the name into a buffer.
  579.  */
  580. while ((*input != '') &&
  581.     (*input != '.')) {
  582.     *to++ = *input++;
  583. }
  584. *to = '';
  585. /*
  586.  * Find the name in the subtree;
  587.  */
  588. for (tp = subtree; tp; tp = tp->next_peer) {
  589.     if (lc_cmp(tp->label, buf) == 0) {
  590. subid = tp->subid;
  591. goto found;
  592.     }
  593. }
  594. /*
  595.  * If we didn't find the entry, punt...
  596.  */
  597. if (tp == NULL) {
  598.     snmplib_debug(0, "sub-identifier not found: %sn", buf);
  599.     return (0);
  600. }
  601.     }
  602.   found:
  603.     if (subid > (u_int) MAX_SUBID) {
  604. snmplib_debug(0, "sub-identifier too large: %sn", buf);
  605. return (0);
  606.     }
  607.     if ((*out_len)-- <= 0) {
  608. snmplib_debug(0, "object identifier too longn");
  609. return (0);
  610.     }
  611.     *output++ = subid;
  612.     if (*input != '.')
  613. return (1);
  614.     if ((*out_len =
  615.     parse_subtree(tp ? tp->child_list : NULL, ++input, output, out_len)) == 0)
  616. return (0);
  617.     return (++*out_len);
  618. }
  619. int 
  620. read_objid(input, output, out_len)
  621.      char *input;
  622.      oid *output;
  623.      int *out_len; /* number of subid's in "output" */
  624. {
  625.     struct snmp_mib_tree *root = Mib;
  626.     oid *op = output;
  627.     int i;
  628.     if (*input == '.')
  629. input++;
  630.     else {
  631. root = find_rfc1066_mib(root);
  632. for (i = 0; i < sizeof(RFC1066_MIB) / sizeof(oid); i++) {
  633.     if ((*out_len)-- > 0)
  634. *output++ = RFC1066_MIB[i];
  635.     else {
  636. snmplib_debug(0, "object identifier too longn");
  637. return (0);
  638.     }
  639. }
  640.     }
  641.     if (root == NULL) {
  642. snmplib_debug(0, "Mib not initialized.n");
  643. return 0;
  644.     }
  645.     if ((*out_len = parse_subtree(root, input, output, out_len)) == 0)
  646. return (0);
  647.     *out_len += output - op;
  648.     return (1);
  649. }
  650. void 
  651. print_objid(objid, objidlen)
  652.      oid *objid;
  653.      int objidlen; /* number of subidentifiers */
  654. {
  655.     char buf[256];
  656.     struct snmp_mib_tree *subtree = Mib;
  657.     *buf = '.'; /* this is a fully qualified name */
  658.     get_symbol(objid, objidlen, subtree, buf + 1);
  659.     snmplib_debug(7, "%sn", buf);
  660. }
  661. void 
  662. sprint_objid(buf, objid, objidlen)
  663.      char *buf;
  664.      oid *objid;
  665.      int objidlen; /* number of subidentifiers */
  666. {
  667.     struct snmp_mib_tree *subtree = Mib;
  668.     *buf = '.'; /* this is a fully qualified name */
  669.     get_symbol(objid, objidlen, subtree, buf + 1);
  670. }
  671. #if 0
  672. void 
  673. print_variable(objid, objidlen, pvariable)
  674.      oid *objid;
  675.      int objidlen;
  676.      struct variable_list *pvariable;
  677. {
  678.     char buf[1024], *cp;
  679.     struct snmp_mib_tree *subtree = Mib;
  680.     *buf = '.'; /* this is a fully qualified name */
  681.     subtree = get_symbol(objid, objidlen, subtree, buf + 1);
  682.     cp = buf;
  683.     if ((strlen(buf) >= strlen((char *) RFC1066_MIB_text)) && !memcmp(buf, (char *) RFC1066_MIB_text,
  684.     strlen((char *) RFC1066_MIB_text))) {
  685. cp += sizeof(RFC1066_MIB_text);
  686.     }
  687.     printf("Name: %s -> ", cp);
  688.     *buf = '';
  689.     if (subtree->printer)
  690. (*subtree->printer) (buf, pvariable, subtree->enums, 0);
  691.     else {
  692. sprint_by_type(buf, pvariable, subtree->enums, 0);
  693.     }
  694.     printf("%sn", buf);
  695. }
  696. void 
  697. sprint_variable(buf, objid, objidlen, pvariable)
  698.      char *buf;
  699.      oid *objid;
  700.      int objidlen;
  701.      struct variable_list *pvariable;
  702. {
  703.     char tempbuf[512], *cp;
  704.     struct snmp_mib_tree *subtree = Mib;
  705.     *tempbuf = '.'; /* this is a fully qualified name */
  706.     subtree = get_symbol(objid, objidlen, subtree, tempbuf + 1);
  707.     cp = tempbuf;
  708.     if ((strlen(buf) >= strlen((char *) RFC1066_MIB_text)) && !memcmp(buf, (char *) RFC1066_MIB_text,
  709.     strlen((char *) RFC1066_MIB_text))) {
  710. cp += sizeof(RFC1066_MIB_text);
  711.     }
  712.     sprintf(buf, "Name: %s -> ", cp);
  713.     buf += strlen(buf);
  714.     if (subtree->printer)
  715. (*subtree->printer) (buf, pvariable, subtree->enums, 0);
  716.     else {
  717. sprint_by_type(buf, pvariable, subtree->enums, 0);
  718.     }
  719.     strcat(buf, "n");
  720. }
  721. void 
  722. sprint_value(buf, objid, objidlen, pvariable)
  723.      char *buf;
  724.      oid *objid;
  725.      int objidlen;
  726.      struct variable_list *pvariable;
  727. {
  728.     char tempbuf[512];
  729.     struct snmp_mib_tree *subtree = Mib;
  730.     subtree = get_symbol(objid, objidlen, subtree, tempbuf);
  731.     if (subtree->printer)
  732. (*subtree->printer) (buf, pvariable, subtree->enums, 0);
  733.     else {
  734. sprint_by_type(buf, pvariable, subtree->enums, 0);
  735.     }
  736. }
  737. void 
  738. print_value(objid, objidlen, pvariable)
  739.      oid *objid;
  740.      int objidlen;
  741.      struct variable_list *pvariable;
  742. {
  743.     char tempbuf[512];
  744.     struct snmp_mib_tree *subtree = Mib;
  745.     subtree = get_symbol(objid, objidlen, subtree, tempbuf);
  746.     if (subtree->printer)
  747. (*subtree->printer) (tempbuf, pvariable, subtree->enums, 0);
  748.     else {
  749. sprint_by_type(tempbuf, pvariable, subtree->enums, 0);
  750.     }
  751.     printf("%sn", tempbuf);
  752. }
  753. #endif
  754. static struct snmp_mib_tree *
  755. get_symbol(objid, objidlen, subtree, buf)
  756.      oid *objid;
  757.      int objidlen;
  758.      struct snmp_mib_tree *subtree;
  759.      char *buf;
  760. {
  761.     struct snmp_mib_tree *return_tree = NULL;
  762.     for (; subtree; subtree = subtree->next_peer) {
  763. if (*objid == subtree->subid) {
  764.     strcpy(buf, subtree->label);
  765.     goto found;
  766. }
  767.     }
  768.     /* subtree not found */
  769.     while (objidlen--) { /* output rest of name, uninterpreted */
  770. sprintf(buf, "%u.", *objid++);
  771. while (*buf)
  772.     buf++;
  773.     }
  774.     *(buf - 1) = ''; /* remove trailing dot */
  775.     return NULL;
  776.   found:
  777.     if (objidlen > 1) {
  778. while (*buf)
  779.     buf++;
  780. *buf++ = '.';
  781. *buf = '';
  782. return_tree = get_symbol(objid + 1, objidlen - 1, subtree->child_list, buf);
  783.     }
  784.     if (return_tree != NULL)
  785. return return_tree;
  786.     else
  787. return subtree;
  788. }
  789. #if 0
  790. void 
  791. print_variable_list(variable_list * V)
  792. {
  793.     print_variable(V->name, V->name_length, V);
  794. }
  795. void 
  796. print_variable_list_value(variable_list * pvariable)
  797. {
  798.     char buf[512];
  799.     struct snmp_mib_tree *subtree = Mib;
  800.     *buf = '.'; /* this is a fully qualified name */
  801.     subtree = get_symbol(pvariable->name, pvariable->name_length, subtree, buf + 1);
  802.     *buf = '';
  803.     if (subtree->printer)
  804. (*subtree->printer) (buf, pvariable, subtree->enums, 1);
  805.     else {
  806. sprint_by_type(buf, pvariable, subtree->enums, 1);
  807.     }
  808.     printf("%s", buf);
  809. }
  810. #endif
  811. void 
  812. print_type(variable_list * var)
  813. {
  814.     switch (var->type) {
  815.     case SMI_INTEGER:
  816. printf("Integer");
  817. break;
  818.     case SMI_STRING:
  819. printf("Octet String");
  820. break;
  821.     case SMI_OPAQUE:
  822. printf("Opaque");
  823. break;
  824.     case SMI_OBJID:
  825. printf("Object Identifier");
  826. break;
  827.     case SMI_TIMETICKS:
  828. printf("Timeticks");
  829. break;
  830.     case SMI_GAUGE32:
  831. printf("Gauge");
  832. break;
  833.     case SMI_COUNTER32:
  834. printf("Counter");
  835. break;
  836.     case SMI_IPADDRESS:
  837. printf("IP Address");
  838. break;
  839.     case SMI_NULLOBJ:
  840. printf("NULL");
  841. break;
  842.     default:
  843. printf("Unknown type %dn", var->type);
  844. break;
  845.     }
  846. }
  847. void 
  848. print_oid_nums(oid * O, int len)
  849. {
  850.     int x;
  851.     for (x = 0; x < len; x++)
  852. printf(".%u", O[x]);
  853. }