Example #1
0
/*!
 * \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;
}
Example #2
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;
}
Example #3
0
/*!
 * \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;
}