/*! * \brief Register MIB variables. */ int SnmpMibRegister(OID basename[], size_t baselen, SNMPVAR * vars, int num) { SUBTREE **tpp; SUBTREE *branch; /* Create a new branch. */ if ((branch = malloc(sizeof(SUBTREE))) == NULL) { return -1; } branch->sub_numvars = num; branch->sub_vars = vars; branch->sub_namelen = baselen; memcpy(branch->sub_name, basename, baselen * sizeof(OID)); /* Locate the new branch's insertion point. */ for (tpp = &mibtree; *tpp; tpp = &(*tpp)->sub_next) { if (SnmpOidCmp((*tpp)->sub_name, (*tpp)->sub_namelen, branch->sub_name, branch->sub_namelen) > 0) { break; } } /* Insert the branch. */ branch->sub_next = *tpp; *tpp = branch; return 0; }
static u_char *MibVarsIfGet(CONST SNMPVAR * vp, OID * name, size_t * namelen, int exact, size_t * varlen, WMETHOD ** wmethod) { int rc; int ifc = 0; OID index = 0; static long zero = 0; OID *fullname; size_t fullnamelen = base_oidlen + vp->var_namelen + 1; fullname = malloc(fullnamelen * sizeof(OID)); memcpy(fullname, base_oid, base_oidlen * sizeof(OID)); memcpy(fullname + base_oidlen, vp->var_name, vp->var_namelen * sizeof(OID)); if (vp->var_magic == MAG_IF_NUMBER) { /* Determine the number of interfaces. */ *(fullname + fullnamelen - 1) = index; rc = SnmpOidCmp(name, *namelen, fullname, fullnamelen); if ((exact && rc) || (!exact && rc >= 0)) { return NULL; } } else { /* Determine the interface number. */ for (; ifc < if_number; ifc++) { *(fullname + fullnamelen - 1) = ifc + 1; rc = SnmpOidCmp(name, *namelen, fullname, fullnamelen); if ((exact && rc == 0) || (!exact && rc < 0)) { index = ifc + 1; break; } } if (index == 0) { return NULL; } } memcpy(name, fullname, fullnamelen * sizeof(OID)); *namelen = fullnamelen; *wmethod = NULL; *varlen = sizeof(long); switch (vp->var_magic) { case MAG_IF_NUMBER: return (u_char *) & if_number; case MAG_IF_INDEX: return (u_char *) & if_index; case MAG_IF_DESCR: *varlen = strlen(if_descr); return (u_char *) if_descr; case MAG_IF_TYPE: return (u_char *) & if_type; case MAG_IF_MTU: return (u_char *) & if_mtu; case MAG_IF_SPEED: return (u_char *) & if_speed; case MAG_IF_PHYSADDRESS: *varlen = 6; return confnet.cdn_mac; case MAG_IF_ADMINSTATUS: case MAG_IF_OPERSTATUS: *wmethod = MibVarsIfSet; return (u_char *) & if_admin_status[ifc]; case MAG_IF_LASTCHANGE: case MAG_IF_INOCTETS: case MAG_IF_INUCASTPKTS: case MAG_IF_INNUCASTPKTS: case MAG_IF_INDISCARDS: case MAG_IF_INERRORS: case MAG_IF_INUNKNOWNPROTOS: case MAG_IF_OUTOCTETS: case MAG_IF_OUTUCASTPKTS: case MAG_IF_OUTNUCASTPKTS: case MAG_IF_OUTDISCARDS: case MAG_IF_OUTERRORS: case MAG_IF_OUTQLEN: return (u_char *) & zero; case MAG_IF_SPECIFIC: *varlen = sizeof(if_specific); return (u_char *) if_specific; } return NULL; }
/*! * \brief Access the specified MIB variable. * * \param vp * \param name Contains the name to look for, either exact or one that * is in front. On return the exact name is stored here. * \param namelen Number of sub identifiers in the name upon entry. On * return the length of the exact name is stored here. * \param exact If not zero, the name must match exactly. Otherwise we * want the first name that is following the given one. * \param varlen Size of the variable. */ static uint8_t *MibVarsSysGet(CONST SNMPVAR * vp, OID * name, size_t * namelen, int exact, size_t * varlen, WMETHOD ** wmethod) { static uint8_t empty[1]; int rc; OID *fullname; size_t fullnamelen = base_oidlen + vp->var_namelen + 1; fullname = malloc(fullnamelen * sizeof(OID)); memcpy(fullname, base_oid, base_oidlen * sizeof(OID)); memcpy(fullname + base_oidlen, vp->var_name, vp->var_namelen * sizeof(OID)); *(fullname + fullnamelen - 1) = 0; rc = SnmpOidCmp(name, *namelen, fullname, fullnamelen); if ((exact && rc) || (!exact && rc >= 0)) { free(fullname); return NULL; } memcpy(name, fullname, fullnamelen * sizeof(OID)); free(fullname); *namelen = fullnamelen; *wmethod = NULL; *varlen = sizeof(long); switch (vp->var_magic) { case MAG_SYS_DESCR: *varlen = strlen(sys_descr); return (uint8_t *) sys_descr; case MAG_SYS_OID: *varlen = sizeof(sys_oid); return (uint8_t *) sys_oid; case MAG_SYS_UPTIME: sys_uptime = time(NULL) - sys_starttime; sys_uptime *= 100; return (uint8_t *) & sys_uptime; case MAG_SYS_CONTACT: *wmethod = MibVarsSysSet; if (sys_contact) { *varlen = strlen(sys_contact); return (uint8_t *) sys_contact; } *varlen = 0; return empty; case MAG_SYS_NAME: *wmethod = MibVarsSysSet; if (sys_name) { *varlen = strlen(sys_name); return (uint8_t *) sys_name; } *varlen = 0; return empty; case MAG_SYS_LOCATION: *wmethod = MibVarsSysSet; if (sys_location) { *varlen = strlen(sys_location); return (uint8_t *) sys_location; } *varlen = 0; return empty; case MAG_SYS_SERVICES: return (uint8_t *) & sys_services; } return NULL; }