#!/bin/sh # This is snmp2, a shell archive (produced by GNU sharutils 4.1) # To extract the files from this archive, save it to some FILE, remove # everything before the `!/bin/sh' line above, then type `sh FILE'. # # Made on 1994-12-02 10:25 MST by . # Source directory was `/ymir/dt'. # # Existing files will *not* be overwritten unless `-c' is specified. # # This is part 1 of a multipart archive. # Do not concatenate these parts, unpack them in order with `/bin/sh'. # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ # 30874 -rw-r--r-- snmp2/snmplib/asn1.c # 26128 -rw-r--r-- snmp2/snmplib/mib.c # 45738 -rw-r--r-- snmp2/snmplib/parse.c # 6416 -rw-r--r-- snmp2/snmplib/snmp.c # 41889 -rw-r--r-- snmp2/snmplib/snmp_api.c # 17385 -rw-r--r-- snmp2/snmplib/snmp_auth.c # 17251 -rw-r--r-- snmp2/snmplib/snmp_client.c # 2704 -rw-r--r-- snmp2/snmplib/asn1.h # 10793 -r--r--r-- snmp2/snmplib/mib.h # 3009 -rw-r--r-- snmp2/snmplib/parse.h # 2959 -rw-r--r-- snmp2/snmplib/snmp.h # 9216 -rw-r--r-- snmp2/snmplib/snmp_api.h # 1488 -rw-r--r-- snmp2/snmplib/snmp_client.h # 4221 -rw-r--r-- snmp2/snmplib/snmp_impl.h # 1418 -rw-r--r-- snmp2/snmplib/Makefile # 4150 -rw-r--r-- snmp2/snmplib/acl_parse.c # 1926 -rw-r--r-- snmp2/snmplib/acl.h # 10707 -rw-r--r-- snmp2/snmplib/party_parse.c # 3350 -rw-r--r-- snmp2/snmplib/party.h # 2516 -rw-r--r-- snmp2/snmplib/party.c # 1841 -rw-r--r-- snmp2/snmplib/acl.c # 2233 -rw-r--r-- snmp2/snmplib/view.c # 1936 -rw-r--r-- snmp2/snmplib/view.h # 10642 -rw-r--r-- snmp2/snmplib/md5.c # 1844 -rw-r--r-- snmp2/snmplib/md5.h # 2627 -rw-r--r-- snmp2/snmplib/context.h # 2667 -rw-r--r-- snmp2/snmplib/context.c # 4536 -rw-r--r-- snmp2/snmplib/context_parse.c # 3628 -rw-r--r-- snmp2/snmplib/system.c # 1202 -rw-r--r-- snmp2/snmplib/system.h # 0 -rw-r--r-- snmp2/snmplib/.pure # 1657 -rw-r--r-- snmp2/snmplib/Makefile.vxWorks # 1418 -rw-r--r-- snmp2/snmplib/Makefile.unix # 1041 -rw-r--r-- snmp2/snmplib/VXnetdb.h # 512 -rw-r--r-- snmp2/snmplib/VXnlist.h # 469 -rw-r--r-- snmp2/snmplib/VXtime.h # 203 -rw-r--r-- snmp2/snmplib/VXtypes.h # 229 -rw-r--r-- snmp2/snmplib/VXif_ether.h # 138 -rw-r--r-- snmp2/snmplib/VXparam.h # 4222 -rw-r--r-- snmp2/snmplib/#snmp_impl.h# # 952 -rw-r--r-- snmp2/apps/Makefile # 10154 -rw-r--r-- snmp2/apps/snmpget.c # 10443 -rw-r--r-- snmp2/apps/snmpbulkwalk.c # 17608 -rw-r--r-- snmp2/apps/snmptest.c # 10968 -rw-r--r-- snmp2/apps/snmpwalk.c # 2816 -rw-r--r-- snmp2/apps/snmptranslate.c # 1283 -rw-r--r-- snmp2/apps/snmpnetstat/Makefile # 9745 -rw-r--r-- snmp2/apps/snmpnetstat/if.c # 14211 -rw-r--r-- snmp2/apps/snmpnetstat/inet.c # 12868 -rw-r--r-- snmp2/apps/snmpnetstat/main.c # 151 -rw-r--r-- snmp2/apps/snmpnetstat/main.h # 12031 -rw-r--r-- snmp2/apps/snmpnetstat/route.c # 13712 -rw-r--r-- snmp2/apps/snmptrapd.c # 952 -rw-r--r-- snmp2/apps/Makefile.unix # 1164 -rw-r--r-- snmp2/apps/Makefile.vxWorks # 2987 -rw-r--r-- snmp2/apps/exec.c # 0 -rw-r--r-- snmp2/lib/.pure # 1040 -rw-r--r-- snmp2/Makefile # 853 -rw-r--r-- snmp2/README # 440011 -rwxr-xr-x snmp2/mib.txt # 4241 -r--r--r-- snmp2/tcl/init.tcl # 1603 -r--r--r-- snmp2/tcl/mkindex.tcl # 1001 -r--r--r-- snmp2/tcl/parray.tcl # 277 -rw-r--r-- snmp2/tcl/tclIndex # 8507 -rw-r--r-- snmp2/man/snmp_api.3 # 3855 -rw-r--r-- snmp2/man/snmptest.1 # 3122 -rw-r--r-- snmp2/man/snmpwalk.1 # 2850 -rw-r--r-- snmp2/man/variables.5 # 1539 -rw-r--r-- snmp2/man/des.1 # 1956 -rw-r--r-- snmp2/man/des.3 # 682 -rw-r--r-- snmp2/man/README # 625 -rw-r--r-- snmp2/etc/acl.conf # 2421 -rw-r--r-- snmp2/etc/party.conf # 595 -rw-r--r-- snmp2/etc/view.conf # 853 -rw-r--r-- snmp2/etc/context.conf # 385 -rw-r--r-- snmp2/etc/README # 2232 -r--r--r-- snmp2/tk/button.tcl # 1762 -r--r--r-- snmp2/tk/entry.tcl # 1170 -r--r--r-- snmp2/tk/listbox.tcl # 8987 -rw-r--r-- snmp2/tk/menu.tcl # 3124 -r--r--r-- snmp2/tk/text.tcl # 10433 -r--r--r-- snmp2/tk/tk.tcl # 174 -r--r--r-- snmp2/tk/tkerror.tcl # 901 -r--r--r-- snmp2/tk/wish.tcl # 753 -rw-r--r-- snmp2/tk/tclIndex # 1279 -rw-r--r-- snmp2/snmptcl/Imakefile # 10557 -rw-r--r-- snmp2/snmptcl/Makefile # 1568 -rw-r--r-- snmp2/snmptcl/README # 11446 -r--r--r-- snmp2/snmptcl/all.c # 177403 -rw-r--r-- snmp2/snmptcl/graph.c # 80287 -r--r--r-- snmp2/snmptcl/htext2.c # 1842 -r--r--r-- snmp2/snmptcl/main.c # 36338 -rw-r--r-- snmp2/snmptcl/tcl_snmp.c # 11473 -rw-r--r-- snmp2/snmptcl/wish.c # 986 -r--r--r-- snmp2/snmptcl/tcl_misc.h # 7842 -rw-r--r-- snmp2/snmptcl/snmpgraph.ps # 6367 -rwxr-xr-x snmp2/snmptcl/snmpgraph # 1060 -rw-r--r-- snmp2/Makefile.vxWorks # 1040 -rw-r--r-- snmp2/Makefile.unix # 487 -rw-r--r-- snmp2/load.vxWorks # 113800 -rw-r--r-- snmp2/agent/snmp_vars.c # 6050 -rw-r--r-- snmp2/agent/snmp_vars.h # 1764 -rw-r--r-- snmp2/agent/Makefile # 1764 -rw-r--r-- snmp2/agent/Makefile.unix # 2017 -rw-r--r-- snmp2/agent/Makefile.vxWorks # 730 -rw-r--r-- snmp2/agent/acl.conf # 8348 -rw-r--r-- snmp2/agent/acl_vars.c # 34090 -rw-r--r-- snmp2/agent/alarm.c # 2557 -rw-r--r-- snmp2/agent/alarm.h # 21165 -rw-r--r-- snmp2/agent/context_vars.c # 42012 -rw-r--r-- snmp2/agent/event.c # 2088 -rw-r--r-- snmp2/agent/event.h # 2145 -rw-r--r-- snmp2/agent/history.c # 3591 -r--r--r-- snmp2/agent/history.h # 1387 -rw-r--r-- snmp2/agent/kernel.c # 1268 -rw-r--r-- snmp2/agent/m2m.h # 21821 -rw-r--r-- snmp2/agent/party_vars.c # 8372 -rw-r--r-- snmp2/agent/route_write.c # 30229 -rw-r--r-- snmp2/agent/snmp_agent.c # 12054 -rw-r--r-- snmp2/agent/snmp_var_route.c # 2525 -r--r--r-- snmp2/agent/snmp_vars_event.h # 2839 -rw-r--r-- snmp2/agent/snmp_vars_m2m.h # 19793 -rw-r--r-- snmp2/agent/snmpd.c # 2964 -rw-r--r-- snmp2/agent/view_parse.c # 9826 -rw-r--r-- snmp2/agent/view_vars.c # 2885 -rw-r--r-- snmp2/agent/vxWorksAnnotations.h # 2605 -rw-r--r-- snmp2/agent/Lookup_Device_Annotation.c # 177 -rw-r--r-- snmp2/loadSnmp # 9108 -rw-r--r-- snmp2/README.vxWorks # 399 -rw-r--r-- snmp2/vx/Makefile # 8109 -rw-r--r-- snmp2/vx/qsort.c # 13317 -rw-r--r-- snmp2/vx/random.c # 4958 -rw-r--r-- snmp2/vx/strcasecmp.c # 4375 -rw-r--r-- snmp2/vx/exec.c # 12276 -rw-r--r-- snmp2/vx/load.c # 3553 -rw-r--r-- snmp2/vx/nlist.c # 6380 -rw-r--r-- snmp2/vx/inet_vx.c # 1918 -rw-r--r-- snmp2/vx/gettimeofday.c # 405 -rw-r--r-- snmp2/vx/generic.c # 437 -rw-r--r-- snmp2/vx/m147.c # 444 -rw-r--r-- snmp2/vx/m162.c # 442 -rw-r--r-- snmp2/vx/m167.c # 25519 -rw-r--r-- snmp2/vx/ypdata.h # 122 -rw-r--r-- snmp2/vx/ypstruct.h # 0 -rw-r--r-- snmp2/vx/psos_cfg.h # 24 -rw-r--r-- snmp2/vx/pna.h # 2481 -rw-r--r-- snmp2/vx/syslog.c # touch -am 1231235999 $$.touch >/dev/null 2>&1 if test ! -f 1231235999 && test -f $$.touch; then shar_touch=touch else shar_touch=: echo echo 'WARNING: not restoring timestamps. Consider getting and' echo "installing GNU \`touch', distributed in GNU File Utilities..." echo fi rm -f 1231235999 $$.touch # if test -r _sharseq.tmp; then echo 'Must unpack archives in sequence!' echo Please unpack part `cat _sharseq.tmp` next exit 1 fi # ============= snmp2/snmplib/asn1.c ============== if test ! -d 'snmp2'; then echo 'x - creating directory snmp2' mkdir 'snmp2' fi if test ! -d 'snmp2/snmplib'; then echo 'x - creating directory snmp2/snmplib' mkdir 'snmp2/snmplib' fi if test -f 'snmp2/snmplib/asn1.c' && test X"$1" != X"-c"; then echo 'x - skipping snmp2/snmplib/asn1.c (file already exists)' rm -f _sharnew.tmp else > _sharnew.tmp echo 'x - extracting snmp2/snmplib/asn1.c (text)' sed 's/^X//' << 'SHAR_EOF' > 'snmp2/snmplib/asn1.c' && /* X * Abstract Syntax Notation One, ASN.1 X * As defined in ISO/IS 8824 and ISO/IS 8825 X * This implements a subset of the above International Standards that X * is sufficient to implement SNMP. X * X * Encodes abstract data types into a machine independent stream of bytes. X * X */ /********************************************************************** X Copyright 1988, 1989, 1991, 1992 by Carnegie Mellon University X X All Rights Reserved X Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of CMU not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. X CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ #ifdef KINETICS #include "gw.h" #endif X #if (defined(unix) && !defined(KINETICS)) #include #include #endif X #ifdef vms #include #endif X #ifdef VXWORKS #include #endif X #include "asn1.h" X #ifndef NULL #define NULL 0 #endif X #ifdef VXWORKS_DEBUG #define ERROR(string) printf("%s(%d): %s\n",__FILE__, __LINE__, string); #else #define ERROR(string) #endif X /* X * asn_parse_int - pulls a long out of an ASN int type. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * following the end of this object. X * X * Returns a pointer to the first byte past the end X * of this object (i.e. the start of the next object). X * Returns NULL on any error. X */ u_char * asn_parse_int(data, datalength, type, intp, intsize) X register u_char *data; /* IN - pointer to start of object */ X register int *datalength;/* IN/OUT - number of valid bytes left in buffer */ X u_char *type; /* OUT - asn type of object */ X long *intp; /* IN/OUT - pointer to start of output buffer */ X int intsize; /* IN - size of output buffer */ { /* X * ASN.1 integer ::= 0x02 asnlength byte {byte}* X */ X register u_char *bufp = data; X u_long asn_length; X register long value = 0; X X if (intsize != sizeof (long)){ X ERROR("not long"); X return NULL; X } X *type = *bufp++; X bufp = asn_parse_length(bufp, &asn_length); X if (bufp == NULL){ X ERROR("bad length"); X return NULL; X } X if (asn_length + (bufp - data) > *datalength){ X ERROR("overflow of message"); X return NULL; X } X if (asn_length > intsize){ X ERROR("I don't support such large integers"); X return NULL; X } X *datalength -= (int)asn_length + (bufp - data); X if (*bufp & 0x80) X value = -1; /* integer is negative */ X while(asn_length--) X value = (value << 8) | *bufp++; X *intp = value; X return bufp; } X X /* X * asn_parse_unsigned_int - pulls an unsigned long out of an ASN int type. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * following the end of this object. X * X * Returns a pointer to the first byte past the end X * of this object (i.e. the start of the next object). X * Returns NULL on any error. X */ u_char * asn_parse_unsigned_int(data, datalength, type, intp, intsize) X register u_char *data; /* IN - pointer to start of object */ X register int *datalength;/* IN/OUT - number of valid bytes left in buffer */ X u_char *type; /* OUT - asn type of object */ X u_long *intp; /* IN/OUT - pointer to start of output buffer */ X int intsize; /* IN - size of output buffer */ { /* X * ASN.1 integer ::= 0x02 asnlength byte {byte}* X */ X register u_char *bufp = data; X u_long asn_length; X register u_long value = 0; X X if (intsize != sizeof (long)){ X ERROR("not long"); X return NULL; X } X *type = *bufp++; X bufp = asn_parse_length(bufp, &asn_length); X if (bufp == NULL){ X ERROR("bad length"); X return NULL; X } X if (asn_length + (bufp - data) > *datalength){ X ERROR("overflow of message"); X return NULL; X } X if ((asn_length > (intsize + 1)) || X ((asn_length == intsize + 1) && *bufp != 0x00)){ X ERROR("I don't support such large integers"); X return NULL; X } X *datalength -= (int)asn_length + (bufp - data); X if (*bufp & 0x80) X value = -1; /* integer is negative */ X while(asn_length--) X value = (value << 8) | *bufp++; X *intp = value; X return bufp; } X X /* X * asn_build_int - builds an ASN object containing an integer. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * following the end of this object. X * X * Returns a pointer to the first byte past the end X * of this object (i.e. the start of the next object). X * Returns NULL on any error. X */ u_char * asn_build_int(data, datalength, type, intp, intsize) X register u_char *data; /* IN - pointer to start of output buffer */ X register int *datalength;/* IN/OUT - number of valid bytes left in buffer */ X u_char type; /* IN - asn type of object */ X register long *intp; /* IN - pointer to start of long integer */ X register int intsize; /* IN - size of *intp */ { /* X * ASN.1 integer ::= 0x02 asnlength byte {byte}* X */ X X register long integer; X register u_long mask; X X if (intsize != sizeof (long)) X return NULL; X integer = *intp; X /* X * Truncate "unnecessary" bytes off of the most significant end of this X * 2's complement integer. There should be no sequence of 9 X * consecutive 1's or 0's at the most significant end of the X * integer. X */ X mask = 0x1FF << ((8 * (sizeof(long) - 1)) - 1); X /* mask is 0xFF800000 on a big-endian machine */ X while((((integer & mask) == 0) || ((integer & mask) == mask)) X && intsize > 1){ X intsize--; X integer <<= 8; X } X data = asn_build_header(data, datalength, type, intsize); X if (data == NULL) X return NULL; X if (*datalength < intsize) X return NULL; X *datalength -= intsize; X mask = 0xFF << (8 * (sizeof(long) - 1)); X /* mask is 0xFF000000 on a big-endian machine */ X while(intsize--){ X *data++ = (u_char)((integer & mask) >> (8 * (sizeof(long) - 1))); X integer <<= 8; X } X return data; } X X /* X * asn_build_unsigned_int - builds an ASN object containing an integer. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * following the end of this object. X * X * Returns a pointer to the first byte past the end X * of this object (i.e. the start of the next object). X * Returns NULL on any error. X */ u_char * asn_build_unsigned_int(data, datalength, type, intp, intsize) X register u_char *data; /* IN - pointer to start of output buffer */ X register int *datalength;/* IN/OUT - number of valid bytes left in buffer */ X u_char type; /* IN - asn type of object */ X register u_long *intp; /* IN - pointer to start of long integer */ X register int intsize; /* IN - size of *intp */ { /* X * ASN.1 integer ::= 0x02 asnlength byte {byte}* X */ X X register u_long integer; X register u_long mask; X int add_null_byte = 0; X X if (intsize != sizeof (long)) X return NULL; X integer = *intp; X mask = 0xFF << (8 * (sizeof(long) - 1)); X /* mask is 0xFF000000 on a big-endian machine */ X if ((u_char)((integer & mask) >> (8 * (sizeof(long) - 1))) & 0x80){ X /* if MSB is set */ X add_null_byte = 1; X intsize++; X } X /* X * Truncate "unnecessary" bytes off of the most significant end of this 2's complement integer. X * There should be no sequence of 9 consecutive 1's or 0's at the most significant end of the X * integer. X */ X mask = 0x1FF << ((8 * (sizeof(long) - 1)) - 1); X /* mask is 0xFF800000 on a big-endian machine */ X while((((integer & mask) == 0) || ((integer & mask) == mask)) && intsize > 1){ X intsize--; X integer <<= 8; X } X data = asn_build_header(data, datalength, type, intsize); X if (data == NULL) X return NULL; X if (*datalength < intsize) X return NULL; X *datalength -= intsize; X if (add_null_byte == 1){ X *data++ = '\0'; X intsize--; X } X mask = 0xFF << (8 * (sizeof(long) - 1)); X /* mask is 0xFF000000 on a big-endian machine */ X while(intsize--){ X *data++ = (u_char)((integer & mask) >> (8 * (sizeof(long) - 1))); X integer <<= 8; X } X return data; } X X /* X * asn_parse_string - pulls an octet string out of an ASN octet string type. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * following the beginning of the next object. X * X * "string" is filled with the octet string. X * X * Returns a pointer to the first byte past the end X * of this object (i.e. the start of the next object). X * Returns NULL on any error. X */ u_char * asn_parse_string(data, datalength, type, string, strlength) X u_char *data; /* IN - pointer to start of object */ X register int *datalength; /* IN/OUT - number of valid bytes left in buffer */ X u_char *type; /* OUT - asn type of object */ X u_char *string; /* IN/OUT - pointer to start of output buffer */ X register int *strlength; /* IN/OUT - size of output buffer */ { /* X * ASN.1 octet string ::= primstring | cmpdstring X * primstring ::= 0x04 asnlength byte {byte}* X * cmpdstring ::= 0x24 asnlength string {string}* X */ X register u_char *bufp = data; X u_long asn_length; X X *type = *bufp++; X bufp = asn_parse_length(bufp, &asn_length); X if (bufp == NULL) X return NULL; X if (asn_length + (bufp - data) > *datalength){ X ERROR("overflow of message"); X return NULL; X } X if (asn_length > *strlength){ X ERROR("I don't support such long strings"); X return NULL; X } X bcopy((char *)bufp, (char *)string, (int)asn_length); X *strlength = (int)asn_length; X *datalength -= (int)asn_length + (bufp - data); X return bufp + asn_length; } X X /* X * asn_build_string - Builds an ASN octet string object containing the input string. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * following the beginning of the next object. X * X * Returns a pointer to the first byte past the end X * of this object (i.e. the start of the next object). X * Returns NULL on any error. X */ u_char * asn_build_string(data, datalength, type, string, strlength) X u_char *data; /* IN - pointer to start of object */ X register int *datalength; /* IN/OUT - number of valid bytes left in buffer */ X u_char type; /* IN - ASN type of string */ X u_char *string; /* IN - pointer to start of input buffer */ X register int strlength; /* IN - size of input buffer */ { /* X * ASN.1 octet string ::= primstring | cmpdstring X * primstring ::= 0x04 asnlength byte {byte}* X * cmpdstring ::= 0x24 asnlength string {string}* X * This code will never send a compound string. X */ X data = asn_build_header(data, datalength, type, strlength); X if (data == NULL) X return NULL; X if (*datalength < strlength) X return NULL; X bcopy((char *)string, (char *)data, strlength); X *datalength -= strlength; X return data + strlength; } X X /* X * asn_parse_header - interprets the ID and length of the current object. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * in this object following the id and length. X * X * Returns a pointer to the first byte of the contents of this object. X * Returns NULL on any error. X */ u_char * asn_parse_header(data, datalength, type) X u_char *data; /* IN - pointer to start of object */ X int *datalength;/* IN/OUT - number of valid bytes left in buffer */ X u_char *type; /* OUT - ASN type of object */ { X register u_char *bufp = data; X register header_len; X u_long asn_length; X X /* this only works on data types < 30, i.e. no extension octets */ X if (IS_EXTENSION_ID(*bufp)){ X ERROR("can't process ID >= 30"); X return NULL; X } X *type = *bufp; X bufp = asn_parse_length(bufp + 1, &asn_length); X if (bufp == NULL) X return NULL; X header_len = bufp - data; X if (header_len + asn_length > *datalength){ X ERROR("asn length too long"); X return NULL; X } X *datalength = (int)asn_length; X return bufp; } X /* X * asn_build_header - builds an ASN header for an object with the ID and X * length specified. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * in this object following the id and length. X * X * This only works on data types < 30, i.e. no extension octets. X * The maximum length is 0xFFFF; X * X * Returns a pointer to the first byte of the contents of this object. X * Returns NULL on any error. X */ u_char * asn_build_header(data, datalength, type, length) X register u_char *data; /* IN - pointer to start of object */ X int *datalength;/* IN/OUT - number of valid bytes left in buffer */ X u_char type; /* IN - ASN type of object */ X int length; /* IN - length of object */ { X if (*datalength < 1) X return NULL; X *data++ = type; X (*datalength)--; X return asn_build_length(data, datalength, length); X } X /* X * asn_build_sequence - builds an ASN header for a sequence with the ID and X * length specified. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * in this object following the id and length. X * X * This only works on data types < 30, i.e. no extension octets. X * The maximum length is 0xFFFF; X * X * Returns a pointer to the first byte of the contents of this object. X * Returns NULL on any error. X */ u_char * asn_build_sequence(data, datalength, type, length) X register u_char *data; /* IN - pointer to start of object */ X int *datalength;/* IN/OUT - number of valid bytes left in buffer */ X u_char type; /* IN - ASN type of object */ X int length; /* IN - length of object */ { X *datalength -= 4; X if (*datalength < 0){ X *datalength += 4; /* fix up before punting */ X return NULL; X } X *data++ = type; X *data++ = (u_char)(0x02 | ASN_LONG_LEN); X *data++ = (u_char)((length >> 8) & 0xFF); X *data++ = (u_char)(length & 0xFF); X return data; } X /* X * asn_parse_length - interprets the length of the current object. X * On exit, length contains the value of this length field. X * X * Returns a pointer to the first byte after this length X * field (aka: the start of the data field). X * Returns NULL on any error. X */ u_char * asn_parse_length(data, length) X u_char *data; /* IN - pointer to start of length field */ X u_long *length; /* OUT - value of length field */ { X register u_char lengthbyte = *data; X X if (lengthbyte & ASN_LONG_LEN){ X lengthbyte &= ~ASN_LONG_LEN; /* turn MSb off */ X if (lengthbyte == 0){ X ERROR("We don't support indefinite lengths"); X return NULL; X } X if (lengthbyte > sizeof(long)){ X ERROR("we can't support data lengths that long"); X return NULL; X } X bcopy((char *)data + 1, (char *)length, (int)lengthbyte); X *length = ntohl(*length); X *length >>= (8 * ((sizeof *length) - lengthbyte)); X return data + lengthbyte + 1; X } else { /* short asnlength */ X *length = (long)lengthbyte; X return data + 1; X } } X u_char * asn_build_length(data, datalength, length) X register u_char *data; /* IN - pointer to start of object */ X int *datalength;/* IN/OUT - number of valid bytes left in buffer */ X register int length; /* IN - length of object */ { X u_char *start_data = data; X X /* no indefinite lengths sent */ X if (length < 0x80){ X if (*datalength < 1){ X ERROR("build_length"); X return NULL; X } X *data++ = (u_char)length; X } else if (length <= 0xFF){ X if (*datalength < 2){ X ERROR("build_length"); X return NULL; X } X *data++ = (u_char)(0x01 | ASN_LONG_LEN); X *data++ = (u_char)length; X } else { /* 0xFF < length <= 0xFFFF */ X if (*datalength < 3){ X ERROR("build_length"); X return NULL; X } X *data++ = (u_char)(0x02 | ASN_LONG_LEN); X *data++ = (u_char)((length >> 8) & 0xFF); X *data++ = (u_char)(length & 0xFF); X } X *datalength -= (data - start_data); X return data; X } X /* X * asn_parse_objid - pulls an object indentifier out of an ASN object identifier type. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * following the beginning of the next object. X * X * "objid" is filled with the object identifier. X * X * Returns a pointer to the first byte past the end X * of this object (i.e. the start of the next object). X * Returns NULL on any error. X */ u_char * asn_parse_objid(data, datalength, type, objid, objidlength) X u_char *data; /* IN - pointer to start of object */ X int *datalength; /* IN/OUT - number of valid bytes left in buffer */ X u_char *type; /* OUT - ASN type of object */ X oid *objid; /* IN/OUT - pointer to start of output buffer */ X int *objidlength; /* IN/OUT - number of sub-id's in objid */ { /* X * ASN.1 objid ::= 0x06 asnlength subidentifier {subidentifier}* X * subidentifier ::= {leadingbyte}* lastbyte X * leadingbyte ::= 1 7bitvalue X * lastbyte ::= 0 7bitvalue X */ X register u_char *bufp = data; X register oid *oidp = objid + 1; X register u_long subidentifier; X register long length; X u_long asn_length; X X *type = *bufp++; X bufp = asn_parse_length(bufp, &asn_length); X if (bufp == NULL) X return NULL; X if (asn_length + (bufp - data) > *datalength){ X ERROR("overflow of message"); X return NULL; X } X *datalength -= (int)asn_length + (bufp - data); X X /* Handle invalid object identifier encodings of the form 06 00 robustly */ X if (asn_length == 0) X objid[0] = objid[1] = 0; X X length = asn_length; X (*objidlength)--; /* account for expansion of first byte */ X while (length > 0 && (*objidlength)-- > 0){ X subidentifier = 0; X do { /* shift and add in low order 7 bits */ X subidentifier = (subidentifier << 7) + (*(u_char *)bufp & ~ASN_BIT8); X length--; X } while (*(u_char *)bufp++ & ASN_BIT8); /* last byte has high bit clear */ X if (subidentifier > (u_long)MAX_SUBID){ X ERROR("subidentifier too long"); X return NULL; X } X *oidp++ = (oid)subidentifier; X } X X /* X * The first two subidentifiers are encoded into the first component X * with the value (X * 40) + Y, where: X * X is the value of the first subidentifier. X * Y is the value of the second subidentifier. X */ X subidentifier = (u_long)objid[1]; X if (subidentifier == 0x2B){ X objid[0] = 1; X objid[1] = 3; X } else { X objid[1] = (u_char)(subidentifier % 40); X objid[0] = (u_char)((subidentifier - objid[1]) / 40); X } X X *objidlength = (int)(oidp - objid); X return bufp; } X /* X * asn_build_objid - Builds an ASN object identifier object containing the X * input string. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * following the beginning of the next object. X * X * Returns a pointer to the first byte past the end X * of this object (i.e. the start of the next object). X * Returns NULL on any error. X */ u_char * asn_build_objid(data, datalength, type, objid, objidlength) X register u_char *data; /* IN - pointer to start of object */ X int *datalength; /* IN/OUT - number of valid bytes left in buffer */ X u_char type; /* IN - ASN type of object */ X oid *objid; /* IN - pointer to start of input buffer */ X int objidlength; /* IN - number of sub-id's in objid */ { /* X * ASN.1 objid ::= 0x06 asnlength subidentifier {subidentifier}* X * subidentifier ::= {leadingbyte}* lastbyte X * leadingbyte ::= 1 7bitvalue X * lastbyte ::= 0 7bitvalue X */ X u_char buf[MAX_OID_LEN]; X register u_char *bp = buf; X register oid *op = objid; X int asnlength; X register u_long subid, mask, testmask; X register int bits, testbits; X X if (objidlength < 2){ X *bp++ = 0; X objidlength = 0; X } else { X *bp++ = op[1] + (op[0] * 40); X objidlength -= 2; X op += 2; X } X X while(objidlength-- > 0){ X subid = *op++; X if (subid < 127){ /* off by one? */ X *bp++ = subid; X } else { X mask = 0x7F; /* handle subid == 0 case */ X bits = 0; X /* testmask *MUST* !!!! be of an unsigned type */ X for(testmask = 0x7F, testbits = 0; testmask != 0; X testmask <<= 7, testbits += 7){ X if (subid & testmask){ /* if any bits set */ X mask = testmask; X bits = testbits; X } X } X /* mask can't be zero here */ X for(;mask != 0x7F; mask >>= 7, bits -= 7){ X /* fix a mask that got truncated above */ X if (mask == 0x1E00000) X mask = 0xFE00000; X *bp++ = (u_char)(((subid & mask) >> bits) | ASN_BIT8); X } X *bp++ = (u_char)(subid & mask); X } X } X asnlength = bp - buf; X data = asn_build_header(data, datalength, type, asnlength); X if (data == NULL) X { X ERROR ("data == NULL"); X return NULL; X } X if (*datalength < asnlength) X { X ERROR ("*datalength < asnlength"); X return NULL; X } X bcopy((char *)buf, (char *)data, asnlength); X *datalength -= asnlength; X return data + asnlength; } X /* X * asn_parse_null - Interprets an ASN null type. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * following the beginning of the next object. X * X * Returns a pointer to the first byte past the end X * of this object (i.e. the start of the next object). X * Returns NULL on any error. X */ u_char * asn_parse_null(data, datalength, type) X u_char *data; /* IN - pointer to start of object */ X int *datalength; /* IN/OUT - number of valid bytes left in buffer */ X u_char *type; /* OUT - ASN type of object */ { /* X * ASN.1 null ::= 0x05 0x00 X */ X register u_char *bufp = data; X u_long asn_length; X X *type = *bufp++; X bufp = asn_parse_length(bufp, &asn_length); X if (bufp == NULL) X return NULL; X if (asn_length != 0){ X ERROR("Malformed NULL"); X return NULL; X } X *datalength -= (bufp - data); X return bufp + asn_length; } X X /* X * asn_build_null - Builds an ASN null object. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * following the beginning of the next object. X * X * Returns a pointer to the first byte past the end X * of this object (i.e. the start of the next object). X * Returns NULL on any error. X */ u_char * asn_build_null(data, datalength, type) X u_char *data; /* IN - pointer to start of object */ X int *datalength; /* IN/OUT - number of valid bytes left in buffer */ X u_char type; /* IN - ASN type of object */ { /* X * ASN.1 null ::= 0x05 0x00 X */ X return asn_build_header(data, datalength, type, 0); } X /* X * asn_parse_bitstring - pulls a bitstring out of an ASN bitstring type. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * following the beginning of the next object. X * X * "string" is filled with the bit string. X * X * Returns a pointer to the first byte past the end X * of this object (i.e. the start of the next object). X * Returns NULL on any error. X */ u_char * asn_parse_bitstring(data, datalength, type, string, strlength) X u_char *data; /* IN - pointer to start of object */ X register int *datalength; /* IN/OUT - number of valid bytes left in buffer */ X u_char *type; /* OUT - asn type of object */ X u_char *string; /* IN/OUT - pointer to start of output buffer */ X register int *strlength; /* IN/OUT - size of output buffer */ { /* X * bitstring ::= 0x03 asnlength unused {byte}* X */ X register u_char *bufp = data; X u_long asn_length; X X *type = *bufp++; X bufp = asn_parse_length(bufp, &asn_length); X if (bufp == NULL) X return NULL; X if (asn_length + (bufp - data) > *datalength){ X ERROR("overflow of message"); X return NULL; X } X if (asn_length > *strlength){ X ERROR("I don't support such long bitstrings"); X return NULL; X } X if (asn_length < 1){ X ERROR("Invalid bitstring"); X return NULL; X } X if (*bufp < 0 || *bufp > 7){ X ERROR("Invalid bitstring"); X return NULL; X } X bcopy((char *)bufp, (char *)string, (int)asn_length); X *strlength = (int)asn_length; X *datalength -= (int)asn_length + (bufp - data); X return bufp + asn_length; } X X /* X * asn_build_bitstring - Builds an ASN bit string object containing the X * input string. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * following the beginning of the next object. X * X * Returns a pointer to the first byte past the end X * of this object (i.e. the start of the next object). X * Returns NULL on any error. X */ u_char * asn_build_bitstring(data, datalength, type, string, strlength) X u_char *data; /* IN - pointer to start of object */ X register int *datalength; /* IN/OUT - number of valid bytes left in buffer */ X u_char type; /* IN - ASN type of string */ X u_char *string; /* IN - pointer to start of input buffer */ X register int strlength; /* IN - size of input buffer */ { /* X * ASN.1 bit string ::= 0x03 asnlength unused {byte}* X */ X if (strlength < 1 || *string < 0 || *string > 7){ X ERROR("Building invalid bitstring"); X return NULL; X } X data = asn_build_header(data, datalength, type, strlength); X if (data == NULL) X return NULL; X if (*datalength < strlength) X return NULL; X bcopy((char *)string, (char *)data, strlength); X *datalength -= strlength; X return data + strlength; } X X /* X * asn_parse_unsigned_int64 - pulls a 64 bit unsigned long out of an ASN int X * type. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * following the end of this object. X * X * Returns a pointer to the first byte past the end X * of this object (i.e. the start of the next object). X * Returns NULL on any error. X */ u_char * asn_parse_unsigned_int64(data, datalength, type, cp, countersize) X register u_char *data; /* IN - pointer to start of object */ X register int *datalength;/* IN/OUT - number of valid bytes left in buffer */ X u_char *type; /* OUT - asn type of object */ X struct counter64 *cp; /* IN/OUT -pointer to counter struct */ X int countersize;/* IN - size of output buffer */ { /* X * ASN.1 integer ::= 0x02 asnlength byte {byte}* X */ X register u_char *bufp = data; X u_long asn_length; X register u_long low = 0, high = 0; X int intsize = 4; X X if (countersize != sizeof(struct counter64)){ X ERROR("not right size"); X return NULL; X } X *type = *bufp++; X bufp = asn_parse_length(bufp, &asn_length); X if (bufp == NULL){ X ERROR("bad length"); X return NULL; X } X if (asn_length + (bufp - data) > *datalength){ X ERROR("overflow of message"); X return NULL; X } X if ((asn_length > (intsize * 2 + 1)) || X ((asn_length == (intsize * 2) + 1) && *bufp != 0x00)){ X ERROR("I don't support such large integers"); X return NULL; X } X *datalength -= (int)asn_length + (bufp - data); X if (*bufp & 0x80){ X low = -1; /* integer is negative */ X high = -1; X } X while(asn_length--){ X high = (high << 8) | ((low & 0xFF000000) >> 24); X low = (low << 8) | *bufp++; X } X cp->low = low; X cp->high = high; X return bufp; } X X /* X * asn_build_unsigned_int64 - builds an ASN object containing a 64 bit integer. X * On entry, datalength is input as the number of valid bytes following X * "data". On exit, it is returned as the number of valid bytes X * following the end of this object. X * X * Returns a pointer to the first byte past the end X * of this object (i.e. the start of the next object). X * Returns NULL on any error. X */ u_char * asn_build_unsigned_int64(data, datalength, type, cp, countersize) X register u_char *data; /* IN - pointer to start of output buffer */ X register int *datalength;/* IN/OUT - number of valid bytes left in buffer */ X u_char type; /* IN - asn type of object */ X struct counter64 *cp; /* IN - pointer to counter struct */ X register int countersize; /* IN - size of *intp */ { /* X * ASN.1 integer ::= 0x02 asnlength byte {byte}* X */ X X register u_long low, high; X register u_long mask, mask2; X int add_null_byte = 0; X int intsize; X X if (countersize != sizeof (struct counter64)) X return NULL; X intsize = 8; X low = cp->low; X high = cp->high; X mask = 0xFF << (8 * (sizeof(long) - 1)); X /* mask is 0xFF000000 on a big-endian machine */ X if ((u_char)((high & mask) >> (8 * (sizeof(long) - 1))) & 0x80){ X /* if MSB is set */ X add_null_byte = 1; X intsize++; X } X /* X * Truncate "unnecessary" bytes off of the most significant end of this 2's X * complement integer. X * There should be no sequence of 9 consecutive 1's or 0's at the most X * significant end of the integer. X */ X mask2 = 0x1FF << ((8 * (sizeof(long) - 1)) - 1); X /* mask2 is 0xFF800000 on a big-endian machine */ X while((((high & mask2) == 0) || ((high & mask2) == mask2)) X && intsize > 1){ X intsize--; X high = (high << 8) X | ((low & mask) >> (8 * (sizeof(long) - 1))); X low <<= 8; X } X data = asn_build_header(data, datalength, type, intsize); X if (data == NULL) X return NULL; X if (*datalength < intsize) X return NULL; X *datalength -= intsize; X if (add_null_byte == 1){ X *data++ = '\0'; X intsize--; X } X while(intsize--){ X *data++ = (u_char)((high & mask) >> (8 * (sizeof(long) - 1))); X high = (high << 8) X | ((low & mask) >> (8 * (sizeof(long) - 1))); X low <<= 8; X X } X return data; } X X SHAR_EOF $shar_touch -am 1015123593 'snmp2/snmplib/asn1.c' && chmod 0644 'snmp2/snmplib/asn1.c' || echo 'restore of snmp2/snmplib/asn1.c failed' shar_count="`wc -c < 'snmp2/snmplib/asn1.c'`" test 30874 -eq "$shar_count" || echo "snmp2/snmplib/asn1.c: original size 30874, current size $shar_count" rm -f _sharnew.tmp fi # ============= snmp2/snmplib/mib.c ============== if test -f 'snmp2/snmplib/mib.c' && test X"$1" != X"-c"; then echo 'x - skipping snmp2/snmplib/mib.c (file already exists)' rm -f _sharnew.tmp else > _sharnew.tmp echo 'x - extracting snmp2/snmplib/mib.c (text)' sed 's/^X//' << 'SHAR_EOF' > 'snmp2/snmplib/mib.c' && /********************************************************************** X Copyright 1988, 1989, 1991, 1992 by Carnegie Mellon University X X All Rights Reserved X Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of CMU not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. X CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ #include #include #include #include X #ifdef VXWORKS #include #else #include #endif X #include "asn1.h" #include "snmp.h" #include "snmp_impl.h" #include "snmp_api.h" #include "parse.h" X static void sprint_by_type(); X static char * uptimeString(timeticks, buf) X register u_long timeticks; X char *buf; { X int seconds, minutes, hours, days; X X timeticks /= 100; X days = timeticks / (60 * 60 * 24); X timeticks %= (60 * 60 * 24); X X hours = timeticks / (60 * 60); X timeticks %= (60 * 60); X X minutes = timeticks / 60; X seconds = timeticks % 60; X X if (days == 0){ X sprintf(buf, "%d:%02d:%02d", hours, minutes, seconds); X } else if (days == 1) { X sprintf(buf, "%d day, %d:%02d:%02d", days, hours, minutes, seconds); X } else { X sprintf(buf, "%d days, %d:%02d:%02d", days, hours, minutes, seconds); X } X return buf; } X static sprint_hexstring(buf, cp, len) X char *buf; X u_char *cp; X int len; { X X for(; len >= 16; len -= 16){ X sprintf(buf, "%02X %02X %02X %02X %02X %02X %02X %02X ", cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); X buf += strlen(buf); X cp += 8; X sprintf(buf, "%02X %02X %02X %02X %02X %02X %02X %02X\n", cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); X buf += strlen(buf); X cp += 8; X } X for(; len > 0; len--){ X sprintf(buf, "%02X ", *cp++); X buf += strlen(buf); X } X *buf = '\0'; } X static sprint_asciistring(buf, cp, len) X char *buf; X u_char *cp; X int len; { X int x; X X for(x = 0; x < len; x++){ X if (isprint(*cp)){ X *buf++ = *cp++; X } else { X *buf++ = '.'; X cp++; X } #if 0 X if ((x % 48) == 47) X *buf++ = '\n'; #endif X } X *buf = '\0'; } X #ifdef UNUSED int read_rawobjid(input, output, out_len) X char *input; X oid *output; X int *out_len; { X char buf[12], *cp; X oid *op = output; X u_long subid; X X while(*input != '\0'){ X if (!isdigit(*input)) X break; X cp = buf; X while(isdigit(*input)) X *cp++ = *input++; X *cp = '\0'; X subid = atoi(buf); X if(subid > MAX_SUBID){ X fprintf(stderr, "sub-identifier too large: %s\n", buf); X return 0; X } X if((*out_len)-- <= 0){ X fprintf(stderr, "object identifier too long\n"); X return 0; X } X *op++ = subid; X if(*input++ != '.') X break; X } X *out_len = op - output; X if (*out_len == 0) X return 0; X return 1; } X #endif /* UNUSED */ X /* X 0 X < 4 X hex X X 0 "" X < 4 hex Hex: oo oo oo X < 4 "fgh" Hex: oo oo oo X > 4 hex Hex: oo oo oo oo oo oo oo oo X > 4 "this is a test" X X */ static void sprint_octet_string(buf, var, enums) X char *buf; X struct variable_list *var; X struct enum_list *enums; { X int hex, x, guessed = 0; X u_char *cp; X X if (var->type != ASN_OCTET_STR){ X sprintf(buf, "Wrong Type (should be OCTET STRING): "); X buf += strlen(buf); X sprint_by_type(buf, var, (struct enum_list *)NULL); X return; X } X hex = 0; X for(cp = var->val.string, x = 0; x < var->val_len; x++, cp++){ X if (!(isprint(*cp) || isspace(*cp))) X hex = 1; X } X if (var->val_len == 0){ X strcpy(buf, "\"\""); X return; X } X if (!hex){ X *buf++ = '"'; X sprint_asciistring(buf, var->val.string, var->val_len); X buf += strlen(buf); X *buf++ = '"'; X *buf = '\0'; X } X if (hex || var->val_len <= 4){ X sprintf(buf, " Hex: "); X buf += strlen(buf); X sprint_hexstring(buf, var->val.string, var->val_len); X } } X static void sprint_opaque(buf, var, enums) X char *buf; X struct variable_list *var; X struct enum_list *enums; { X X if (var->type != OPAQUE){ X sprintf(buf, "Wrong Type (should be Opaque): "); X buf += strlen(buf); X sprint_by_type(buf, var, (struct enum_list *)NULL); X return; X } X sprintf(buf, "OPAQUE: "); X buf += strlen(buf); X sprint_hexstring(buf, var->val.string, var->val_len); } X static void sprint_object_identifier(buf, var, enums) X char *buf; X struct variable_list *var; X struct enum_list *enums; { X if (var->type != ASN_OBJECT_ID){ X sprintf(buf, "Wrong Type (should be OBJECT IDENTIFIER): "); X buf += strlen(buf); X sprint_by_type(buf, var, (struct enum_list *)NULL); X return; X } X sprintf(buf, "OID: "); X buf += strlen(buf); X sprint_objid(buf, (oid *)(var->val.objid), var->val_len / sizeof(oid)); } X static void sprint_timeticks(buf, var, enums) X char *buf; X struct variable_list *var; X struct enum_list *enums; { X char timebuf[32]; X X if (var->type != TIMETICKS){ X sprintf(buf, "Wrong Type (should be Timeticks): "); X buf += strlen(buf); X sprint_by_type(buf, var, (struct enum_list *)NULL); X return; X } X sprintf(buf, "Timeticks: (%d) %s", *(u_long *)(var->val.integer), uptimeString(*(u_long *)(var->val.integer), timebuf)); } X static void sprint_integer(buf, var, enums) X char *buf; X struct variable_list *var; X struct enum_list *enums; { X char *enum_string = NULL; X X if (var->type != ASN_INTEGER){ X sprintf(buf, "Wrong Type (should be INTEGER): "); X buf += strlen(buf); X sprint_by_type(buf, var, (struct enum_list *)NULL); X return; X } X for (; enums; enums = enums->next) X if (enums->value == *var->val.integer){ X enum_string = enums->label; X break; X } X if (enum_string == NULL) X sprintf(buf, "%d", *var->val.integer); X else X sprintf(buf, "%s(%d)", enum_string, *var->val.integer); } X static void sprint_uinteger(buf, var, enums) X char *buf; X struct variable_list *var; X struct enum_list *enums; { X char *enum_string = NULL; X X if (var->type != UINTEGER){ X sprintf(buf, "Wrong Type (should be UInteger32): "); X buf += strlen(buf); X sprint_by_type(buf, var, (struct enum_list *)NULL); X return; X } X for (; enums; enums = enums->next) X if (enums->value == *var->val.integer){ X enum_string = enums->label; X break; X } X if (enum_string == NULL) X sprintf(buf, "%d", *var->val.integer); X else X sprintf(buf, "%s(%d)", enum_string, *var->val.integer); } X static void sprint_gauge(buf, var, enums) X char *buf; X struct variable_list *var; X struct enum_list *enums; { X if (var->type != GAUGE){ X sprintf(buf, "Wrong Type (should be Gauge): "); X buf += strlen(buf); X sprint_by_type(buf, var, (struct enum_list *)NULL); X return; X } X sprintf(buf, "Gauge: %lu", *var->val.integer); } X static void sprint_counter(buf, var, enums) X char *buf; X struct variable_list *var; X struct enum_list *enums; { X if (var->type != COUNTER){ X sprintf(buf, "Wrong Type (should be Counter): "); X buf += strlen(buf); X sprint_by_type(buf, var, (struct enum_list *)NULL); X return; X } X sprintf(buf, "%lu", *var->val.integer); } X static void sprint_networkaddress(buf, var, enums) X char *buf; X struct variable_list *var; X struct enum_list *enums; { X int x, len; X u_char *cp; X X sprintf(buf, "Network Address: "); X buf += strlen(buf); X cp = var->val.string; SHAR_EOF : || echo 'restore of snmp2/snmplib/mib.c failed' fi echo 'End of snmp2 part 1' echo 'File snmp2/snmplib/mib.c is continued in part 2' echo 2 > _sharseq.tmp exit 0