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

📄 usmuser.c

📁 Snmp(简单网管协议)软件包。
💻 C
📖 第 1 页 / 共 3 页
字号:
    }    /* Change the key. */    DEBUGMSGTL(("usmUser","%s: changing auth key for user %s\n", fname, uptr->secName));    if (decode_keychange(uptr->authProtocol, uptr->authProtocolLen,                         uptr->authKey, uptr->authKeyLen,                         var_val, var_val_len,                         buf, &buflen) != SNMPERR_SUCCESS) {      DEBUGMSGTL(("usmUser","%s: ... failed\n", fname));        return SNMP_ERR_GENERR;    }    DEBUGMSGTL(("usmUser","%s: ... succeeded\n", fname));    SNMP_FREE(uptr->authKey);    memdup(&uptr->authKey, buf, buflen);    uptr->authKeyLen = buflen;  }  return SNMP_ERR_NOERROR;} /* end write_usmUserAuthKeyChange() */intwrite_usmUserPrivProtocol(   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 oid objid[USM_LENGTH_OID_MAX];  static oid *optr;  struct usmUser *uptr;  size_t size;  if (var_val_type != ASN_OBJECT_ID){      DEBUGMSGTL(("usmUser","write to usmUserPrivProtocol not ASN_OBJECT_ID\n"));      return SNMP_ERR_WRONGTYPE;  }  if (var_val_len > sizeof(objid)){      DEBUGMSGTL(("usmUser","write to usmUserPrivProtocol: bad length\n"));      return SNMP_ERR_WRONGLENGTH;  }  if (action == COMMIT){      size = var_val_len/sizeof(oid);      memcpy(objid, var_val, var_val_len);      /* don't allow creations here */      if ((uptr = usm_parse_user(name, name_len)) == NULL)        return SNMP_ERR_NOSUCHNAME;      /* check the objid for validity */      /* only allow sets to perform a change to usmNoPrivProtocol */      if (snmp_oid_compare(objid, size, usmNoPrivProtocol,                  sizeof(usmNoPrivProtocol)/sizeof(oid)) != 0)        return SNMP_ERR_INCONSISTENTVALUE;            /* finally, we can do it */      optr = uptr->privProtocol;      if ((uptr->privProtocol = snmp_duplicate_objid(objid, size))          == NULL) {        uptr->privProtocol = optr;        return SNMP_ERR_GENERR;      }      free(optr);      uptr->privProtocolLen = size;  }  return SNMP_ERR_NOERROR;}  /* end write_usmUserPrivProtocol() *//* * Note: This function handles both the usmUserPrivKeyChange and *       usmUserOwnPrivKeyChange 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. * */intwrite_usmUserPrivKeyChange(   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 unsigned char   string[SNMP_MAXBUF_SMALL];  struct usmUser        *uptr;  unsigned char          buf[SNMP_MAXBUF_SMALL];  size_t                 buflen = SNMP_MAXBUF_SMALL;  char                  fnPrivKey[]    = "write_usmUserPrivKeyChange",                        fnOwnPrivKey[] = "write_usmUserOwnPrivKeyChange",                        *fname;    if (name[USM_MIB_LENGTH-1] == 9)    fname = fnPrivKey;  else    fname = fnOwnPrivKey;    if (var_val_type != ASN_OCTET_STR) {    DEBUGMSGTL(("usmUser","write to %s not ASN_OCTET_STR\n", fname));    return SNMP_ERR_WRONGTYPE;  }  if (var_val_len > sizeof(string)) {    DEBUGMSGTL(("usmUser","write to %s: bad length\n", fname));    return SNMP_ERR_WRONGLENGTH;  }  if (action == COMMIT) {    /* don't allow creations here */    if ((uptr = usm_parse_user(name, name_len)) == NULL) {      return SNMP_ERR_NOSUCHNAME;    }    /* Change the key. */    DEBUGMSGTL(("usmUser","%s: changing priv key for user %s\n", fname, uptr->secName));    if (decode_keychange(uptr->authProtocol, uptr->authProtocolLen,                         uptr->privKey, uptr->privKeyLen,                         var_val, var_val_len,                         buf, &buflen) != SNMPERR_SUCCESS) {      DEBUGMSGTL(("usmUser","%s: ... failed\n", fname));        return SNMP_ERR_GENERR;    }    DEBUGMSGTL(("usmUser","%s: ... succeeded\n", fname));    SNMP_FREE(uptr->privKey);    memdup(&uptr->privKey, buf, buflen);    uptr->privKeyLen = buflen;  }  return SNMP_ERR_NOERROR;}  /* end write_usmUserPrivKeyChange() */intwrite_usmUserPublic(   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 unsigned char string[SNMP_MAXBUF];  struct usmUser *uptr;  if (var_val_type != ASN_OCTET_STR){      DEBUGMSGTL(("usmUser","write to usmUserPublic not ASN_OCTET_STR\n"));      return SNMP_ERR_WRONGTYPE;  }  if (var_val_len > sizeof(string)){      DEBUGMSGTL(("usmUser","write to usmUserPublic: bad length\n"));      return SNMP_ERR_WRONGLENGTH;  }  if (action == COMMIT) {    /* don't allow creations here */    if ((uptr = usm_parse_user(name, name_len)) == NULL) {      return SNMP_ERR_NOSUCHNAME;    }    if (uptr->userPublicString)      free(uptr->userPublicString);    uptr->userPublicString = (u_char *) malloc(var_val_len+1);    if (uptr->userPublicString == NULL) {      return SNMP_ERR_GENERR;    }    memcpy(uptr->userPublicString, var_val, var_val_len);    uptr->userPublicString[var_val_len] = 0;    DEBUGMSG(("usmUser", "setting public string: %d - %s\n", var_val_len,              uptr->userPublicString));  }  return SNMP_ERR_NOERROR;}  /* end write_usmUserPublic() */intwrite_usmUserStorageType(   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;  struct usmUser *uptr;    if (var_val_type != ASN_INTEGER){      DEBUGMSGTL(("usmUser","write to usmUserStorageType not ASN_INTEGER\n"));      return SNMP_ERR_WRONGTYPE;  }  if (var_val_len > sizeof(long_ret)){      DEBUGMSGTL(("usmUser","write to usmUserStorageType: bad length\n"));      return SNMP_ERR_WRONGLENGTH;  }  if (action == COMMIT){      /* don't allow creations here */      if ((uptr = usm_parse_user(name, name_len)) == NULL) {        return SNMP_ERR_NOSUCHNAME;      }      long_ret = *((long *) var_val);      if ((long_ret == ST_VOLATILE || long_ret == ST_NONVOLATILE) &&          (uptr->userStorageType == ST_VOLATILE ||           uptr->userStorageType == ST_NONVOLATILE))        uptr->userStorageType = long_ret;      else        return SNMP_ERR_INCONSISTENTVALUE;  }  return SNMP_ERR_NOERROR;}  /* end write_usmUserStorageType() *//*******************************************************************-o-****** * write_usmUserStatus * * Parameters: *	 action *	*var_val *	 var_val_type *	 var_val_len *	*statP *	*name *	 name_len *       * Returns: *	SNMP_ERR_NOERROR		On success. *	SNMP_ERR_GENERR	 *	SNMP_ERR_INCONSISTENTNAME *	SNMP_ERR_INCONSISTENTVALUE *	SNMP_ERR_WRONGLENGTH *	SNMP_ERR_WRONGTYPE */intwrite_usmUserStatus(   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;  unsigned char *engineID;  size_t engineIDLen;  char *newName;  size_t nameLen;  struct usmUser *uptr;  if (var_val_type != ASN_INTEGER){      DEBUGMSGTL(("usmUser","write to usmUserStatus not ASN_INTEGER\n"));      return SNMP_ERR_WRONGTYPE;  }  if (var_val_len > sizeof(long_ret)){      DEBUGMSGTL(("usmUser","write to usmUserStatus: bad length\n"));      return SNMP_ERR_WRONGLENGTH;  }  if (action == COMMIT){    long_ret = *((long *) var_val);    /* ditch illegal values now */    /* notReady can not be used, but the return error code is not mentioned */    if (long_ret == RS_NOTREADY || long_ret < 1 || long_ret > 6)      return SNMP_ERR_INCONSISTENTVALUE;        /* see if we can parse the oid for engineID/name first */    if (usm_parse_oid(&name[USM_MIB_LENGTH], name_len-USM_MIB_LENGTH,                      &engineID, &engineIDLen, (u_char **)&newName, &nameLen))      return SNMP_ERR_INCONSISTENTNAME;    /* Now see if a user already exists with these index values */    uptr = usm_get_user(engineID, engineIDLen, newName);    if (uptr) {			/* If so, we set the appropriate value... */      free(engineID);      free(newName);      if (long_ret == RS_CREATEANDGO || long_ret == RS_CREATEANDWAIT) {        return SNMP_ERR_INCONSISTENTVALUE;      }      if (long_ret == RS_DESTROY) {        usm_remove_user(uptr);        usm_free_user(uptr);      } else {        uptr->userStatus = long_ret;      }    } else {			/* ...else we create a new user */      /* check for a valid status column set */      if (long_ret == RS_ACTIVE || long_ret == RS_NOTINSERVICE) {        free(engineID);        free(newName);        return SNMP_ERR_INCONSISTENTVALUE;      }      if (long_ret == RS_DESTROY) {        /* destroying a non-existent row is actually legal */        free(engineID);        free(newName);        return SNMP_ERR_NOERROR;      }      /* generate a new user */      if ((uptr = usm_create_user()) == NULL) {        free(engineID);        free(newName);        return SNMP_ERR_GENERR;      }      /* copy in the engineID */      uptr->engineID =        (unsigned char *) malloc(engineIDLen);      if (uptr->engineID == NULL) {        free(engineID);        free(newName);        usm_free_user(uptr);        return SNMP_ERR_GENERR;      }      uptr->engineIDLen = engineIDLen;      memcpy(uptr->engineID, engineID, engineIDLen);      free(engineID);      /* copy in the name and secname */      if ((uptr->name = strdup(newName)) == NULL) {        free(newName);        usm_free_user(uptr);        return SNMP_ERR_GENERR;      }      free(newName);      if ((uptr->secName = strdup(uptr->name)) == NULL) {        usm_free_user(uptr);        return SNMP_ERR_GENERR;      }      /* set the status of the row based on the request */      if (long_ret == RS_CREATEANDGO)        uptr->userStatus = RS_ACTIVE;      else if (long_ret == RS_CREATEANDWAIT)        uptr->userStatus = RS_NOTINSERVICE;      /* finally, add it to our list of users */      usm_add_user(uptr);    }  /* endif -- uptr */  }  /* endif -- action==COMMIT */  return SNMP_ERR_NOERROR;}  /* end write_usmUserStatus() */

⌨️ 快捷键说明

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