|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 11517 (0x2cfd) Types: TextFile Names: »mib.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« └─⟦de7628f85⟧ └─⟦this⟧ »isode-6.0/snmp/mib.c«
/* mib.c - MIB realization */ #ifndef lint static char *rcsid = "$Header: /f/osi/snmp/RCS/mib.c,v 7.1 90/01/11 18:34:14 mrose Exp $"; #endif /* * $Header: /f/osi/snmp/RCS/mib.c,v 7.1 90/01/11 18:34:14 mrose Exp $ * * Contributed by NYSERNet Inc. This work was partially supported by the * U.S. Defense Advanced Research Projects Agency and the Rome Air Development * Center of the U.S. Air Force Systems Command under contract number * F30602-88-C-0016. * * * $Log: mib.c,v $ * Revision 7.1 90/01/11 18:34:14 mrose * real-sync * * Revision 7.0 89/11/23 22:23:12 mrose * Release 6.0 * */ /* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */ #include <stdio.h> #include "mib.h" #ifdef BSD42 #include <sys/file.h> #endif #ifdef SYS5 #include <fcntl.h> #endif /* \f DATA */ static int kd; struct nlist nl[] = { { "_arptab" }, { "_arptab_size" }, { "_boottime" }, { "_icmpstat" }, { "_ifnet" }, { "_ipforwarding" }, { "_ipstat" }, { "_rthashsize" }, { "_rthost" }, { "_rtnet" }, { "_tcb" }, { "_tcpstat" }, { "_udb" }, { "_udpstat" }, { "_mbstat" }, #ifdef BSD44 { "_radix_node_head" }, { "_iso_systype" }, { "_clnp_stat" }, { "_iso_snpac_size" }, { "_iso_snpac" }, { "_esis_stat" }, #endif NULL }; /* \f */ readmib () { register struct nlist *nz; if (nlist ("/vmunix", nl) == NOTOK) adios ("/vmunix", "unable to nlist"); for (nz = nl; nz -> n_name; nz++) if (nz -> n_value == 0) advise (LLOG_EXCEPTIONS, NULLCP, "\"%s\" not in /vmunix (warning)", nz -> n_name); if ((kd = open ("/dev/kmem", O_RDONLY)) == NOTOK) adios ("/vmunix", "unable to read"); init_system (); /* Internet-standard MIB */ init_interfaces (); init_ip (); init_icmp (); init_tcp (); init_udp (); init_clnp (); /* experimental CLNP group */ init_unix (); /* UNIX-specific enterprise */ } /* \f */ checkmib () { register OT ot; init_snmp (); for (ot = text2obj ("iso"); ot; ot = ot -> ot_next) if (ot -> ot_status == OT_MANDATORY && ot -> ot_getfnx == o_generic && ot -> ot_info == NULL) advise (LLOG_EXCEPTIONS, NULLCP, "variable \"%s.0\" has no value (warning)", ot -> ot_text); } /* \f */ static init_snmp () { register OT ot; if (ot = text2obj ("snmpInPkts")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_inpkts; if (ot = text2obj ("snmpOutPkts")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_outpkts; if (ot = text2obj ("snmpInBadVersions")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_badversions; if (ot = text2obj ("snmpInBadCommunityNames")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_badcommunitynames; if (ot = text2obj ("snmpInBadCommunityUses")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_badcommunityuses; if (ot = text2obj ("snmpInASNParseErrs")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_asnparseerrs; if (ot = text2obj ("snmpInBadTypes")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_badtypes; if (ot = text2obj ("snmpInTotalReqVars")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_totalreqvars; if (ot = text2obj ("snmpInTotalSetVars")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_totalsetvars; if (ot = text2obj ("snmpInGetRequests")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_ingetrequests; if (ot = text2obj ("snmpInGetNexts")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_ingetnexts; if (ot = text2obj ("snmpInSetRequests")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_insetrequests; if (ot = text2obj ("snmpOutTooBigs")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_toobigs; if (ot = text2obj ("snmpOutNoSuchNames")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_nosuchnames; if (ot = text2obj ("snmpOutBadValues")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_badvalues; if (ot = text2obj ("snmpOutReadOnlys")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_readonlys; if (ot = text2obj ("snmpOutGenErrs")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_generrs; if (ot = text2obj ("snmpOutGetResponses")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_outgetresponses; if (ot = text2obj ("snmpOutTraps")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_outtraps; if (ot = text2obj ("snmpEnableAuthTraps")) ot -> ot_getfnx = o_generic, ot -> ot_info = (caddr_t) &snmpstat.s_enableauthtraps; } /* \f */ set_variable (name, newvalue) char *name, *newvalue; { caddr_t value; register OT ot = text2obj (name); register OS os; if (ot == NULLOT) { advise (LLOG_EXCEPTIONS, NULLCP, "unknown object \"%s\"", name); return; } if (ot -> ot_getfnx == NULLIFP) { advise (LLOG_EXCEPTIONS, NULLCP, "no getfnx for object \"%s\"", ot -> ot_text); return; } if (ot -> ot_getfnx != o_generic) { advise (LLOG_EXCEPTIONS, NULLCP, "non-generic getfnx for object \"%s\"", ot -> ot_text); return; } if ((os = ot -> ot_syntax) == NULLOS) { advise (LLOG_EXCEPTIONS, NULLCP, "no syntax defined for object \"%s\"", ot -> ot_text); return; } if ((*os -> os_parse) (&value, newvalue) == NOTOK) { advise (LLOG_EXCEPTIONS, NULLCP, "invalid value for variable \"%s.0\": \"%s\"", ot -> ot_text, newvalue); return; } if (ot -> ot_info) { (*os -> os_free) (ot -> ot_info); ot -> ot_info = NULL; } ot -> ot_info = value; } /* \f */ int getkmem (n, buffer, cc) struct nlist *n; caddr_t buffer; int cc; { if (n -> n_value == 0) { advise (LLOG_EXCEPTIONS, NULLCP, "\"%s\" not in /vmunix", n -> n_name); return NOTOK; } if (lseek (kd, (long) n -> n_value, L_SET) == NOTOK) { advise (LLOG_EXCEPTIONS, "failed", "lseek of 0x%x for \"%s\" in kmem", (long) n -> n_value, n -> n_name); return NOTOK; } if (read (kd, buffer, cc) != cc) { advise (LLOG_EXCEPTIONS, "failed", "read of \"%s\" from kmem", n -> n_name); return NOTOK; } return OK; } /* \f */ int o_generic (oi, v, offset) OI oi; register struct type_SNMP_VarBind *v; int offset; { register OID oid = oi -> oi_name; register OT ot = oi -> oi_type; register OS os = ot -> ot_syntax; switch (offset) { case type_SNMP_PDUs_get__request: if (oid -> oid_nelem != ot -> ot_name -> oid_nelem + 1 || oid -> oid_elements[oid -> oid_nelem - 1] != 0) return int_SNMP_error__status_noSuchName; break; case type_SNMP_PDUs_get__next__request: if (oid -> oid_nelem > ot -> ot_name -> oid_nelem + 1) return int_SNMP_error__status_noSuchName; if (oid -> oid_nelem == ot -> ot_name -> oid_nelem) { OID new; if ((new = oid_extend (oid, 1)) == NULLOID) return int_SNMP_error__status_genErr; new -> oid_elements[new -> oid_nelem - 1] = 0; if (v -> name) free_SNMP_ObjectName (v -> name); v -> name = new; } else return NOTOK; break; default: return int_SNMP_error__status_genErr; } if (os == NULLOS) { advise (LLOG_EXCEPTIONS, NULLCP, "no syntax defined for object \"%s\"", ot -> ot_text); return (offset == type_SNMP_PDUs_get__next__request ? NOTOK : int_SNMP_error__status_genErr); } if (ot -> ot_info == NULL) { advise (LLOG_EXCEPTIONS, NULLCP, "no value defined for object \"%s\"", ot -> ot_text); return (offset == type_SNMP_PDUs_get__next__request ? NOTOK : int_SNMP_error__status_noSuchName); } if (v -> value) free_SNMP_ObjectSyntax (v -> value), v -> value = NULL; if ((*os -> os_encode) (ot -> ot_info, &v -> value) == NOTOK) { advise (LLOG_EXCEPTIONS, NULLCP, "encoding error for variable \"%s\"", oid2ode (oi -> oi_name)); return int_SNMP_error__status_genErr; } return int_SNMP_error__status_noError; } /* \f */ int o_number (oi, v, number) OI oi; register struct type_SNMP_VarBind *v; integer number; { int result; caddr_t value; register OT ot = oi -> oi_type; register OS os = ot -> ot_syntax; if (os == NULLOS) { advise (LLOG_EXCEPTIONS, NULLCP, "no syntax defined for object \"%s\"", ot -> ot_text); return int_SNMP_error__status_genErr; } if ((value = (caddr_t) malloc (sizeof (integer))) == NULL) adios (NULLCP, "out of memory"); *((integer *) value) = number; if (v -> value) free_SNMP_ObjectSyntax (v -> value), v -> value = NULL; result = (*os -> os_encode) (value, &v -> value); free ((char *) value); if (result == NOTOK) { advise (LLOG_EXCEPTIONS, NULLCP, "encoding error for variable \"%s\"", oid2ode (oi -> oi_name)); return int_SNMP_error__status_genErr; } return int_SNMP_error__status_noError; } /* \f */ int o_string (oi, v, base, len) OI oi; register struct type_SNMP_VarBind *v; char *base; int len; { int result; struct qbuf *value; register OT ot = oi -> oi_type; register OS os = ot -> ot_syntax; if (os == NULLOS) { advise (LLOG_EXCEPTIONS, NULLCP, "no syntax defined for object \"%s\"", ot -> ot_text); return int_SNMP_error__status_genErr; } if ((value = str2qb (base, len, 1)) == NULL) adios (NULLCP, "out of memory"); if (v -> value) free_SNMP_ObjectSyntax (v -> value), v -> value = NULL; result = (*os -> os_encode) (value, &v -> value); if (result == NOTOK) { advise (LLOG_EXCEPTIONS, NULLCP, "encoding error for variable \"%s\"", oid2ode (oi -> oi_name)); return int_SNMP_error__status_genErr; } return int_SNMP_error__status_noError; } /* \f */ int o_specific (oi, v, value) OI oi; register struct type_SNMP_VarBind *v; caddr_t value; { int result; register OT ot = oi -> oi_type; register OS os = ot -> ot_syntax; if (os == NULLOS) { advise (LLOG_EXCEPTIONS, NULLCP, "no syntax defined for object \"%s\"", ot -> ot_text); return int_SNMP_error__status_genErr; } if (v -> value) free_SNMP_ObjectSyntax (v -> value), v -> value = NULL; result = (*os -> os_encode) (value, &v -> value); if (result == NOTOK) { advise (LLOG_EXCEPTIONS, NULLCP, "encoding error for variable \"%s\"", oid2ode (oi -> oi_name)); return int_SNMP_error__status_genErr; } return int_SNMP_error__status_noError; } /* \f */ OID oid_extend (q, howmuch) register OID q; int howmuch; { register unsigned int i, *ip, *jp; OID oid; if (q == NULLOID) return NULLOID; if ((i = q -> oid_nelem) < 1) return NULLOID; if ((oid = (OID) malloc (sizeof *oid)) == NULLOID) return NULLOID; if ((ip = (unsigned int *) calloc ((unsigned) (i + howmuch + 1), sizeof *ip)) == NULL) { free ((char *) oid); return NULLOID; } oid -> oid_elements = ip, oid -> oid_nelem = i + howmuch; for (i = 0, jp = q -> oid_elements; i < oid -> oid_nelem; i++, jp++) *ip++ = *jp; return oid; }