⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usmuser.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
📖 第 1 页 / 共 4 页
字号:
        }        return NULL;    case USMUSERCLONEFROM:        *write_method = write_usmUserCloneFrom;        if (uptr) {            objid[0] = 0;       /* "When this object is read, the ZeroDotZero OID */            objid[1] = 0;       /*  is returned." */            *var_len = sizeof(oid) * 2;            return (unsigned char *) objid;        }        return NULL;    case USMUSERAUTHPROTOCOL:        *write_method = write_usmUserAuthProtocol;        if (uptr) {            *var_len = uptr->authProtocolLen * sizeof(oid);            return (u_char *) uptr->authProtocol;        }        return NULL;    case USMUSERAUTHKEYCHANGE:    case USMUSEROWNAUTHKEYCHANGE:        /*         * we treat these the same, and let the calling module         * distinguish between them          */        *write_method = write_usmUserAuthKeyChange;        if (uptr) {            *string = 0;        /* always return a NULL string */            *var_len = 0;            return string;        }        return NULL;    case USMUSERPRIVPROTOCOL:        *write_method = write_usmUserPrivProtocol;        if (uptr) {            *var_len = uptr->privProtocolLen * sizeof(oid);            return (u_char *) uptr->privProtocol;        }        return NULL;    case USMUSERPRIVKEYCHANGE:    case USMUSEROWNPRIVKEYCHANGE:        /*         * we treat these the same, and let the calling module         * distinguish between them          */        *write_method = write_usmUserPrivKeyChange;        if (uptr) {            *string = 0;        /* always return a NULL string */            *var_len = 0;            return string;        }        return NULL;    case USMUSERPUBLIC:        *write_method = write_usmUserPublic;        if (uptr) {            if (uptr->userPublicString) {                *var_len = strlen((char *) uptr->userPublicString);                return uptr->userPublicString;            }            *string = 0;            *var_len = 0;       /* return an empty string if the public                                 * string hasn't been defined yet */            return string;        }        return NULL;    case USMUSERSTORAGETYPE:        *write_method = write_usmUserStorageType;        if (uptr) {            long_ret = uptr->userStorageType;            return (unsigned char *) &long_ret;        }        return NULL;    case USMUSERSTATUS:        *write_method = write_usmUserStatus;        if (uptr) {            long_ret = uptr->userStatus;            return (unsigned char *) &long_ret;        }        return NULL;    default:        DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_usmUser\n",                    vp->magic));    }    return 0;}                               /* end var_usmUser() *//* * write_usmUserSpinLock(): called when a set is performed on the * usmUserSpinLock object  */intwrite_usmUserSpinLock(int action,                      u_char * var_val,                      u_char var_val_type,                      size_t var_val_len,                      u_char * statP, oid * name, size_t name_len){    /*     * variables we may use later      */    static long     long_ret;    if (var_val_type != ASN_INTEGER) {        DEBUGMSGTL(("usmUser",                    "write to usmUserSpinLock not ASN_INTEGER\n"));        return SNMP_ERR_WRONGTYPE;    }    if (var_val_len > sizeof(long_ret)) {        DEBUGMSGTL(("usmUser", "write to usmUserSpinLock: bad length\n"));        return SNMP_ERR_WRONGLENGTH;    }    long_ret = *((long *) var_val);    if (long_ret != (long) usmUserSpinLock)        return SNMP_ERR_INCONSISTENTVALUE;    if (action == COMMIT) {        if (usmUserSpinLock == 2147483647)            usmUserSpinLock = 0;        else            usmUserSpinLock++;    }    return SNMP_ERR_NOERROR;}                               /* end write_usmUserSpinLock() *//*******************************************************************-o-****** * write_usmUserCloneFrom * * Parameters: *	 action *	*var_val *	 var_val_type *	 var_val_len *	*statP		(UNUSED) *	*name		OID of user to clone from. *	 name_len *       * Returns: *	SNMP_ERR_NOERROR		On success  -OR-  If user exists *					  and has already been cloned. *	SNMP_ERR_GENERR			Local function call failures. *	SNMP_ERR_INCONSISTENTNAME	'name' does not exist in user list *					  -OR-  user to clone from != RS_ACTIVE. *	SNMP_ERR_WRONGLENGTH		OID length > than local buffer size. *	SNMP_ERR_WRONGTYPE		ASN_OBJECT_ID is wrong. * * * XXX:  should handle action=UNDO's. */intwrite_usmUserCloneFrom(int action,                       u_char * var_val,                       u_char var_val_type,                       size_t var_val_len,                       u_char * statP, oid * name, size_t name_len){    struct usmUser *uptr, *cloneFrom;    if (action == RESERVE1) {        if (var_val_type != ASN_OBJECT_ID) {            DEBUGMSGTL(("usmUser",                        "write to usmUserCloneFrom not ASN_OBJECT_ID\n"));            return SNMP_ERR_WRONGTYPE;        }        if (var_val_len > USM_LENGTH_OID_MAX * sizeof(oid) ||            var_val_len % sizeof(oid) != 0) {            DEBUGMSGTL(("usmUser",                        "write to usmUserCloneFrom: bad length\n"));            return SNMP_ERR_WRONGLENGTH;        }    } else if (action == RESERVE2) {        if ((uptr = usm_parse_user(name, name_len)) == NULL) {            /*             * We don't allow creations here.               */            return SNMP_ERR_INCONSISTENTNAME;        }        /*         * Has the user already been cloned?  If so, writes to this variable         * are defined to have no effect and to produce no error.           */        if (uptr->cloneFrom != NULL) {            return SNMP_ERR_NOERROR;        }        cloneFrom =            usm_parse_user((oid *) var_val, var_val_len / sizeof(oid));        if (cloneFrom == NULL || cloneFrom->userStatus != SNMP_ROW_ACTIVE) {            return SNMP_ERR_INCONSISTENTNAME;        }        uptr->cloneFrom = snmp_duplicate_objid((oid *) var_val,                                               var_val_len / sizeof(oid));        usm_cloneFrom_user(cloneFrom, uptr);        if (usmStatusCheck(uptr) && uptr->userStatus == SNMP_ROW_NOTREADY) {            uptr->userStatus = SNMP_ROW_NOTINSERVICE;        }    }    return SNMP_ERR_NOERROR;}/*******************************************************************-o-****** * write_usmUserAuthProtocol * * Parameters: *	 action *	*var_val	OID of auth transform to set. *	 var_val_type *	 var_val_len *	*statP *	*name		OID of user upon which to perform set operation. *	 name_len *       * Returns: *	SNMP_ERR_NOERROR		On success. *	SNMP_ERR_GENERR *	SNMP_ERR_INCONSISTENTVALUE *	SNMP_ERR_NOSUCHNAME *	SNMP_ERR_WRONGLENGTH *	SNMP_ERR_WRONGTYPE */intwrite_usmUserAuthProtocol(int action,                          u_char * var_val,                          u_char var_val_type,                          size_t var_val_len,                          u_char * statP, oid * name, size_t name_len){    static oid     *optr;    static size_t   olen;    static int      resetOnFail;    struct usmUser *uptr;    if (action == RESERVE1) {        resetOnFail = 0;        if (var_val_type != ASN_OBJECT_ID) {            DEBUGMSGTL(("usmUser",                        "write to usmUserAuthProtocol not ASN_OBJECT_ID\n"));            return SNMP_ERR_WRONGTYPE;        }        if (var_val_len > USM_LENGTH_OID_MAX * sizeof(oid) ||            var_val_len % sizeof(oid) != 0) {            DEBUGMSGTL(("usmUser",                        "write to usmUserAuthProtocol: bad length\n"));            return SNMP_ERR_WRONGLENGTH;        }    } else if (action == RESERVE2) {        if ((uptr = usm_parse_user(name, name_len)) == NULL) {            return SNMP_ERR_INCONSISTENTNAME;        }        if (uptr->userStatus == RS_ACTIVE            || uptr->userStatus == RS_NOTREADY            || uptr->userStatus == RS_NOTINSERVICE) {            /*             * The authProtocol is already set.  It is only legal to CHANGE it             * to usmNoAuthProtocol...               */            if (snmp_oid_compare                ((oid *) var_val, var_val_len / sizeof(oid),                 usmNoAuthProtocol,                 sizeof(usmNoAuthProtocol) / sizeof(oid)) == 0) {                /*                 * ... and then only if the privProtocol is equal to                 * usmNoPrivProtocol.                   */                if (snmp_oid_compare                    (uptr->privProtocol, uptr->privProtocolLen,                     usmNoPrivProtocol,                     sizeof(usmNoPrivProtocol) / sizeof(oid)) != 0) {                    return SNMP_ERR_INCONSISTENTVALUE;                }                optr = uptr->authProtocol;                olen = uptr->authProtocolLen;                resetOnFail = 1;                uptr->authProtocol = snmp_duplicate_objid((oid *) var_val,                                                          var_val_len /                                                          sizeof(oid));                if (uptr->authProtocol == NULL) {                    return SNMP_ERR_RESOURCEUNAVAILABLE;                }                uptr->authProtocolLen = var_val_len / sizeof(oid);            } else                if (snmp_oid_compare                    ((oid *) var_val, var_val_len / sizeof(oid),                     uptr->authProtocol, uptr->authProtocolLen) == 0) {                /*                 * But it's also okay to set it to the same thing as it                 * currently is.                   */                return SNMP_ERR_NOERROR;            } else {                return SNMP_ERR_INCONSISTENTVALUE;            }        } else {            /*             * This row is under creation.  It's okay to set             * usmUserAuthProtocol to any valid authProtocol but it will be             * overwritten when usmUserCloneFrom is set (so don't write it if             * that has already been set).               */            if (snmp_oid_compare                ((oid *) var_val, var_val_len / sizeof(oid),                 usmNoAuthProtocol,                 sizeof(usmNoAuthProtocol) / sizeof(oid)) == 0#ifndef DISABLE_MD5                || snmp_oid_compare((oid *) var_val,                                    var_val_len / sizeof(oid),                                    usmHMACMD5AuthProtocol,                                    sizeof(usmHMACMD5AuthProtocol) /                                    sizeof(oid)) == 0#endif                || snmp_oid_compare((oid *) var_val,                                    var_val_len / sizeof(oid),                                    usmHMACSHA1AuthProtocol,                                    sizeof(usmHMACSHA1AuthProtocol) /                                    sizeof(oid)) == 0) {                if (uptr->cloneFrom != NULL) {                    optr = uptr->authProtocol;                    olen = uptr->authProtocolLen;                    resetOnFail = 1;                    uptr->authProtocol =                        snmp_duplicate_objid((oid *) var_val,                                             var_val_len / sizeof(oid));                    if (uptr->authProtocol == NULL) {                        return SNMP_ERR_RESOURCEUNAVAILABLE;                    }                    uptr->authProtocolLen = var_val_len / sizeof(oid);                }            } else {                /*                 * Unknown authentication protocol.                   */                return SNMP_ERR_WRONGVALUE;            }        }    } else if (action == COMMIT) {        SNMP_FREE(optr);        optr = NULL;    } else if (action == FREE || action == UNDO) {        if ((uptr = usm_parse_user(name, name_len)) != NULL) {            if (resetOnFail) {                SNMP_FREE(uptr->authProtocol);                uptr->authProtocol = optr;                uptr->authProtocolLen = olen;            }        }    }    return SNMP_ERR_NOERROR;}                               /* end write_usmUserAuthProtocol() *//*******************************************************************-o-****** * write_usmUserAuthKeyChange * * Parameters: *	 action		 *	*var_val	Octet string representing new KeyChange value. *	 var_val_type *	 var_val_len *	*statP		(UNUSED) *	*name		OID of user upon which to perform set operation. *	 name_len *       * Returns: *	SNMP_ERR_NOERR		Success. *	SNMP_ERR_WRONGTYPE	 *	SNMP_ERR_WRONGLENGTH	 *	SNMP_ERR_NOSUCHNAME	 *	SNMP_ERR_GENERR * * Note: This function handles both the usmUserAuthKeyChange and *       usmUserOwnAuthKeyChange objects.  We are not passed the name *       of the user requseting the keychange, so we leave this to the *       calling module to verify when and if we should be called.  To *       change this would require a change in the mib module API to *       pass in the securityName requesting the change. * * XXX:  should handle action=UNDO's. */intwrite_usmUserAuthKeyChange(int action,                           u_char * var_val,                           u_char var_val_type,                           size_t var_val_len,                           u_char * statP, oid * name, size_t name_len){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -